深入解析:微软 GraphRAG 如何通过图结构增强文本检索与生成
GraphRAG 是微软研究团队提出的一种结合图结构的知识检索增强生成(RAG)方法,旨在提高基于查询的信息提取和摘要生成的准确性。通过创建一个图结构的数据库并对其进行查询,GraphRAG 能够更好地理解和回答复杂的问题。以下是 GraphRAG 的核心步骤及其工作原理的详细介绍,以《Penitencia》这本书为例。 图创建 初始化项目:在 GraphRAG 项目的 ragtest 目录中,有一个配置文件 settings.yaml。将要处理的文档放置在输入文件夹中。 分割文档:使用 create_base_text_units 模块将文档(如《Penitencia》)切分成多个小段落,每个段落的长度为 N 个 token。例如,每个段落可能包含 1200 个 token。 创建查找表:通过 create_final_documents 模块,为每个文档创建一个查找表,记录各个段落的唯一 ID 和其对应的部分。 实体和关系提取:在 extract_graph 模块中,利用大型语言模型(LLM,如 OpenAI 提供的模型)从每个段落中提取实体和关系,并生成初步描述。由于同一实体可能在多个段落中被提及,因此会出现重复。为了减少重复,GraphRAG 将同名的实体和关系归类,并使用 LLM 分析所有相关描述,生成最终描述。 构建图:通过 finalize_graph 模块,使用 NetworkX 库将提取的实体和关系表示成图中的节点和边。如果社区(即一组相关节点)的上下文字符串超过配置文件中指定的最大输入长度,GraphRAG 会使用层次替换和裁剪的方法来缩短上下文。层次替换是指用较小子社区的报告替代较大子社区的内容,而裁剪则是去除不重要的部分。 生成嵌入向量:最后,在 generate_embeddings 模块中,为所有段落、实体描述和社区报告生成嵌入向量,这些向量用于后续的语义搜索。 查詢 局部搜索(Local Search) 局部搜索适用于回答具体问题。以用户查询 “Laura 在寻求什么样的复仇,为什么?” 为例: 加载数据:从 ragtest/output 文件夹中加载社区报告、实体、关系和协变量(如有)。将用户的查询嵌入并计算其与每个实体描述的语义相似度。 筛选实体:根据配置文件中的 top_k_mapped_entities 参数,选择最相似的 N 个实体。实际操作中,GraphRAG 会过采样 2 倍于该参数值的实体,以防某些实体的 ID 无效。 候选选择:选定的实体及其相关的社区、关系和段落成为候选。候选人按相关性排序,以确保最重要的信息优先传递给 LLM。 生成回答:将排序后的候选社区报告、实体、关系和段落描述依次连接,形成上下文字符串,传递给 LLM 生成详细回答。 全局搜索(Global Search) 全局搜索适用于回答总体性问题。以用户查询 “这本书探讨了哪些主题?” 为例: 加载数据:从 ragtest/output 文件夹中加载社区报告和实体。计算每个社区的出现权重,反映该社区在文档中的广泛程度。 分批处理:将所有社区打乱并分批处理。每个批次内的社区按出现权重排序,优先处理出现频率较高的社区。 生成响应:对于每个批次,LLM 根据社区报告生成多个响应,并为其打分。通常每个批次生成 5 个响应,分数为零的响应被丢弃。 最终回答:将所有打分最高的响应文本合并成一个输入,再次传递给 LLM 生成最终答案。 业内评价和公司背景 业内人士认为,GraphRAG 是一种创新的方法,能够有效提高信息提取和摘要生成的质量。微软作为全球领先的科技公司,其研究团队在自然语言处理领域一直走在前沿,GraphRAG 的推出无疑是其技术优势的又一展现。尽管官方文档已经有所改进,但本文提供的深度解析填补了实际应用中的一些知识空白,为初学者和研究人员提供了实用的参考。通过调整配置参数或优化实体提取提示,GraphRAG 可以进一步定制化,满足更多应用场景的需求。