本教程系统性地讲解知识图谱(Knowledge Graph)的核心概念、在 RAG 系统中的应用价值,并通过 PyVis 可视化库构建一个完整的知识图谱管理应用。教程涵盖从基础理论到代码实践的完整路径,帮助读者理解知识图谱的构建、存储、可视化和检索方法。

前置教程

如想快速开始学习本教程,你可能需要先完成以下前置教程:

资源下载

1. 知识图谱核心概念

1.1 什么是知识图谱

知识图谱(Knowledge Graph) 是一种用图结构来表示知识和实体间关系的技术体系。它以节点(Node)代表实体,以边(Edge)代表实体之间的关系,形成一张语义网络。

知识图谱的核心三元组结构为 (实体, 关系, 实体),例如(Python, 是一种, 编程语言)、(FastAPI, 基于, Python)。

graph LR E1((Python)) -->|是一种| C1[编程语言] E2((FastAPI)) -->|基于| E1 E2 -->|构建| C2[REST API] style E1 fill:#d6eaf8,stroke:#2980b9,stroke-width:2px style E2 fill:#ebdef0,stroke:#8e44ad,stroke-width:2px style C1 fill:#d5f5e3,stroke:#27ae60 style C2 fill:#d5f5e3,stroke:#27ae60
概念 说明 示例
实体(Entity) 现实世界中的具体对象或抽象概念 Python、FastAPI、Web框架
关系(Relation) 实体之间的语义连接 "是一种"、"开发了"、"位于"
三元组(Triple) 知识图谱的基本信息单元 (Python, 是一种, 编程语言)
属性(Property) 实体的特征描述 Python的发布年份、作者

1.2 知识图谱在 RAG 中的应用

传统 RAG 系统基于向量相似度检索文本块,缺乏对实体间关系的结构化理解。引入知识图谱可以带来以下提升:

能力 纯向量 RAG 知识图谱增强 RAG
检索依据 语义相似度 语义 + 关系路径
多跳推理 困难(需多次检索) 自然支持(沿边遍历)
结构化回答 文本片段拼接 结构化知识+文本
可解释性 黑盒相似度 可追溯的关系路径

知识图谱在 RAG 中的典型应用方式

  1. 实体链接:从用户查询中识别命名实体,链接到知识图谱中的节点。
  2. 关系检索:沿实体间的关系路径检索多跳相关信息,补充纯文本检索。
  3. 上下文增强:将检索到的子图结构转化为 LLM 可理解的描述文本,作为回答的上下文。
  4. 答案验证:利用知识图谱中的事实关系验证 LLM 生成的回答是否正确。

1.3 主流知识图谱应用

应用/工具 类型 特点
Google Knowledge Graph 通用知识图谱 搜索引擎增强,数以亿计的实体
Wikidata 开放知识图谱 社区维护,结构化数据
Neo4j 图数据库 专业级图存储与查询(Cypher)
NetworkX Python 库 图分析算法丰富
PyVis Python 可视化库 浏览器端交互式图谱可视化

2. PyVis 可视化库

2.1 PyVis 优劣势分析

PyVis 是一个基于 Python 的交互式网络可视化库,底层使用 vis.js 在浏览器中渲染图形。

维度 优势 劣势
安装与使用 pip 一键安装,API 简洁 依赖浏览器渲染
交互能力 拖拽、缩放、点击高亮内建支持 不支持大规模图(>1000节点)
定制性 节点颜色/大小/形状可配置 布局算法不如 Gephi 丰富
集成方式 输出 HTML,可嵌入 Web 应用 非原生 GUI,需浏览器环境
中文支持 前端渲染,中文无问题 默认字体在部分 OS 需配置

选择 PyVis 的理由:本教程聚焦于中小规模知识图谱的可视化交互,PyVis 在易用性和功能之间取得了最佳平衡。对于需要深入图分析或大规模图可视化的场景,可考虑 NetworkX + Gephi 或 Neo4j + Bloom。

2.2 PyVis 安装与配置

# 创建并激活环境
conda create -n pyvis python=3.10
conda activate pyvis

# 安装 PyVis
pip install pyvis

# 验证安装
python -c "import pyvis; print(pyvis.__version__)"

PyVis 的核心 API 非常简单,只需要创建一个 Network 对象,然后添加节点和边即可生成交互式 HTML 页面:

from pyvis.network import Network

# 创建网络图
net = Network(height="600px", width="100%", directed=True)

# 添加节点
net.add_node(1, label="Python", title="编程语言", color="#4CAF50")
net.add_node(2, label="FastAPI", title="Web框架")
net.add_node(3, label="REST API", title="接口规范")

# 添加边(关系)
net.add_edge(1, 2, title="用于开发")
net.add_edge(2, 3, title="构建")

# 生成 HTML
net.write_html("graph.html", open_browser=False, notebook=False, local=False)

3. 示例代码实现

本章节逐步讲解示例代码的实现,构建一个完整的知识图谱管理应用,完整的代码请前往网盘下载。

3.1 项目结构

kb-graph/
    ├── config.py               # 配置文件(API Key 等)
    ├── requirements.txt        # 依赖清单
    ├── kg_core.py              # 核心模块(知识图谱数据模型、LLM 服务)
    ├── main.py                 # FastAPI 应用(CRUD API + 图谱可视化)
    └── static/
        └── index.html          # 前端界面

3.2 安装依赖

