知识图谱提供了一种强大的方式来表示信息。它们由实体(节点)及其之间的关系(边)构成,使得信息的连接比单纯的非结构化文本更容易理解。
传统上,从原始文本构建知识图谱并不容易。它需要识别实体及其关系、手动编码的提取规则或专门的机器学习模型。然而,大语言模型(LLMs)非常灵活,可以用于这个目的。LLMs可以读取自由格式的文本并输出结构化的信息,因此,正如本文所示,我们可以将它们作为自动化管道的一部分,创建知识图谱。
本文将探讨我创建的一个学习项目,目标是创建一个由LLM驱动的管道,它可以接收非结构化文本并将其转化为一个互动知识图谱网页。该项目的所有代码都存储在AI-Knowledge-Graph[1]项目库中。
简单示例
以下是该项目执行的一个简单示例。当提供以下非结构化文本作为输入时:
文本输入:
Henry,来自加拿大的才华横溢的音乐家,最初在著名指挥家Maria Rodriguez的指导下接受了古典钢琴训练。后来,Henry与他的妹妹Lucy组成了一个名为The Maple Leaves的摇滚乐队,Lucy曾在多伦多大学学习音乐作曲。The Maple Leaves在2020年8月12日发行了他们的首张专辑《Polar Lights》,因其将古典与摇滚的元素相融合而获得了好评。Lucy还积极参与环保活动,并加入了Clean Earth,担任区域大使,提倡更严格的野生动物保护法律。Henry受到Lucy慈善事业热情的启发,因此开始在家乡的动物收容所做志愿者。尽管Henry和Lucy最初在创意上存在分歧,但他们最终找到了结合Lucy的古典作曲与Henry的摇滚吉他节奏的和谐方式。The Maple Leaves于2021年在欧洲巡演,在巴黎、柏林和罗马等大城市举办了满座的演出。在巡演期间,Henry对国际美食产生了浓厚的兴趣,并与当地厨师合作拍摄了一部关于地区烹饪技巧的短片。
ai-knowledge-graph 工具将使用您选择配置的LLM来从上述文本中提取知识,并生成一个HTML格式的知识图谱,输出的结果类似于以下图片所示:
高级工作原理描述
1.文本切块 :自动将大型文档拆分成可管理的小块进行处理。2.知识提取 :LLM随后会识别并提取每个块中的主题-谓词-宾语三元组(事实)。3.实体标准化 :相同实体的不同提及(例如,“AI”和“人工智能”)会统一为单一名称。4.关系推断 :通过简单的逻辑规则(例如,传递性)和LLM推理推断出额外的关系,以连接断开的子图。5.互动可视化 :生成的图谱作为一个互动网络在浏览器中显示。
详细工作原理
文本切块
LLMs有一个上下文窗口限制(本地系统也有内存限制)。为了处理大型文档,该工具会自动将文本拆分成多个块(例如,每块500个单词,且有部分重叠)。重叠部分有助于保持边界句子之间的上下文。然后,每个块都会发送给LLM,并附带提示,指示LLM提取SPO三元组。
LLM驱动的提取
对于每个文本块,工具会要求LLM输出一个包含三元组的JSON数组,并标明信息是从哪个块中提取的。以下是示例:
[ { "subject":"eli whitney", "predicate":"invented", "object":"cotton gin", "chunk":1 }, { "subject":"Industrial Revolution", "predicate":"reshapes", "object":"economic systems", "chunk":1 }, { "subject":"amazon", "predicate":"transformed", "object":"retail", "chunk":3 } ]
统一实体命名
提取一致性
提示语鼓励使用一致的实体命名、简短的关系短语(1到3个单词),并避免使用代词引用。提取的三元组会从所有块中合并,生成初步的原始知识图谱。
跨块实体标准化
在提取之后,通常会发现相同实体有很多变体(例如,“AI”,“A.I.”,“人工智能”)。为了避免碎片化或重复的节点,工具提供了实体标准化步骤。
1.基本标准化 :将文本转换为小写,去除空格等,以合并明显的重复项。2.标准化(可选) :启用后,LLM会将不同的提及合并成可能指代相同实体的集群。例如,“New York”,“NYC”和“New York City”会合并成一个标准节点,“United States”,“U.S.”和“USA”则合并成另一个节点。
这种标准化能够改善图谱的一致性,通常是推荐的做法。如果需要严格的原始提取结果,可以在配置文件中禁用此功能。
推断隐藏连接以丰富图谱
即使是对文本的详细阅读,也可能无法捕捉到隐含的关系。该工具通过以下两种方式解决了这一问题:
基于规则的推断:
•传递关系 :如果A促使B,且B驱动C,系统可以推断出A影响C。•词汇相似性 :名字相似的实体可能会通过通用的“相关”关系连接。
LLM辅助推断:
•该工具可以提示LLM提出连接本应断开的子图之间的链接。例如,如果一个子图涉及工业革命,另一个子图涉及AI,LLM可能会推断出历史或概念上的连接(如“AI是源自工业革命时期的技术创新的产物”)。•这些推断关系的边会以不同的方式标记(例如,使用虚线)来区分它们与显式陈述的事实。
此推断步骤通常会添加大量新的关系,极大地减少了孤立的子网络。如果您希望图谱仅基于文本提取,可以在配置文件中禁用此功能。与块编号不同,推断关系会包含一个属性,指示该关系是推断出来的。这个属性在可视化时很重要,用于通过虚线边表示推断的关系。以下是示例结构:
[
{
"subject":"electrification",
"predicate":"enables",
"object":"Manufacturing Automation",
"inferred":true
},
{
"subject":"tim berners-lee",
"predicate":"expanded via internet",
"object":"information sharing",
"inferred":true
}
]
LLM 提示
如果启用所有选项,LLM 会接收到四个提示。首先是初步的主题-谓词-宾语(SPO)知识提取。
提取系统提示:
你是一个专门从事知识提取和知识图谱生成的高级AI系统。
你的专长包括在文本中识别一致的实体引用和有意义的关系。
关键指令: 所有关系(谓词)必须最多为3个单词,理想情况下为1-2个单词。这是一个严格限制。
提取用户提示:
你的任务:阅读下面的文本(由三个反引号分隔)并识别每个句子中的所有主题-谓词-宾语(S-P-O)关系。然后生成一个包含所有三元组的JSON数组,每个对象代表一个三元组。
请严格遵守以下规则:
• 实体一致性 :在文档中使用一致的实体名称。例如,如果“John Smith”在不同地方提到为“John”,“Mr. Smith”和“John Smith”,则在所有三元组中使用一个一致的形式(最好是最完整的形式)。
•原子化术语 :识别独特的关键术语(如物体、地点、组织、缩写、人名、条件、概念、情感)。避免将多个想法合并为一个术语(它们应该尽可能地“原子化”)。•统一引用 :将任何代词(如“他”,“她”,“它”,“他们”等)替换为实际的被引用实体(如果能识别)。•配对关系 :如果多个术语在同一句话中同时出现(或在一段短文中使它们在上下文中相关),则为每一对具有有意义关系的术语创建一个三元组。•关键指令: 谓词必须最多为1-3个单词。永远不要超过3个单词。保持它们简洁明了。•确保识别文本中的所有可能关系,并将其捕获为S-P-O关系。•术语标准化 :如果同一概念有轻微的变化(例如,“人工智能”和“AI”),则始终使用最常见或规范的形式。•将所有S-P-O文本的小写,包括人名和地名。•如果提到某个人名,则创建一个关于其地点、职业和他们所知的(发明、编写、创办、头衔等)的关系,如果已知且符合信息的上下文。
重要注意事项:
•旨在精确命名实体——使用区分相似但不同实体的具体形式。•通过在文档中使用相同的实体名称来最大化连接性。•在识别实体引用时要考虑整个上下文。•所有谓词必须不超过3个单词 ——这是严格要求。
输出要求:
•不要包括任何文本或评论,只返回JSON。•只返回JSON数组,每个三元组作为一个对象,其中包含“subject”,“predicate”和“object”。•确保JSON有效并正确格式化。
这里列出了三个未在上面列出的提示,它们引导LLM进行标准化和关系推断。您可以在src/knowledge_graph/prompts.py[2]源文件中查看(并调整)所有的提示。
互动图谱可视化
通过生成完整的SPO三元组列表(包括原始和推断的),该工具使用PyVis(Vis.js的Python接口)生成互动的HTML可视化。打开生成的文件时,您将在浏览器中看到:
•颜色编码的社区 :同一集群中的节点共享相同的颜色。集群通常映射到文本中的子主题或主题。•按重要性调整节点大小 :具有多个连接(或较高中心性的)节点会显示得更大。•边样式 :实线表示从文本中提取的关系,虚线表示推断出的关系。•互动控制 :平移、缩放、拖动节点、切换物理引擎、切换明暗模式和过滤视图。
这种可视化方式使得探索关系变得更加直观和有吸引力。
程序流程
以下是程序的基本流程(代码库的README.md
中有更详细的程序流程图):
安装 AI-Knowledge-Graph
要在您的计算机上运行此工具,您需要满足以下要求:
要求:
•一台可以运行它的计算机(支持Windows、Linux或MacOS)•安装了Python(3.12或更高版本)(推荐使用uv)•访问OpenAI兼容的API端点(如Ollama、LiteLLM、LM Studio、OpenAI订阅等)•安装Git以克隆代码库
下载并安装依赖项:
1.克隆代码库到您要运行的系统,并切换到该目录:
git clone https://github.com/robert-mcdermott/ai-knowledge-graph.git
cd ai-knowledge-graph
2 . 使用uv安装依赖项:
uv sync
或者,使用pip安装:
pip install -r requirements.txt
配置 AI-Knowledge-Graph
编辑 config.toml
文件以根据您的情况进行调整。在这里,您可以配置LLM模型、端点(URL)、最大内容窗口长度以及LLM的温度。在下面的示例中,我使用了Google的Gemma 3模型,该模型托管在我本地计算机上,并通过Ollama提供服务。在这个配置文件中,您还可以调整文档的切块大小和重叠部分。如果需要,您还可以选择标准化实体并使用推断来建立更多的关系。
[llm]
model ="gemma3"
api_key ="sk-1234"
base_url ="http://localhost:11434/v1/chat/completions"
max_tokens =8192
temperature =0.2
[chunking]
chunk_size =200# Number of words per chunk
overlap =20# Number of words to overlap between chunks
[standardization]
enabled =true# Whether to enable entity standardization
use_llm_for_entities =true# Whether to use LLM for additional entity resolution
[inference]
enabled =true# Whether to enable relationship inference
use_llm_for_inference =true# Whether to use LLM for relationship inference
apply_transitive =true# Whether to apply transitive inference rules
[visualization]
edge_smooth =false# Smooth edge lines true or false
注意 :
对于本地LLM使用,您可以使用Ollama或LM Studio API端点。如果需要访问任何商业LLM提供商(如AWS Bedrock、Azure、Anthropic、OpenAI等),可以使用LiteLLM。如果您需要帮助运行Ollama本地服务,或使用LiteLLM访问其他LLM服务,请查看我之前的文章:《LLM从零到英雄使用Ollama》或《使用LiteLLM代理集中管理多个AI服务》。
创建知识图谱
现在您已经安装并配置好了ai-knowledge-graph,指向您的LLM,您就可以创建您的第一个知识图谱了。获取您想要创建知识图谱的纯文本文档(目前只支持文本文档)。
接下来,您需要运行 generate-graph.py
脚本。以下是该脚本的帮助信息:
usage: generate-graph.py [-h][--test][--config CONFIG][--output OUTPUT][--input INPUT][--debug][--no-standardize][--no-inference]
KnowledgeGraphGeneratorandVisualizer
options:
-h,--help show this help message andexit
--test Generate a test visualization with sample data
--config CONFIG Path to configuration file
--output OUTPUT Output HTML file path
--input INPUT Path to input text file (required unless--test is used)
--debug Enable debug output (raw LLM responses and extracted JSON)
--no-standardize Disable entity standardization
--no-inference Disable relationship inference
创建知识图谱示例
这是一个使用当前目录中的文本文件 mydocument.txt
创建知识图谱的示例(如果您使用的是uv,请将“python”替换为“uv run”):
python generate-graph.py --input mydocument.txt --output mydocument.html
以下是运行上述命令时在控制台中看到的完整管道输出:
python generate-graph.py --input mydocument.txt --output mydocument.html
Using input text from file: mydocument.txt
==================================================
PHASE 1: INITIAL TRIPLE EXTRACTION
==================================================
Processing text in3 chunks (size:500 words, overlap:50 words)
Processing chunk 1/3(500 words)
Processing chunk 2/3(500 words)
Processing chunk 3/3(66 words)
Extracted a total of 73 triples from all chunks
==================================================
PHASE 2: ENTITY STANDARDIZATION
==================================================
Startingwith73 triples and106 unique entities
Standardizing entity names across all triples...
Applied LLM-based entity standardization for15 entity groups
Removed8self-referencing triples
Standardized106 entities into101 standard forms
After standardization:65 triples and72 unique entities
==================================================
PHASE 3: RELATIONSHIP INFERENCE
==================================================
Startingwith65 triples
Top5 relationship types before inference:
- pioneered:9 occurrences
- invented:7 occurrences
- developed:6 occurrences
- develops:6 occurrences
- was:4 occurrences
Inferring additional relationships between entities...
Identified18 disconnected communities in the graph
Inferred27new relationships between communities
Inferred30new relationships between communities
Inferred6new relationships within communities
Inferred8 relationships based on lexical similarity
Added51 inferred relationships
Top5 relationship types after inference:
- invented:7 occurrences
- pioneered:6 occurrences
- developed:6 occurrences
- develops:6 occurrences
- related to:6 occurrences
Added57 inferred relationships
Final knowledge graph:116 triples
Saved raw knowledge graph data to mydocument.json
Processing116 triples for visualization
Found72 unique nodes
Found55 inferred relationships
Detected12 communities usingLouvain method
Knowledge graph visualization saved to mydocument.html
KnowledgeGraphStatistics:
Nodes:72
Edges:116(55 inferred)
Communities:12
To view the visualization, open the following file in your
现在,您可以在网页浏览器中打开生成的 HTML 文件,来探索您的知识图谱。如果您只是想阅读并想查看和交互一个由该系统创建的知识图谱,而不自己创建,可以点击以下链接,查看一个由有关工业革命的文档创建的示例可视化图:
Industrial-Revolutions.html[3]
在页面顶部,您可以使用菜单来展开控制面板,调整布局物理引擎,隐藏或显示节点/边标签,查看图谱统计信息,或选择/过滤节点和边。您还可以启用暗黑模式,如下所示:
通过这些功能,您可以更方便地探索知识图谱,并与其进行互动。
尝试不同的设置非常重要
实验不同的切块大小/重叠大小以及LLM模型的组合是一个好主意,以便了解它们对结果的影响。我通常将重叠设置为切块大小的10%。较小的文档切块大小(100–200)似乎能提取更多的关系,但这可能导致其他事物和概念/社区之间的关系较少,因为它们被分散在较小的切块中。您需要进行实验,找到合适的切块大小和模型。我也相信,通过调整提示语,可能还会有很多优化可以进行。
🤗更多信息
感谢您的阅读!本文由山行AI翻译整理自:https://robert-mcdermott.medium.com/from-unstructured-text-to-interactive-knowledge-graphs-using-llms-dd02a1f71cd6,如对您有帮助,请点赞、转发、评论,谢谢!
References
[1]
AI-Knowledge-Graph: https://github.com/robert-mcdermott/ai-knowledge-graph
[2]
src/knowledge_graph/prompts.py: https://github.com/robert-mcdermott/ai-knowledge-graph/blob/main/src/knowledge\_graph/prompts.py
[3]
Industrial-Revolutions.html: https://robert-mcdermott.github.io/ai-knowledge-graph/