基于 LLM(DeepSeek / SJTU 致远一号)的知识图谱自动构建与可视化平台,采用 Plan-Generate-Evaluate 三阶段管线架构,从数学教材中自动提取知识节点与概念关系,生成可交互的知识图谱。
本项目采用三阶段串行管线架构,每个阶段由专门的 LLM 模块负责:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Planning │ ──→ │ Generation │ ──→ │ Evaluation │
│ LLM │ │ LLM │ │ LLM │
└─────────────┘ └─────────────┘ └─────────────┘
规划阶段 生成阶段 评估阶段
分析教材目录 提取节点与关系 质量检查过滤
制定构建计划 执行提取任务 反馈优化建议
- 输入:教材目录结构(TOC)
- 任务:
- 分析章节之间的逻辑关系
- 制定图谱构建计划(任务分解)
- 确定节点提取优先级和关系提取策略
- 输出:JSON 格式的任务列表,包含:
- 任务类型(extract_nodes / extract_relations / extract_both)
- 目标章节
- 提取重点(定义、定理、实例等)
- 任务优先级和依赖关系
- 输入:Planning 阶段的任务计划
- 任务:
- 根据任务类型提取知识节点(定义、定理、实例等)
- 提取节点间的逻辑关系(包含、递推、对偶等)
- 支持工具调用(Tool Calling)获取教材内容
- 输出:
- 节点列表:
[节点名称, {desc, level, color}] - 关系列表:
[起点, 终点, {rel, 定理, color}]
- 节点列表:
- 输入:Generation 阶段生成的节点和关系
- 任务:
- 评估节点质量(完整性、准确性、层级合理性)
- 评估关系质量(逻辑正确性、冗余检测)
- 过滤低质量内容,生成反馈建议
- 输出:
- 合格的节点和关系
- 评估反馈(可用于迭代优化)
| 功能模块 | 说明 |
|---|---|
| Pipeline 管线 | Plan-Generate-Evaluate 三阶段串行处理,自动化程度高 |
| Streamlit 应用 | 交互界面,集成管线、可视化、编辑和 AI 助手 |
| 文本清洗 | 将原始 Markdown/TeX 教材按章节拆分,调用 LLM 提炼主干内容 |
| 节点提取 | 基于规划任务,智能提取定义、定理、实例等知识节点 |
| 关系提取 | 两阶段策略:骨架关系(章节关联矩阵)+ 动态修复(孤立节点) |
| 质量评估 | LLM 自动评估节点和关系的质量,过滤低质量内容 |
| 工具调用 | 支持 Tool Calling,动态查询已有知识和教材内容 |
| 可视化编辑 | pyvis 交互式图谱可视化,支持节点/关系的增删改 |
| AI 助手 | 通过自然语言智能添加节点/关系,自动补全关系信息 |
| 多 Provider | 支持 DeepSeek 官方 API 与 SJTU 致远一号,可通过 .env 切换 |
knowledge-graph-ai/
├── streamlit_app.py # Streamlit 应用入口(主程序,推荐)
├── show.py # 知识图谱 HTML 可视化渲染器
├── start_app.bat # Windows 启动脚本
├── start_app.sh # macOS/Linux 启动脚本
├── requirements.txt # Python 依赖清单
├── .env # API 密钥配置(不提交到版本控制)
├── .env.example # 密钥配置模板
│
├── scripts/ # 脚本目录
│ ├── run_pipeline.py # 管线流程脚本
│ ├── config.py # 配置管理(API Key、路径)
│ ├── generate_topic_html.py # 生成单主题 HTML 可视化
│ ├── run_island_integration_once.py # 孤立节点一次性整合
│ └── test_full_toc.py # TOC 提取测试脚本
│
├── src/ # 源代码目录
│ ├── agents/ # 智能体模块
│ │ ├── base_agent.py # 智能体抽象基类
│ │ ├── two_step_planning_agent.py # 规划智能体(两步规划)
│ │ ├── generation_agent.py # 生成智能体
│ │ ├── evaluation_agent.py # 评估智能体
│ │ └── island_integration_agent.py # 孤立节点整合智能体
│ ├── pipeline/ # 管线模块
│ │ ├── orchestrator.py # 管线编排器
│ │ ├── task_executor.py # 任务执行器
│ │ ├── iteration_manager.py # 多轮迭代管理器
│ │ └── dependency_resolver.py # 依赖解析器
│ ├── core/ # 核心数据结构
│ │ ├── result_types.py # Node / Relation / TaskStatus 等
│ │ ├── constants.py # 常量(层级颜色映射等)
│ │ └── exceptions.py # 自定义异常层次
│ ├── infrastructure/ # 基础设施
│ │ ├── api_client.py # OpenAI 兼容 API 客户端
│ │ ├── conversation_manager.py # 对话历史管理
│ │ └── logger.py # 日志工具
│ ├── utils/ # 工具模块
│ │ ├── json_parser.py # JSON 验证与修复
│ │ ├── section_extractor.py # 章节提取器(纯文本)
│ │ ├── markdown_section_extractor.py # Markdown 章节提取
│ │ ├── unified_section_extractor.py # 自动检测格式并提取
│ │ └── section_length_calculator.py # Token / 长度估算
│ └── config/ # 配置与提示词
│ ├── provider_config.py # 多 Provider 配置(DeepSeek / SJTU)
│ ├── prompts.py # 各智能体系统提示词
│ └── two_step_planning_prompts.py # 两步规划专用提示词
│
├── material/ # 教材原文与中间产物(按主题分文件夹)
│ └── <主题>/
│ ├── <主题>.md # 原始教材文本(输入)
│ ├── raw_i.md # 按章节拆分的原始内容
│ ├── <主题>_subsection_i.md # LLM 清洗后的章节内容
│ ├── <主题>_nodes.json # 提取的知识节点
│ └── <主题>_relations.json # 提取的知识关系
│
├── output/ # 可视化输出(HTML 文件)
└── tests/ # 测试套件
pip install -r requirements.txt复制模板文件并填入你的 API Key:
# Windows
copy .env.example .env
# macOS / Linux
cp .env.example .env编辑 .env 文件,选择 Provider:
# 使用 DeepSeek(默认)
LLM_PROVIDER=deepseek
DEEPSEEK_API_KEY=your_api_key_here
DEEPSEEK_API_ENDPOINT=https://api.deepseek.com
# 或使用 SJTU 致远一号(校园网/VPN)
# LLM_PROVIDER=sjtu_zhiyuan
# SJTU_API_KEY=your_api_key_here
# SJTU_API_ENDPOINT=https://models.sjtu.edu.cn/api/v1前往 DeepSeek 开放平台 获取 API Key。
将教材 Markdown 文件放入对应目录:
material/
└── 复分析/
└── 复分析.md ← 原始教材文本
start_app.bat and start_app.sh are symmetric launcher scripts. Both perform the same steps:
- Detect available Python (3.8+)
- Install dependencies on first run (
requirements.txt) - Check whether
.envexists and show a reminder - Launch
streamlit_app.py
Windows:
# Double-click to run
start_app.bat
# Or run from command line
.\start_app.bat
# Or run directly
streamlit run streamlit_app.pymacOS / Linux:
chmod +x start_app.sh
./start_app.sh
# Or run directly
streamlit run streamlit_app.py浏览器将自动打开 http://localhost:8501。
修改 scripts/config.py 中的 MATERIAL_NAME 与 MATERIAL_FILE,然后:
python scripts/run_pipeline.py启动后,在侧边栏选择功能页:
可视化要求 material/<主题>/ 下存在以下文件:
material/
└── 复分析/
├── 复分析_nodes.json
└── 复分析_relations.json
交互式查看知识图谱:
- 选择教材:选择已生成图谱的教材
- 配置参数:调整画布高度等可视化参数
- 生成可视化:点击「生成可视化」,使用 pyvis 生成交互式图谱
- 交互操作:
- 鼠标拖拽移动节点
- 滚轮缩放图谱
- 点击节点查看详细信息
- 悬停查看关系说明
实时编辑知识图谱:
节点管理
- ➕ 添加新节点:填写名称、描述、层级、颜色
- ✏️ 编辑节点:修改节点属性
- 🗑️ 删除节点:级联删除相关关系
关系管理
- ➕ 添加新关系:选择起点、终点,填写关系类型和说明
- ✏️ 编辑关系:修改关系属性
- 🗑️ 删除关系:移除不需要的关系
批量操作
- 删除孤立节点(无任何关系的节点)
- 删除重复关系
[
["集合", {"desc": "由确定的、互不相同的对象组成的整体", "level": 0, "color": "#FF0000"}],
["映射", {"desc": "两个集合之间的对应关系", "level": 1, "color": "#FFA500"}]
][
["集合", "映射", {"rel": "必要递推", "定理": "映射建立在集合基础上", "color": "#00a5b1"}]
]Q: 步骤 1 清洗结果中出现大量 (4) 等标号怎么办?
A: 这是数学教材中公式引用编号的已知问题。建议在预处理阶段手动或用脚本将编号替换为完整公式描述。
Q: 关系提取后仍有大量孤立节点?
A: 可增大「动态修复最大轮数」(默认 5)或降低「关联阈值」(默认 0.7)再次执行步骤 3。也可运行 scripts/run_island_integration_once.py 进行一次性整合。
Q: API 调用超时或报错?
A: DeepSeek API 在高峰期可能响应较慢,程序已内置重试机制。如频繁超时,可在高级参数中减小 batch_num 以降低单次请求复杂度。
Q: 如何切换到 SJTU 致远一号?
A: 在 .env 中设置 LLM_PROVIDER=sjtu_zhiyuan 并填入 SJTU_API_KEY,无需修改任何代码。
- Python 3.8+
- 前端:Streamlit(交互界面)、pyvis(图谱可视化)、streamlit-agraph
- LLM:DeepSeek API(deepseek-chat / deepseek-reasoner)、SJTU 致远一号
- 图处理:NetworkX
- 并发:ThreadPoolExecutor
MIT License