pip install -r requirements.txt
包名 用途
fastapi + uvicorn Web 服务框架和 ASGI 服务器
pyvis 知识图谱可视化(生成交互式 HTML)
openai 调用智谱 GLM API 生成节点和关系
httpx HTTP 客户端(openai 的底层依赖,锁定版本 <0.28)
jinja2 模板引擎(pyvis 的依赖)
python-multipart FastAPI 处理表单数据

3.3 核心模块(kg_core.py)

核心模块定义了 KGNodeKGRelationKnowledgeGraph 三个数据模型类,以及 KGLLMService(调用 GLM-4.7-flash 从文本提取实体和关系)。

核心逻辑如下:

# KGNode:节点数据模型(id / label / category / description)
# KGRelation:边数据模型(source / target / label)
# KnowledgeGraph:图谱容器,提供 add/update/delete 节点和关系的 CRUD 方法

class KGLLMService:
    """调用 GLM-4.7-flash 从文本中提取实体和关系"""
    def __init__(self, api_key, api_base, model_name):
        self.client = OpenAI(api_key=api_key, base_url=api_base)
        self.model_name = model_name

    def generate_graph_from_text(self, text):
        response = self.client.chat.completions.create(
            model=self.model_name,
            messages=[
                {"role": "system", "content": "你是一个知识图谱构建助手..."},
                {"role": "user", "content": f"请从以下文本中提取实体和关系:\n\n{text}"}
            ],
            response_format={"type": "json_object"}
        )
        return json.loads(response.choices[0].message.content)

完整代码请查看 kb-graph/kg_core.py

3.4 FastAPI 后端服务(main.py)

FastAPI 应用提供知识图谱的 CRUD API、LLM 生成和问答接口:

from config import *
from kg_core import KnowledgeGraph, KGNode, KGRelation, KGLLMService

app = FastAPI(title="Knowledge Graph API", version="1.0.0")
kg = KnowledgeGraph()
llm_service = KGLLMService(ZHIPU_API_KEY, ZHIPU_API_BASE, LLM_MODEL_NAME)

# 图谱数据:GET /api/graph
# 节点 CRUD:POST /api/nodes, PUT/DELETE /api/nodes/{id}
# 关系 CRUD:POST /api/edges, DELETE /api/edges
# LLM 生成:POST /api/generate?text=...
# LLM 问答:POST /api/ask?question=...

完整代码请查看 kb-graph/main.py。各 API 的作用如下:

端点 方法 功能
/api/graph GET 获取完整图谱数据
/api/nodes POST 创建节点
/api/nodes/{id} PUT/DELETE 更新/删除节点
/api/edges POST/DELETE 创建/删除关系
/api/generate POST LLM 从文本生成图谱
/api/ask POST 基于图谱回答问题
/ GET 前端页面

3.5 前端界面(static/index.html)

前端界面加载 vis.js CDN 库,通过 /api/graph 接口获取图谱数据后直接在前端渲染。支持节点拖拽、缩放和点击查看详情。

你可以前往 examples/kb-graph/static/index.html 查看完整的示例代码。

4. 完整运行流程

4.1 配置 API Key

config.py 中填写自己的智谱 API Key:

# 打开 config.py,将 your-api-key-here 替换为你的 API Key
ZHIPU_API_KEY = "your-api-key-here"

4.2 启动服务

# 进入示例代码目录
cd kb-graph/

# 启动 FastAPI 服务
python main.py

服务启动后,访问 http://localhost:8000 即可看到前端界面。

4.3 使用方式

LLM 生成图谱:在左侧文本框输入一段描述文本,点击"生成图谱",LLM 会自动提取实体和关系并可视化展示。

此过程会持续 3-5 分钟,取决于文本长度和模型性能,当生成完成后,终端会输出长串数据,访问前端页面即可看到生成的图谱:

使用方式示意图

手动添加节点:在"添加节点"区域输入节点名称、类别和描述。

手动添加关系:在"添加关系"区域输入源节点 ID、目标节点 ID 和关系描述。

图谱可视化:图谱在右侧区域以交互式网络图展示,支持拖拽、缩放和点击查看节点详情。

知识问答:在"知识问答"区域输入问题,LLM 会基于当前知识图谱的节点和关系信息给出回答。

使用方式示意图

5. 总结

5.1 核心内容回顾

  • 知识图谱:以节点和边表示实体与关系的结构化知识表示方式。
  • 三元组:(实体, 关系, 实体)是知识图谱的基本信息单元。
  • 知识图谱增强 RAG:通过关系路径检索和多跳推理补充纯向量检索的不足。
  • PyVis:轻量级 Python 可视化库,适用于中小规模交互式图谱展示。
  • LLM 辅助建图:利用大语言模型从非结构化文本中自动提取实体和关系。

5.2 常见问题与解答

问:PyVis 与 Neo4j 如何选择?

PyVis 适用于可视化展示,数据存储在内存中,适合原型和小规模应用。Neo4j 是专业图数据库,适用于大规模生产环境。本教程使用 PyVis 侧重可视化教学,生产环境可替换为 Neo4j 作为存储后端。

问:LLM 生成的实体和关系准确吗?

LLM 提取的实体和关系质量取决于输入文本的清晰度和模型能力。建议对 LLM 生成的图谱进行人工审核和修正,特别是关键业务场景下。

问:如何导出知识图谱数据?

当前实现中数据存储在服务端内存中。可以通过 GET /api/graph 接口获取 JSON 格式的完整图谱数据,可用于导出或备份。

问:知识图谱的数据如何持久化?

本教程为教学目的使用内存存储。如需持久化,可以将 KnowledgeGraph 的数据保存到 JSON 文件,或迁移到 Neo4j、PostgreSQL 等数据库。