如何在知识提取与可视化管道中使用 LLMs
前言
知识图谱是一种强大的信息表达方式,由“实体”(节点)及它们之间的“关系”(边)组成,使我们能够比纯文本更直观地洞察事物之间的关联。
传统上,从原始文本构建知识图谱十分耗时且复杂:既要识别实体及其关系,又要编写提取规则或训练专用的机器学习模型。近年来,大语言模型(LLMs)凭借其出色的自然语言理解能力,提供了一种更加灵活、高效的替代方案。LLMs 能直接读取自由文本并输出结构化信息,使我们能够将其集成到自动化流水线中,一键生成知识图谱。
本文将介绍我设计的一个学习项目:构建一条基于 LLM 的管道,将非结构化文本转化为可交互的网页知识图谱。项目所有代码均托管于 AI-Knowledge-Graph 仓库[1]。
示例说明
以下示例展示了该项目的核心能力。假设我们提供这段非结构化文本作为输入:
Henry,一位来自加拿大的才华横溢的音乐家,最初在著名指挥家 Maria Rodriguez 门下学习古典钢琴。后来,Henry 与他的妹妹 Lucy(Lucy 曾在多伦多大学学习作曲)组成了摇滚乐队 The Maple Leaves 。 The Maple Leaves 于 2020年8月12日 发布首张专辑《Polar Lights》,因巧妙融合古典与摇滚风格而赢得好评。
Lucy 投身环保事业,担任 Clean Earth 的地区大使,倡导更严格的野生动物保护法。Henry 受其感染,开始在家乡动物收容所做志愿者。
尽管兄妹二人在创作理念上最初存在分歧,但最终通过将 Lucy 的古典作曲与 Henry 的摇滚吉他即兴结合,达成完美和谐。
2021年,The Maple Leaves 在欧洲巡演,于巴黎、柏林、罗马等地举办多场售罄演出。巡演期间,Henry 对国际美食产生浓厚兴趣,并与当地厨师合作,拍摄了一部短纪录片,展示各地烹饪技法。
ai-knowledge-graph
工具会调用你配置的 LLM,从上述文本中自动提取“实体—关系”对,并生成一个交互式 HTML 知识图谱,效果示例如下:
示例:AI-Knowledge-Graph 生成的知识图谱
•文本分块 :自动将大型文档拆分成可管理的小块,便于后续处理。•知识抽取 :使用大语言模型(LLM)识别并提取每个文本块中的主谓宾三元组(事实)。•实体标准化 :将同一实体的不同表述(如 “AI” 与 “artificial intelligence”)统一为一个标准名称。•关系推断 :借助简单的逻辑规则(例如传递性)和 LLM 推理,补充推断出跨块未直接连接的关系。•交互式可视化 :在浏览器中以交互式网络的形式展示最终图谱,支持节点拖拽、缩放和详情查看。
高层次展示“文本 → 知识图谱”转换管道
详细工作流程
1. 文本分块
由于 LLM 存在上下文窗口限制(本地系统也受内存约束),工具会先将大篇幅文本切分为若干小块(例如每块 500 字,且带有一定重叠)。重叠部分可确保边界句子的上下文连贯性。每个文本块随后被发送给 LLM,并附带提示,要求其提取该块中的 SPO(三元组)事实。
2. 基于 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 个词)•不要使用代词引用
将所有分块提取出的三元组合并后,就得到了初步的“原始”知识图谱。
3. 在分块间标准化实体
提取完毕后,常会出现同一实体的多种写法(例如 “AI”、“A.I.”、“artificial intelligence”)。为避免节点碎片化或重复,工具提供了实体标准化步骤:
1.基本归一化 •全部小写•去除首尾空白•合并明显重复的名称2.高级标准化(可选) •启用后,LLM 会将可能指向同一实体的不同描述聚类为同一个规范名称。•例如 “New York”、“NYC” 与 “New York City” 会合并为一个节点•“United States”、“U.S.” 与 “USA” 会合并为另一个节点•建议开启以提高图谱一致性;如需保留“纯粹”原始提取,可在配置文件中禁用此功能。
4. 推断隐藏关系,丰富图谱
即便对文本进行了全面抽取,也可能漏掉一些隐含的关联。工具通过两种方式补充此类关系:
1.规则驱动推断 •传递性关系 •如果 A “enables” B,且 B “drives” C,则可推断 A “influences” C•词汇相似性 •名称相近的实体可自动建立通用的 “related to” 关系2.LLM 辅助推断 •向 LLM 提示,让其在未连接的子图之间提出可能的关联。•例如,一个子图聚焦“工业革命”,另一个子图关注“AI”,LLM 可能推断出:“AI 是源于工业革命时期技术创新的发展成果”。•这些推断关系在可视化时会用虚线标记,以区分于显式陈述的事实。
注意:
•如需仅展示文本直接抽取的关系,可在配置文件中关闭推断步骤。•推断关系条目不包含
chunk
字段,而是增加一个inferred: true
属性,用于渲染时区分。
示例推断关系格式:
[
{
"subject":"electrification",
"predicate":"enables",
"object":"Manufacturing Automation",
"inferred":true
},
{
"subject":"tim berners-lee",
"predicate":"expanded via internet",
"object":"information sharing",
"inferred":true
}
]
5. LLM 提示模板
当启用所有选项时,会向 LLM 发送以下四个提示。首先是主体-谓词-宾语(SPO)知识抽取提示。
一、抽取系统提示(System Prompt)
你是一名专注于知识抽取与知识图谱生成的高级 AI 系统。
你的专长包括在文本中识别一致的实体引用和有意义的关系。
关键指令:所有关系(谓词)最多不超过3个单词。理想长度为1–2个单词。这是硬性要求。
二、抽取用户提示(User Prompt)
任务:阅读下方以三重反引号包裹的文本,识别每句话中的所有主体-谓词-宾语(S-P-O)关系。然后输出一个 JSON 数组,每个对象表示一个三元组。
请严格遵循以下规则:
-实体一致性:全文使用统一的实体名称。例如,“JohnSmith”若被称作“John”、“Mr.Smith”和“JohnSmith”,都应统一为最完整形式。
-原子术语:识别独立关键术语(如对象、地点、机构、缩写、人名、概念、情感等),避免将多个概念合并成一个术语。
-消除代词:将“he”、“she”、“it”、“they”等代词替换为实际实体(若可识别)。
-配对关系:若多个术语在同一句或同一上下文段落中关联,针对每个有意义的配对生成一个三元组。
-关键指令:谓词最多1–3个单词,绝对不能超过3个单词,务必保持极简。
-确保识别并捕获文本中所有可能的关系。
-术语标准化:若同一概念存在细微变体(如“artificial intelligence”与“AI”),全文统一使用最常见或规范形式。
-所有 S-P-O 文本均转换为小写,包括人名与地名。
-若文中出现人物,若上下文提供其地点、职业或代表作(如发明、著作、创立、职称等),应生成相应关系。
重要注意事项:
-实体命名要精准,区分相似实体。
-最大化节点连通性,同一概念务必使用相同名称。
-捕捉整个文本上下文,确保实体引用准确。
-所有谓词必须≤3个单词,此为硬性要求。
输出要求:
-不要包含任何注释或额外文字,仅返回 JSON 数组。
-每个三元组用对象表示,包含"subject"、"predicate"和"object"三个字段。
-确保输出为合法且格式正确的 JSON。
除了前述的四个提示外,项目中还有三个用于实体标准化 和关系推断 的提示模板。你可以在 src/knowledge_graph/prompts.py[2] 文件中查看并根据需要调整它们。
6. 交互式图谱可视化
在完成对所有 SPO 三元组(包括原始与推断)提取后,工具会调用 PyVis (Vis.js 的 Python 接口)生成一个交互式 HTML 可视化页面。打开输出文件后,你将看到:
•颜色编码的社区 :同一聚类内的节点颜色一致,通常对应文本中的子主题或主题。•节点大小表示重要性 :连接数多或中心性高的节点会显示得更大。•边线样式 :•实线:文本直接提取的关系•虚线:推断得到的关系•交互控件 :支持平移、缩放、拖拽节点;可切换物理引擎;切换亮/暗模式;按需过滤视图。
这样的交互式图谱能让你以直观且美观的方式探索实体及其关联。
7. 程序流程
下面是工具的基本执行流程(更多细节请参见仓库 README.md 中的流程图):
安装 AI-Knowledge-Graph
要在本地运行该工具,请确保满足以下环境要求并完成依赖安装。
系统与环境要求
•操作系统:Windows、Linux 或 macOS•Python:3.12 及以上•OpenAI 兼容 API 接口(如 Ollama、LiteLLM、LM Studio、OpenAI 订阅等)•Git:用于克隆仓库
安装步骤
1.克隆仓库并进入目录
git clone https://github.com/robert-mcdermott/ai-knowledge-graph.gitcd ai-knowledge-graph
2.安装依赖
•使用 uv
:
uv sync
•或使用 pip
:
pip install -r requirements.txt
完成以上步骤后,即可运行示例脚本,将任意非结构化文本转为交互式知识图谱。
配置 AI-Knowledge-Graph
编辑 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"# 端点 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)
注意:
•本地使用 LLM 时,可选择 Ollama 或 LM Studio 的 API 端点;•若要接入商业 LLM 提供商(如 AWS Bedrock、Azure、Anthropic、OpenAI 等),可通过 LiteLLM 代理访问。
现在你已经安装并配置了 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 的文本文件,存放在当前目录,运行以下命令来创建知识图谱:
python generate-graph.py --input mydocument.txt --output mydocument.html
如果你使用的是 uv
,则替换命令中的 python
为 uv run
。
完整管道运行输出示例
运行上述命令后,控制台会显示如下输出:
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)也能进行许多优化。
小结
本文演示了如何借助大语言模型,省去繁琐的手动规则编写与专用模型训练,将非结构化文本高效地转化为可交互的知识图谱。感兴趣的读者可访问项目仓库,下载示例代码并尝试将自己的文本数据可视化为知识图谱,开启“语义探索”之旅!
🤗 感谢阅读 !
References
[1]
AI-Knowledge-Graph 仓库: https://github.com/your-repo/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/