核心区别可以一句话概括:

  • 普通 RAG 的输入数据是“按段切开的文本块 + 这些块的向量”;

  • GraphRAG 的输入数据是“在此基础上,再提取出实体、关系、节点、边、社区等图结构”,也就是“文本 + 图”。[developer.volcengine]

展开说就是两层差异:索引阶段怎么处理数据检索给模型的上下文长什么样


1. 普通 RAG:文本块 + 向量

普通 RAG 的基本做法:

  • 数据准备:

    • 将原始文档(PDF、网页、Markdown 等)切成若干文本块(chunk);

    • 对每个文本块生成一个向量嵌入,并存入向量数据库;[blog.csdn]

    • 存储的核心结构是:{chunk_id, 向量 embedding, 原始文本, 元数据}

  • 查询时:

    • 把用户问题向量化,在向量库中做相似度匹配;

    • 取出最相似的若干文本块,把这些原始文本块拼到 Prompt 里喂给大模型。[cloud.tencent]

所以,普通 RAG 的输入数据,本质是独立的文本段落 + 对应的向量表示,它不显式存储“谁和谁有关系”,只是依赖语义相似度。[qiankunli.github]


2. GraphRAG:文本块 + 知识图谱(图结构)

GraphRAG 在此基础上,多做了一步:
先把文本转成图,再用图来组织和检索知识。[docs.feishu]

2.1 索引阶段的输入数据

GraphRAG 的索引管线通常包含这些步骤:[cnblogs]

  • 同样先有文本块(chunk),但不会停在“块 + 向量”上;

  • 用 LLM 或规则从文本中提取:

    • 实体(Person, Company, Product, Disease 等);

    • 关系(owns, manages, caused_by, part_of 等);

    • 事件或声明(谁在什么时间做了什么);

  • 将这些实体与关系构建为知识图谱

    • 节点(node):实体/概念/社区摘要等;

    • 边(edge):实体之间的关系;

    • 协变量(covariates):节点或边上的属性、证据、来源。

  • 进一步用社区检测算法(Louvain/Leiden 等)对图做分区,生成社区级摘要,方便回答“全局性问题”。[docs.feishu]

因此,GraphRAG 的输入不再只是“单块文本 + 向量”,而是:

  • 文档及其文本块(chunk);

  • 从这些文本块中抽取出的实体、关系、三元组

  • 用这些三元组构成的图结构(知识图谱)

  • 图上各节点、社区的摘要。

2.2 查询时给模型的上下文

GraphRAG 查询时通常会:

  • 根据用户问题在图中做路径搜索或社区检索,找到相关的节点/子图;[cloud.tencent]

  • 拉取这些节点关联的文本证据(原始段落)、图谱结构信息(谁与谁相关、通过几跳关联);

  • 让大模型同时看到:

    • 局部文本片段(类似普通 RAG);

    • 图结构的摘要/关系说明(例如“公司 A 与 B 通过 3 层控股关系相连”);

  • 对于全局性问题(如“这批文件的主要主题是什么?”),通过社区摘要 + map-reduce 方式生成答案。[cnblogs]

所以 GraphRAG 喂给模型的不只是“几个相关段落”,而是段落 + 关系 + 图结构的概要,这就是它在多跳推理、跨文档关联、全局总结方面更强的根本原因。[memgraph]


3. 总结成一句对比

如果用一句对比:

  • 普通 RAG

    • 输入数据形式:

      • 文档 → 文本块 → 向量

    • 检索维度:

      • 主要靠“这个问题和哪几段文本语义最相似?”

  • GraphRAG

    • 输入数据形式:

      • 文档 → 文本块 + 实体/关系 → 知识图谱(节点+边+社区)+ 向量

    • 检索维度:

      • 既考虑语义相似度,也显式利用“谁和谁通过什么关系、多大距离相关”,能做多跳关联和全局总结。

所以,从“输入数据”的角度看,核心区别就是:普通 RAG 把输入变成“向量化的段落集合”,GraphRAG 把输入变成“带结构的图(图谱) + 段落 + 向量”