Learn
RAG/19-graphrag

图谱检索 GraphRAG

向量检索擅长「语义相似」,但不擅长回答「A 和 B 是什么关系」「谁影响了谁」这类需要多跳推理的问题。GraphRAG 把知识组织成图,弥补这一盲区。

1. 向量检索的盲区

问题: "导致项目延期的关键风险有哪些?它们如何相互关联?"
向量检索: 召回零散的几段描述,但拼不出「风险 A → 引发 → 风险 B」的链路
图谱检索: 沿实体关系游走,还原完整的因果链

当答案依赖实体间的结构关系而非文本相似度时,纯向量检索会力不从心。

2. 什么是 GraphRAG

GraphRAG(微软提出)分两步:

  1. 建图:用 LLM 从文档抽取「实体—关系—实体」三元组,聚合成知识图谱。
  2. 检索:沿图游走做局部查询,或对整图做社区摘要做全局查询。
ℹ️图与向量的分工

向量负责「找语义相近的片段」,图负责「理清实体间的关系」。两者常组合:先用图定位相关实体,再取回原文喂给 LLM。

3. 抽取与索引

# 用 LLM 从一段文本抽取三元组(示意)
prompt = f"""
从下面文本抽取实体关系,输出 JSON 列表,每项含 subject/relation/object:
{chunk}
"""
triples = llm.json(prompt)   # [{"subject":"项目X","relation":"依赖","object":"服务Y"}, ...]
 
# 写入图数据库(Neo4j / Nebula 等)
for t in triples:
    graph.merge_entity(t["subject"])
    graph.merge_entity(t["object"])
    graph.add_edge(t["subject"], t["object"], t["relation"])

4. 两种查询模式

模式适合做法
局部查询具体实体问答从相关节点沿边游走,取邻域子图 + 原文
全局查询整体总结(「这套文档的主题是什么」)对图做社区检测,逐层摘要再汇总
⚠️建图有额外成本

抽取三元组依赖 LLM,文档量大时耗时且烧钱;图质量高度依赖抽取 prompt。小语料、浅关系场景,普通 RAG 已够用,别为了用图而用图。

5. 适用场景

  • 科研文献的「方法 A 引用了谁、被谁改进」
  • 企业内部的「谁负责什么、向谁汇报」组织问答
  • 运维领域的「服务依赖与故障传播链」
💡先用向量,不够再上图

经验法则:先跑通向量 RAG 并用第 13 章指标评估。只有当「多跳关系 / 全局总结」类问题持续答不好时,再引入 GraphRAG。

🎯练习

挑一段你熟悉的文档,手写 5 个三元组(实体—关系—实体),思考其中哪几个问题用向量检索答不出、但用图能答出。

小结

  • 向量检索弱在多跳关系与全局总结,GraphRAG 用知识图谱补位
  • 流程:LLM 抽三元组建图 → 局部游走 / 全局社区摘要
  • 图与向量互补,常组合使用
  • 建图有额外成本,先用指标验证确有需要再引入
  • 下一章看让模型自主决定「何时检索」的 Agentic / Self-RAG →