引言
"Convert any text to a graph of knowledge. Graph Retrieval Augmented Generation (GRAG) --- a new and improved version of RAG."
这是「一天一个开源项目」系列的第 61 篇文章。今天介绍的项目是 knowledge_graph (GitHub)。
想把文档、PDF 转成可查询、可可视化的知识图谱?knowledge_graph 用 LLM 提取概念 (非实体)、构建节点与边 ,支持 GRAG(图检索增强生成) 、中心性分析、社区发现。采用 no-GPT 方案 :本地 Mistral 7B + Ollama,零 API 成本,Docker 一键运行。
你将学到什么
- 知识图谱的构建流程
- 概念 vs 实体的区别
- W1(语义关系)与 W2(上下文邻近)双权重
- GRAG 与 RAG 的对比
- 本地 Ollama + Docker 快速开始
前置知识
- 对 RAG、知识图谱有基本了解
- 有 Docker 或本地 Ollama 环境(可选)
项目背景
项目简介
knowledge_graph 是 rahulnyk 开源的文本转知识图谱 项目。从 PDF 等文本语料中,用 LLM 提取概念(concepts)而非实体(entities),例如「班加罗尔」是实体,「班加罗尔宜人天气」是概念;概念在同一文本块中共现则视为相关。构建出的图谱可用于 GRAG、中心性计算、社区聚类等。
作者
- 作者:rahulnyk
- 理念:概念比实体更有意义;本地 LLM 零成本;可扩展为图数据库
项目数据
- ⭐ GitHub Stars: 3.1k+
- 🍴 Forks: 491+
- 📄 License: MIT
- 🌐 示例图谱 : rahulnyk.github.io/knowledge_g...
- 📝 方法详解 : Medium 文章
主要功能
核心流程
- 分块:将文本语料切分为 chunks,分配 chunk_id
- 提取概念与关系:用 LLM 从每个 chunk 提取概念及其语义关系,权重 W1
- 上下文邻近:同一 chunk 内共现的概念视为相关,权重 W2
- 合并边:对相同概念对合并权重、拼接关系,得到唯一边
- 计算度与社区:节点度(用于 sizing)、社区(用于 coloring)
概念 vs 实体
| 类型 | 示例 | 说明 |
|---|---|---|
| 实体 | Bangalore、医生 | 具体对象、人名、地名 |
| 概念 | Pleasant weather in Bangalore、医生与患者关系 | 情境、关系、抽象概念 |
| 本项目 | 提取概念 | 作者经验:概念比实体更有意义的 KG |
使用场景
- GRAG:用图谱作为检索器,与文档进行更深层对话
- 中心性分析:识别文本中最重要的概念
- 社区发现:将概念聚类,分析主题结构
- 可视化:用 Pyvis 生成可托管到网页的交互图
快速开始
Docker(推荐):
bash
git clone https://github.com/rahulnyk/knowledge_graph.git
cd knowledge_graph
docker build -t knowledge-graph .
docker run -p 8888:8888 knowledge-graph
访问 Jupyter(端口 8888)。
本地 Ollama:
- 安装 Ollama
- 运行
ollama run zephyr(或 Mistral 7B OpenOrca) - 修改
extract_graph.ipynb中的输入文本/PDF 路径,运行 notebook
核心 Notebook :extract_graph.ipynb
技术栈
| 组件 | 说明 |
|---|---|
| Mistral 7B OpenOrca | 提取概念的 LLM,通过 Ollama 本地运行 |
| Ollama | 本地托管模型,零 API 成本 |
| Pandas | 图 schema 的 dataframe(可后续换图数据库) |
| NetworkX | 图结构与算法 |
| Pyvis | 生成可网页托管的 JS 图可视化 |
项目优势
| 对比项 | knowledge_graph | 传统 NER + 关系抽取 | 纯向量 RAG |
|---|---|---|---|
| 提取对象 | 概念 | 实体 | 无显式结构 |
| 关系 | 语义 + 上下文邻近 | 预定义关系类型 | 无 |
| 成本 | 本地 LLM,零 API | 视实现而定 | 向量化有成本 |
| 检索方式 | 图检索(GRAG) | 图查询 | 向量相似度 |
| 可解释性 | 高,可追溯边与 chunk | 中 | 低 |
项目详细剖析
双权重设计
- W1:LLM 提取的语义关系,同一概念对可有多种关系
- W2:同一 chunk 内共现的上下文邻近关系
- 合并:相同概念对合并,权重相加,关系列表拼接
待改进方向(社区建议)
后端:
- 用 embedding 去重语义相似概念(如 "doctor" 与 "doctors")
- 过滤冗余、离群概念
- 优化上下文邻近,避免高频概念过重
前端:
- 按兴趣/主题展开子概念
- 更实用的图谱浏览与导航
目录结构
bash
knowledge_graph/
├── extract_graph.ipynb # 核心提取 notebook
├── ner.ipynb # NER 相关
├── data_input/ # 输入数据
├── data_output/ # 输出
├── helpers/ # 辅助函数
├── ollama/ # Ollama 相关
├── dockerfile
└── pyproject.toml
项目地址与资源
官方资源
- 🌟 GitHub : github.com/rahulnyk/kn...
- 🌐 示例图谱 : rahulnyk.github.io/knowledge_g...
- 📝 Medium : How to convert any text into a graph of concepts
- 🐛 Issues : GitHub Issues
适用人群
- 需要从文档构建知识图谱的开发者
- 探索 GRAG、图检索增强的团队
- 希望零 API 成本、本地运行的 RAG/GRAG 用户
- 对概念抽取、图可视化感兴趣的研究者
欢迎来我中的个人主页找到更多有用的知识和有趣的产品