GraphRAG与普通RAG在输入数据上的核心区别
核心区别可以一句话概括:
普通 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 把输入变成“带结构的图(图谱) + 段落 + 向量”。