索引 · 2024
GraphRAG
先从文档抽出实体和关系,再沿社区摘要回答跨全文的问题。
要解决的问题
向量检索擅长找局部相似段落。问「这批文档里有哪些主要主题、它们如何关联」时,没有任何一块单独含有答案。
相对前一代的变化
朴素 RAG 的索引是文本块。GraphRAG 的索引是实体、关系和社区摘要。回答全局问题时,读的是社区摘要,而不是和问题最像的几段。
做法
Microsoft 的方法用模型从文本抽取实体和关系,建成图,再检测社区并自下而上写摘要。局部问题仍可沿实体检索;全局问题则对社区摘要做汇总。
局限
建图和写摘要要在入库时多次调用模型,费用和耗时都高于切块加向量。抽取错了,后面的摘要会沿着错的关系扩散。
在链路中的位置
改变的是索引,不是最后的生成模型。它和向量检索可以并存:局部问题走向量,全局问题走社区摘要。
详解
「详解」根据 Datawhale《All-in-RAG》 的 基于知识图谱的 RAG 改写,有删节和重组,未包含原教程的代码、图片和练习。原教程与本节详解均按 CC BY-NC-SA 4.0 许可提供:使用时需署名并标明修改,不得用于商业目的,再次改编须以相同许可共享。
相似段落回答不了跨全文的问题
向量检索寻找和问题最像的局部文本。问一组文档有哪些主题、人物之间有什么关系、某个条件会影响哪些对象时,答案分散在许多段落里,没有任何一块单独含有全部内容。知识图谱先把实体和关系抽出来,检索就可以沿关系走,而不是只比较整段文字的相似度。
建图、组织、再按问题读取
通用流程有三步。先从文本识别实体、关系和属性。再把图组织成社区、路径或层次摘要。查询时,局部问题从相关实体出发,全局问题读取社区摘要或沿多跳路径收集证据。
Microsoft GraphRAG 用模型抽取实体和关系,检测社区并自下而上写摘要。LightRAG 保留实体关系,但把检索分成较低的实体层和较高的主题层,并强调增量更新。图检索也可以和向量检索并列:精确关系走图,措辞模糊的描述走向量。
一个项目里图和向量各管一类问题
以菜谱为例,食材、菜品、工具和步骤可以成为节点,菜品与食材、步骤之间成为关系。Markdown 要先变成这些节点和关系,再导入 Neo4j。简单查询按名称找实体;多跳查询沿“菜品—使用—食材”找替代或搭配;带约束的查询则同时看口味、工具和忌口。
图查询的结果可以再写成结构化文档,切块后放入 Milvus。这样,自然语言描述仍能用向量召回,明确的关系和约束则用图查询。路由器根据问题选择传统混合检索、图检索,或两路一起取证。路由规则要能降级:模型判断不清时,回退到混合检索,而不是生成一条错误的图查询。
图的质量决定后面所有摘要
评估至少区分实体和关系是否抽对、多跳路径能否到达答案、全局摘要是否覆盖主题。抽取错误会被社区摘要放大。建图调用次数多,增量更新也要避免整张图重算。生产前应抽查高频实体、重名实体和被模型合并错的节点。