GraphRAG 解决了什么问题
在朴素的 RAG(检索增强生成)架构中,我们通常使用向量数据库作为知识库。当用户提出查询时,系统从向量库中匹配 Top-K 个相似片段作为上下文,并将该上下文与提示词和查询一起交给大语言模型(LLM)进行回答。
假设这个向量库指向企业知识,考虑两个示例查询:
- XX 产品的价格是多少?
- 去年技术团队的成果有哪些?
对于第一个问题,由于它非常具体,知识库的搜索可能会找到相应的信息块或常见问题解答。对于这种类型的问题,朴素 RAG 通常会表现得很好。
对于第二个问题,这是一个宏观层面的查询,需要将企业知识库中所有与技术团队相关的项目收集起来并进行总结。关键在于找到与技术团队成果相关的各类信息,然后以某种方式关联起来以得出答案。这种方法也被称为'连接点'(connecting the dots)。
在这里,'点'指的是分散在不同地方的关键信息。那么,朴素 RAG 能否有效解决这类问题?虽然我们可以强制使用朴素 RAG 来寻找答案,但其效果很可能不会十分理想,因为它缺乏对实体间关系的理解。
对于这类问题,一种解决策略是预先整理信息。例如,我们首先抽取与技术团队相关的所有信息。当我们提出相关问题时,可以基于这些已经抽取的信息进一步进行总结。这个过程实际上就是构建知识图谱的过程。
举个例子,假设我们有大量文本,其中包含了技术团队执行的各种项目的信息。在我们构建的知识图谱中,我们有多个节点,代表技术团队和项目,并通过关系将它们连接起来。这样,当我们想了解他们完成了哪些工作时,只需关注与这些节点相关的部分,便可获悉技术团队已完成的任务。
这个构建知识图谱的过程通常可以用大型模型来完成,这也是 GraphRAG 模型提出的一个重要思想:预先提取并整理好信息,然后基于这些整理后的信息进行回答。
进一步来说,对于第二个问题,相关的提问方式有很多。例如:
- 张三的成果有哪些?我们可以找到与张三关联的节点,了解他相关的项目信息。
- 张三所在的后端团队的工作成果是什么?我们需要整合这个团队所有人员的工作成果。
- 进一步上升层次,整个技术团队的成果是什么?类似地,我们需要将各个技术团队的成果集中起来。
这里呈现的是一个层次结构,因此在 GraphRAG 模型中,做了进一步的操作:创建这种层次结构。我们预先整理出相关的关键信息,这样的层次结构是基于知识图谱获取的。因此,我们对这个知识图进行了类似的聚类,然后将这些实体的信息合并在一起,再对这些合并后的信息进行整理。从知识图谱到这里,GraphRAG 采用了一些社区挖掘算法,这是 GraphRAG 的第二个重要思想。
GraphRAG 核心架构补充
为了更清晰地理解其运作机制,GraphRAG 主要包含以下关键步骤:
- 实体与关系提取:利用 LLM 从原始文本中提取实体(Entities)及其之间的关系(Relationships),形成基础图谱。
- 社区检测:使用聚类算法(如 Leiden 算法)识别图谱中的社区(Communities),将紧密相连的实体分组。
- 社区报告生成:为每个社区生成摘要报告,汇总该社区内的关键信息和关系,形成层级化的知识表示。
- 索引构建:将上述结构化数据建立索引,以便后续检索。
这套方法能否在商业环境中实施呢?目前来看,它更像是一个原型或高级解决方案。
- 首先,构建知识图谱的过程会产生大量噪声,这需要大量的人工清洗和校正,成本高昂。
- 其次,在计算方面,聚类过程消耗资源较大,尤其是处理大规模数据时。
- 再者,新数据的加入也是问题。当有关键信息加入时,我们可能需要从头开始重建整个结构,这会产生大量的计算。这在知识图谱领域实际上是一个比较难解决的问题,即增量更新困难。
尽管如此,GraphRAG 作为一个新的 RAG 流程还是有必要学习一下的,特别是在需要跨文档推理的场景下。
GraphRAG 入门
环境配置
| 名称 | 安装 | 目的 |
|---|---|---|
| Python 3.10+ | 下载 | 该库基于 Python 开发。 |
| Poetry | 使用说明 | Poetry 用于 Python 代码库的包管理和虚拟环境管理。 |
下载源码,安装依赖
git https://github.com/microsoft/graphrag.git
graphrag
poetry install


