
GraphRAG图检索增强生成
引言 传统RAG基于向量相似度检索文本块,在处理需要跨文档推理、全局性总结和多跳关系分析的任务时存在明显局限。GraphRAG将知识图谱与RAG结合,通过图结构组织信息,支持基于关系的检索和推理。本文深入GraphRAG的架构设计、构建流程和工程实践。 传统RAG的局限 局部检索的困境 传统RAG将文档切分为文本块,用向量相似度检索最相关的Top-K块。这种方式存在根本局限: 多跳推理失效:问题"A公司的CEO在B公司担任什么职务?“需要先找到A公司的CEO是谁,再查找此人在B公司的职务。向量检索可能只检索到A公司或B公司中的一个文档块,无法建立跨文档的连接。 全局信息缺失:问题"这个行业的主要趋势是什么?“需要综合所有文档的全局信息,但向量检索只能返回局部相似的文本块,无法提供全局视角。 关系信息丢失:文档切分时,实体间的关系可能被分散到不同文本块中,向量检索难以捕获这些结构化关系。 GraphRAG架构 整体架构 GraphRAG在传统RAG基础上增加知识图谱层: 文档 → 文本块提取 → 实体抽取 → 关系抽取 → 知识图谱构建 ↓ 查询 → 查询理解 → 图检索(子图提取)→ 上下文组装 → LLM生成 ↑ 向量检索(补充) 知识图谱构建 实体抽取:使用LLM从文本中提取实体(人物、组织、地点、概念等): def extract_entities(text, llm): prompt = f""" 从以下文本中提取实体,按类型分类。 文本:{text} 输出JSON格式: {{ "persons": ["..."], "organizations": ["..."], "locations": ["..."], "concepts": ["..."], "events": ["..."] }} """ return json.loads(llm.generate(prompt)) 关系抽取:识别实体间的关系: def extract_relations(text, entities, llm): prompt = f""" 识别以下文本中实体间的关系。 文本:{text} 实体:{entities} 输出三元组列表: [(主体, 关系, 客体), ...] 例如:(苹果公司, 收购, NeXT) """ return eval(llm.generate(prompt)) 图谱存储:将实体和关系存入图数据库(如Neo4j): ...








