SimGRAG
ACL 2025 论文:利用图语义距离(GSD)实现自然语言查询与知识图谱子图的精准对齐,显著提升 KG-RAG 系统的检索质量与效率。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
ACL 2025 论文:利用图语义距离(GSD)实现自然语言查询与知识图谱子图的精准对齐,显著提升 KG-RAG 系统的检索质量与效率。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
项目地址:https://github.com/YZ-Cai/SimGRAG
论文出处:ACL 2025 Findings
Star:141 ⭐ | Forks:22 | 语言:Python
大型语言模型(LLM)在各领域展现出强大能力,但其「幻觉」问题始终是落地应用的核心障碍。为了让模型在回答时「有据可依」,检索增强生成(RAG)技术应运而生——它从外部知识源中检索相关片段,再注入 LLM 的推理上下文,显著降低幻觉率。
在众多知识源中,知识图谱(Knowledge Graph, KG) 以其结构化、语义清晰的关系网络,成为 RAG 的优质载体。与传统文本块检索相比,KG 能够表达实体之间的多跳关系(如「A 通过 X 关系连接到 B,B 再通过 Y 关系连接到 C」),这对需要推理链路的问题尤为重要。
然而,如何将自然语言查询精准映射到 KG 中的子图结构,一直是 KG-RAG 的核心难题。用户的查询往往是模糊的、松散描述的,而 KG 中的结构是严格定义的——两者的「语义鸿沟」使得简单向量相似度匹配难以奏效。
ACL 2025 收录的论文 SimGRAG(Similar Graph Enhanced Retrieval-Augmented Generation)正是为解决这一难题而生。
SimGRAG 的核心创新在于提出了一条两阶段的处理管线,将「模糊查询」逐步转化为「精确子图」:
这一阶段利用 LLM 的推理能力,将用户的自然语言问题「翻译」为结构化的图查询模式。
具体来说,LLM 会根据 Few-shot Prompt 中提供的示例,将输入问题转换为类似 (实体A, 关系X, ?) 或 (?, 关系Y, 实体B) 的图模式表达。这种模式本质上是对查询结构的抽象——它不指定具体的实体名称,而是定义了查询的骨架(哪些位置是实体,哪些位置是关系)。
以 MetaQA 数据集为例,查询「谁导演了《盗梦空间》?」会被转化为图模式 (电影, 导演, ?),后续再将「盗梦空间」作为锚点匹配到具体节点。
有了图模式后,下一步是在 KG 中找出与该模式匹配的最佳子图。SimGRAG 提出了一个关键指标:图语义距离(Graph Semantic Distance, GSD)。
GSD 的核心思路是:
这一设计的巧妙之处在于:GSD 不仅考虑节点级别的相似度,还充分考虑了关系的匹配质量——因为在 KG 中,关系的错误匹配往往比节点错误更具破坏性。
SimGRAG 的代码仓库结构清晰,分为四个核心模块:
SimGRAG/
├── src/
│ ├── retriever.py # 核心检索引擎(SimGRAG 算法实现)
│ ├── indexer.py # 向量索引构建(Milvus + Nomic Embedding)
│ ├── embedding_model.py # Nomic Embedding 模型封装
│ ├── llm.py # LLM 调用(OpenAI 兼容 API,支持 Ollama)
│ ├── vecdb.py # 向量数据库封装
│ ├── dataset.py # 数据集解析(MetaQA / FactKG)
│ └── utils.py # 辅助工具(Top-K 排序等)
├── configs/ # JSON 配置文件(数据集路径、超参数)
├── pipeline/ # 端到端执行管道
│ ├── metaQA_index.py # MetaQA 索引构建
│ ├── metaQA_query*.py # MetaQA 1/2/3 跳查询
│ ├── FactKG_index.py # FactKG 索引构建
│ └── FactKG_query.py # FactKG 查询
└── prompts/ # Few-shot Prompt 模板
Retriever 是整个系统的核心类,其 retrieve() 方法逻辑如下:
# 1. 构建 NetworkX 查询图
Q = nx.Graph()
for edge in query_graph:
Q.add_edge(edge[0], edge[2], relation=edge[1])
# 2. 断开图则分治处理
if not nx.is_connected(Q):
# 对每个连通分量递归检索,再合并
...
# 3. 节点 + 关系双路向量检索
# 节点向量搜索
node_candidates = node_vector_store.search(query_embedding, topk=node_sim_topk)
# 关系向量搜索
relation_candidates = relation_vector_store.search(relation_embedding, topk=relation_sim_topk)
# 4. GSD 计算 + 贪心子图扩展
# 从种子节点出发,按度数排序邻居,贪心地扩展子图
Indexer 则负责将 KG 中的节点和关系预先编码并存储到 Milvus 中,支持批量处理(batch_size=8192),避免内存溢出。
client = OpenAI(base_url="http://localhost:11451/v1", api_key="...") # Ollama 本地推理
response = client.chat.completions.create(
model="llama3:70b",
messages=[{"role": "user", "content": prompt}],
temperature=0.2
)
默认使用 Ollama 部署的 Llama 3 70B(需 24GB+ VRAM),通过 ollama_server.sh 启动服务(监听 11451 端口)。支持替换为任意 OpenAI 兼容 API。
| 维度 | 详情 |
|---|---|
| 核心算法 | 两阶段 Query-to-Pattern + Pattern-to-Subgraph,GSD 图语义距离 |
| LLM | Ollama (Llama 3 70B),支持替换为任意 OpenAI 兼容 API |
| Embedding | Nomic Embed Text v1,本地部署 |
| 向量数据库 | Milvus,开源向量数据库 |
| 图数据库 | NetworkX(内存图),可扩展至真实 KG |
| 评估数据集 | MetaQA(1/2/3跳问答)、FactKG(事实验证) |
| 编程语言 | Python |
| 代码结构 | 模块化(Retriever/Indexer/LLM/Embedding 分立) |
SimGRAG 是一个纯研究级代码仓库,面向有 NLP / 知识图谱背景的研究人员。
data/raw/ 即可。根据论文描述,SimGRAG 在两个公开数据集上的表现:
| 数据集 | 任务 | 主要对比基线 | SimGRAG 优势 |
|---|---|---|---|
| MetaQA | 多跳知识图谱问答 | Roaster、RNM 等 | 在 1/2/3 跳设置下全面超越 |
| FactKG | 事实验证 | GPT-4、专用 KG-RAG | 显著提升准确率 |
论文特别强调,SimGRAG 的检索算法在包含 1000 万节点规模的知识图谱上,能够在 1 秒内完成 Top-K 子图检索——这一效率指标在实际应用中至关重要。
SimGRAG 是一篇学术创新度高、工程实现扎实的 KG-RAG 论文。其核心贡献在于:
对于希望基于知识图谱构建 RAG 系统的开发者而言,SimGRAG 提供了值得参考的算法思路;对于研究知识图谱问答的学者,其模块化的代码设计也便于在此基础上进行扩展和对比实验。
参考资料: