Skip to content

04.3 - Graph RAG

定位: 利用知识图谱增强 RAG 的结构化检索能力——当"语义相似"不够用时,用"实体关系"做精确推理 面试高频度: ⭐⭐⭐⭐ 考查方式: Graph RAG 原理、与向量检索的对比、实体关系提取、Microsoft GraphRAG

一、这是什么?为什么需要它?

是什么

Graph RAG 是将知识图谱(Knowledge Graph)与 RAG 结合的架构。在传统向量语义检索之外,增加基于实体和关系的结构化检索能力。

传统 RAG(向量检索):
  查询 -> "苹果公司CEO是谁" -> 语义匹配文档 -> 可能找到包含"Tim Cook"的文档

Graph RAG(图谱检索):
  查询 -> "苹果公司CEO是谁" -> 知识图谱的精确查询 -> 实体:苹果公司 -> 关系:CEO -> 实体:Tim Cook

为什么需要 Graph RAG?

向量检索的局限:只能做"语义相似",无法做"关系推理"

"公司的最高决策机构是什么?" + "目前的成员有哪些?"
  向量检索:只能分别找"决策机构"和"成员"的文档
  但无法连接:决策机构 <-> 成员 <-> 现任
  Graph RAG:董事会 -> (包含) -> 成员 -> (现任) -> [张三, 李四, ...]

适合 Graph RAG 的查询类型:
  多跳问题:(A -> B -> C)
  关系比较:(A 和 B 的关系是什么?)
  聚合分析:(去年有多少...?)
  路径查询:(A 如何连接到 E?)

二、原理拆解

2.1 Graph RAG 核心流程

+------------------------------------------------------------------+
|                    Graph RAG 核心流程                               |
|                                                                   |
|  1. 离线知识图谱构建                                               |
|     文档 -> 实体提取 -> 关系提取 -> 图谱存储 (Neo4j/ArangoDB)       |
|                                                                   |
|  2. 在线查询处理                                                   |
|     用户查询 -> 查询理解 -> 实体链接 -> 图谱查询 -> 结果融合 -> 生成 |
|                                                                   |
|  3. 混合检索(推荐)                                              |
|     同时使用向量检索 + 图谱检索                                    |
|     向量检索:语义模糊匹配                                          |
|     图谱检索:精确关系推理                                          |
|     融合结果 -> LLM 生成                                           |
+------------------------------------------------------------------+

2.2 Microsoft GraphRAG 架构

Microsoft GraphRAG 是目前最系统的 Graph RAG 实现:

+------------------------------------------------------------------+
|                    Microsoft GraphRAG 架构                         |
|                                                                   |
|  1. 文档预处理(实体提取)                                         |
|     原始文档 -> LLM 提取实体和关系 -> 实体共现图构建                 |
|                                                                   |
|  2. 社区检测与摘要                                               |
|     Leiden 算法 -> 社区发现                                       |
|     每个社区 -> LLM 生成社区摘要                                   |
|                                                                   |
|  3. 查询处理                                                      |
|     上层:全局搜索(社区摘要)                                       |
|     下层:局部搜索(特定实体+邻居)                                  |
|                                                                   |
|  4. 结果融合                                                      |
|     全局结果 + 局部结果 -> 综合生成                                  |
+------------------------------------------------------------------+

GraphRAG vs 基础 RAG 对比

基础 RAG:直接基于文档块向量检索
  - 只能做语义相似度匹配
  - 无法理解实体间的关系
  - 无法做多跳推理

Naive Graph RAG:实体提取 + 关系存储
  - 需要查询中明确指定实体
  - 图谱更新成本高
  - 关系稀疏时效果不好

Microsoft GraphRAG:社区 + 摘要 + 全局/局部搜索
  - 自动构建大规模知识图谱
  - 社区摘要覆盖宏观知识
  - 对复杂全局问题效果好
  - 但:构建成本高(大量 LLM 调用)

2.3 向量 vs 图谱检索对比

维度向量检索图谱检索Graph RAG 混合
查询类型语义相似精确关系两者兼顾
多跳推理
实体关系精确精确
语义模糊匹配
构建成本
更新成本
适用查询"关于X的内容""X和Y的关系"复杂综合查询

