面试官好,这道题其实是在问:当传统 [[RAG]] 只能回答"某段文字说了什么"时,我们怎么回答"这些文档共同的主题是什么"这种需要跨文档聚合的抽象问题。[[GraphRAG]] 就是干这个的。
我先说它的核心原理。它分两步:索引阶段和查询阶段。索引阶段不是简单[[切块]]加向量,而是先用 LLM 从文档里抽实体、关系、属性,构建一个 [[知识图谱]]。然后对图谱做社区发现,比如用 Leiden 算法,把紧密关联的实体聚成一个社区,再对每个社区生成一个高层摘要。这样你就有了一个层次化索引:底层是实体和关系,上层是社区的语义概括。
查询阶段分两路。如果问题是"某实体的属性是什么"这种具体的,就走局部搜索,定位到相关子图精确检索。如果问题是"这些文档共同的主题是什么"这种抽象的,就走全局搜索,遍历所有社区摘要,让 LLM 聚合推理。说白了,传统 RAG 的检索单元是文本块,GraphRAG 的检索单元是实体、关系、社区摘要,它多了关系推理这一步。
那它和传统 RAG 的边界在哪呢?传统 RAG 擅长精确匹配,比如"退货政策是什么",直接找相似文本块就行。而 GraphRAG 擅长连接性查询,比如"A 公司的技术怎么影响了 B 行业",需要跨文档综合。但落地时很少二选一,真正业务里常常是混合的。举个例子,一个企业知识库,既有员工问"年假几天"这种事实问题,也有总监问"今年各部门的常见痛点是什么"这种抽象问题。我会把传统 RAG 和 GraphRAG 都部署上,查询时先判断意图,如果问题是具体的就走向量检索,如果是抽象的就走图检索,甚至可以把两者结果融合,比如先用图找相关社区,再用向量在社区内精搜。
这里有个坑:GraphRAG 的索引成本很高,因为每一步都要调 LLM,而且图谱质量完全依赖抽取效果。如果文档噪声大、实体识别不准,后面的社区划分和摘要都会跟着错。常见的失败场景是社区粒度没调好,太粗了摘要笼统,太细了又退化回局部检索。上线前我会特别关注两点:一是用一批标注 query 评估社区划分的合理性,二是监控查询延迟,全局搜索如果遍历太多社区,速度可能扛不住。
所以我的判断是:GraphRAG 不是替代传统 RAG 的,而是补充。我更倾向于把它看作一个"全局分析工具",用在需要高层洞察的场景,比如竞品分析、技术趋势研判。而传统 RAG 是"精确问答工具",两者配合才能覆盖更多查询。
不过这里有个值得深挖的点:查询路由怎么设计。到底哪些 query 该走图、哪些该走向量?我自己的经验是,不能单靠关键词规则,因为用户不会说"我要一个抽象问题"。更好的做法是用一个轻量分类器,或者让 LLM 自己做意图判断,但这样又会增加延迟。这块其实挺有挑战的,需要在实际数据上反复调优。