
传统上,从原始文本构建知识图谱并不容易。这通常需要识别实体及其关系,手动编写提取规则,或使用专业的机器学习模型。然而,大语言模型(LLMs)具有很高的灵活性,能够用来实现这个目标。LLMs可以读取自由格式的文本,并输出结构化的信息。因此,正如本文所示,使用LLMs可以作为自动化管道的一部分,将非结构化文本转换为知识图谱。
本文将探讨我创建的一个学习项目,目标是构建一个由LLM驱动的管道,该管道能够接收非结构化文本并将其转化为互动知识图谱网页。这个项目的所有代码都可以在AI-Knowledge-Graph[1]项目库中找到。
相关文章(最近的5个):
为什么说Youtu-GraphRAG 是图谱检索增强推理智能体的未来?
怎么使用 LLM 图转换器构建知识图谱
怎么将任意文本转换为图谱
从非结构化文本到交互式知识图谱 —— 利用大语言模型(LLMs)
轻松将文本转换为知识图谱重梳理之Graph Maker
以下是该项目的一个简单示例。输入以下非结构化文本:
Henry是一位来自加拿大的才华横溢的音乐家,最初在著名指挥家MariaRodriguez的指导下学习古典钢琴。后来,Henry与他的妹妹Lucy组成了一支名为“TheMapleLeaves”的摇滚乐队,Lucy在多伦多大学学习音乐作曲。2020年8月12日,“TheMapleLeaves”发行了他们的首张专辑《PolarLights》,该专辑因将古典和摇滚元素融合在一起而广受好评。Lucy还积极参与环保活动,并成为了CleanEarth的地区大使,倡导加强野生动物保护法。Henry受到Lucy热衷慈善事业的启发,开始在家乡的动物收容所做志愿者。尽管Henry和Lucy起初在创作上存在分歧,但他们最终通过将Lucy的古典作曲与Henry的摇滚吉他曲风结合,找到了和谐。2021年,TheMapleLeaves在欧洲展开巡演,在巴黎、柏林、罗马等大城市举行了几场座无虚席的演唱会。在这次巡演期间,Henry对国际美食产生了浓厚的兴趣,并与当地厨师合作,拍摄了一部关于地方烹饪技巧的短纪录片。
该ai-knowledge-graph工具将使用你选择的配置LLM,从上述文本中提取知识,并生成一个HTML格式的知识图谱,输出结果将类似以下图像所示:
通过以上示例,我们可以看到该项目是如何利用LLMs从非结构化文本中提取有用信息,并将这些信息转化为图形化、结构化的知识图谱。

高级文本到图谱管道示意图
LLMs有上下文窗口限制(本地系统也有内存限制)。为了处理大型文档,该工具自动将文本分割成小块(例如,每块500个单词,且有一些重叠)。重叠的部分有助于保持句子边界处的上下文。每个文本块然后被发送到LLM,并指示LLM提取SPO(三元组)信息。
对于每个文本块,该工具会要求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 可能推断出历史性或概念性的连接(“人工智能是从工业革命开始的技术创新的延伸”)。
这些推断出来的边会以不同的方式标记(例如,虚线)以便与明确声明的事实区分开来。
这个推断步骤通常会添加大量新的关系,从而大大减少孤立的子网络。如果你想要一个完全由文本生成的图谱,可以在配置文件中禁用此功能。与文本块编号不同,推断关系会包含一个标识关系是推断出来的属性。这个属性在可视化过程中非常重要,用来通过虚线标记推断出来的关系。示例结构:
[
{
"subject":"electrification",
"predicate":"enables",
"object":"Manufacturing Automation",
"inferred":true
},
{
"subject":"tim berners-lee",
"predicate":"expanded via internet",
"object":"information sharing",
"inferred":true
}
]如果启用了所有选项,将发送四个提示语给LLM。其中之一是初始的主谓宾(SPO)知识提取。
你是一个先进的AI系统,专门从事知识提取和知识图谱生成。
你的专长包括在文本中识别一致的实体引用和有意义的关系。
**关键指令**:所有关系(谓词)最多不得超过3个单词,理想情况下是1-2个单词。这是一个严格的限制。你的任务是:阅读以下文本(由三重反引号分隔),并识别每个句子中的所有主谓宾(S-P-O)关系。然后生成一个包含所有三元组的 JSON 数组,每个三元组由一个对象表示。
请严格遵循以下规则:
-**实体一致性**:在文档中使用一致的实体名称。例如,如果“JohnSmith”在不同地方被提及为“John”,“Mr.Smith”和“JohnSmith”,则应在所有三元组中使用一致的名称(最好是最完整的名称)。
-**原子术语**:识别独立的关键术语(例如:物体、地点、组织、首字母缩写、人物、条件、概念、情感等)。避免将多个思想合并为一个术语(它们应该尽可能原子化)。
-**统一引用**:如果能识别到的代词(例如“他”,“她”,“它”,“他们”等)指代的是具体实体,应替换为实际引用的实体。
-**成对关系**:如果多个术语在同一句话中共同出现(或在一个短段落中使它们在上下文上相关),则为每对有意义的关系创建一个三元组。
-**关键指令**:谓词必须不超过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 文件中找到):