三、图解全景

Graph RAG 的混合检索架构

+------------------------------------------------------------------+
|                    Graph RAG 混合检索架构                           |
|                                                                   |
|  用户查询:"苹果公司和微软公司在AI领域的竞争关系"                    |
|                                                                   |
|  +---------------------------+                                    |
|  | 查询理解模块               |                                    |
|  | 实体识别: [苹果公司, 微软]  |                                    |
|  | 关系识别: [竞争, AI领域]   |                                    |
|  +------+--------------------+                                    |
|         |                                                         |
|   +-----+-----+                                                   |
|   |           |                                                   |
|   v           v                                                   |
| +--------+  +--------+                                            |
| |向量检索 |  |图谱检索 |                                            |
| |语义匹配 |  |关系查询 |                                            |
| |关于苹果 |  |苹果 --[竞争]--> 微软                                 |
| |的文档   |  |          |                                         |
| +--------+  +--------+                                            |
|   |           |                                                   |
|   +-----+-----+                                                   |
|         |                                                         |
|         v                                                         |
|  +------------------+                                             |
|  | 结果融合 & 生成   |                                             |
|  | 文档信息 + 关系图  |                                             |
|  +------------------+                                             |
+------------------------------------------------------------------+

四、实战验证

4.1 简易 Graph RAG 实现

python
# 简易 Graph RAG:用 LLM 提取实体+关系,用图查询增强检索

from langchain_openai import ChatOpenAI
import json

class SimpleGraphRAG:
    def __init__(self, vectorstore, llm):
        self.vectorstore = vectorstore
        self.llm = llm
        self.graph = {}  # 简易图存储

    def extract_entities(self, query):
        """从查询中提取实体和关系"""
        prompt = f"""
        从以下查询中提取实体和关系:
        查询:{query}
        输出 JSON:{{"entities": ["entity1", ...], "relations": ["relation1", ...]}}
        """
        response = self.llm.invoke(prompt)
        return json.loads(response.content)

    def build_subgraph(self, entities):
        """根据实体构建子图查询"""
        relations = []
        for entity in entities:
            # 向量检索包含该实体的文档
            docs = self.vectorstore.similarity_search(
                f"{entity} 关系 关联", k=5
            )
            for doc in docs:
                relations.append(doc.page_content)
        return relations

    def invoke(self, query):
        entities = self.extract_entities(query)
        # 并行:向量检索 + 图检索
        vector_docs = self.vectorstore.similarity_search(query, k=3)
        graph_info = self.build_subgraph(entities["entities"])
        # 融合
        context = "\n".join(
            [d.page_content for d in vector_docs] + graph_info
        )
        response = self.llm.invoke(
            f"基于以下信息回答问题:\n{context}\n\n问题:{query}"
        )
        return response

五、面试视角

问题答案要点
Graph RAG 解决了向量检索的什么局限?向量检索只能做"语义相似",无法做"关系推理"。Graph RAG 通过实体-关系-实体结构,能回答多跳推理问题(如"A的B是什么?B的C是什么?")
Graph RAG 的主要代价是什么?知识图谱构建成本极高。实体提取、关系提取、社区检测都需要大量 LLM 调用。更新时也需要重新处理。成本通常是向量检索的 10-100 倍
Microsoft GraphRAG 的核心创新?1) 社区检测 + 摘要(Leiden 算法分层社区,每个社区生成摘要);2) 全局搜索(基于社区摘要回答宏观问题);3) 局部搜索(基于实体邻接图回答具体问题)
什么场景应该选择 Graph RAG?需要多跳推理、关系密集型、实体之间连接复杂。不适合:简单文档问答(向量检索更高效)、实时更新场景(图谱更新慢)
Graph RAG 和向量检索可以结合吗?可以,实际上推荐结合。向量检索做语义初筛,图谱检索做精确关系推理。两者互补,融合效果最好

📚 相关链接

  • **RAPTOR与分层检索** — 另一种结构化增强方案
  • **检索与重排序** — 混合检索的基础
  • **LlamaIndex实践指南** — LlamaIndex 的 Knowledge Graph 支持
  • <- 返回 **进阶RAG索引**

Knowledge4J — Java 知识库