要在你的电脑上运行此工具,你需要满足以下要求:
•一台可以运行程序的计算机(Windows、Linux 或 MacOS)•安装了 Python(3.12 或更高版本)(推荐使用 uv)•访问一个兼容 OpenAI 的 API 端点(如 Ollama、LiteLLM、LM Studio、OpenAI 订阅等)•安装 Git 用于克隆代码库
克隆代码库到你将要运行该工具的系统上,并切换到该目录:
git clone https://github.com/robert-mcdermott/ai-knowledge-graph.git
cd ai-knowledge-graph使用 uv 安装依赖:
uv sync或者使用 pip 安装:
pip install -r requirements.txt编辑 config.toml 文件,以根据你的需求进行调整。在这里,你可以配置 LLM 模型、API 端点(URL)、LLM 的最大内容窗口长度和温度。在下面的示例中,我使用的是 Google 的开源 Gemma 3 模型,并通过 Ollama 在本地计算机上进行托管。在此文件中,你还可以调整文档的分块大小和重叠部分,另外,还可以选择是否启用实体标准化和推断来建立更多的关系:
[llm]
model ="gemma3"# LLM 模型
api_key ="sk-1234"# API 密钥
base_url ="http://localhost:11434/v1/chat/completions"# API 端点 URL
max_tokens =8192# 最大令牌数
temperature =0.2# 温度设置,用于控制生成的文本的随机性
[chunking]
chunk_size =200# 每个文本块的字数
overlap =20# 每个文本块之间的重叠字数
[standardization]
enabled =true# 是否启用实体标准化
use_llm_for_entities =true# 是否使用 LLM 进行额外的实体解析
[inference]
enabled =true# 是否启用关系推断
use_llm_for_inference =true# 是否使用 LLM 进行关系推断
apply_transitive =true# 是否应用传递推断规则
[visualization]
edge_smooth =false# 是否平滑边缘线,设置为 true 或 false现在你已经安装并配置了 ai-knowledge-graph,指向你的 LLM,你准备好创建你的第一个知识图谱了。首先,获取一个普通文本文件(目前只支持文本文件),这是你想要创建知识图谱的内容。
接下来,你需要运行 generate-graph.py 脚本。以下是该脚本的帮助信息:
usage: generate-graph.py [-h][--test][--config CONFIG][--output OUTPUT][--input INPUT][--debug][--no-standardize][--no-inference]
知识图谱生成器和可视化工具
选项:
-h,--help 显示此帮助信息并退出
--test 生成一个带有示例数据的测试可视化图
--config CONFIG 配置文件路径
--output OUTPUT 输出的 HTML 文件路径
--input INPUT 输入文本文件路径(除非使用--test,否则这是必需的)
--debug 启用调试输出(原始 LLM 响应和提取的 JSON)
--no-standardize 禁用实体标准化
--no-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 browser:
file:///Users/robertm/mycode/ai-knowledge-graph/mydocument.html现在,你可以在浏览器中打开生成的 HTML 文件来探索知识图谱。如果你只是在阅读并且希望查看和互动一个由该系统创建的知识图谱,而不自己创建它,可以点击以下链接查看一个由工业革命相关文档生成的示例可视化图:
Industrial-Revolutions.html[3]
你可以使用页面顶部的菜单来展开控制面板,调整布局物理引擎,隐藏或显示节点/边缘标签,查看图谱统计信息,或选择/过滤节点和边缘。页面还提供了深色模式,如下图所示:

尝试不同设置很重要。尝试不同的块大小/重叠大小和 LLM 模型,看看会有什么不同是很有必要的。我通常将重叠设置为块大小的 10%。较小的文档块大小(100–200)似乎能够提取更多的关系,但这可能会导致概念和社区之间的关系较少,因为这些关系会被分散到小块中。你需要进行实验以找到适合的块大小和模型。我也确信,通过调整提示词(prompts)还可以进行许多优化。
🤗 感谢阅读!
https://robert-mcdermott.medium.com/from-unstructured-text-to-interactive-knowledge-graphs-using-llms-dd02a1f71cd6[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