微软2024年4月份发布了一篇《From Local to Global: A GraphRAG Approach to Query-Focused Summarization》(GraphRAG:从局部到全局的查询式摘要方法)论文,提出了一种名为GraphRAG的检索增强生成(RAG)方法,用于查询式摘要任务。传统的RAG方法主要基于局部检索和生成,可能会忽略不同检索片段之间的全局关系,导致生成的摘要缺乏整体连贯性和深度。GraphRAG 结合了知识图谱构建、检索增强生成和查询聚焦摘要技术,将检索到的文档片段组织成一个全局知识图,以捕捉它们之间的语义关系和逻辑关联,从而更好地支持跨文档推理和信息整合。论文实验表明,GraphRAG 在查询相关性、信息覆盖率和生成质量方面优于传统方法,特别适用于需要整合多个信息源的复杂查询式摘要任务。这项研究为提升检索增强生成模型的全局信息整合能力提供了新的思路。

并开源了论文的实现 GraphRAG 的项目:microsoft/graphrag: A modular graph-based Retrieval-Augmented Generation (RAG) system
今天简单总结学习这篇论文和项目的主要内容。
微软 GraphRAG 项目:提升LLM能力的新突破
LLM 的挑战与机遇
大语言模型(LLM)面临的最大挑战,同时也是最大机遇 ,在于如何将其强大的能力扩展到超出训练数据的范围 ,并在从未见过的数据 上依然取得可比拟的效果。这种能力的提升为数据研究开辟了新的可能性,例如结合上下文和数据集背景,识别主题和语义概念。
微软研究院(Microsoft Research) 开发的 GraphRAG,这一方法在增强 LLM 处理未见数据的能力方面取得了重要突破。
RAG 方法的局限性
传统的 检索增强生成(RAG, Retrieval-Augmented Generation) 方法通常依赖于 向量检索(vector search) ,在用户提出问题时,搜索相关片段并提供给大语言模型(LLM)生成答案。然而,这种方法存在 全局理解(global comprehension) 的局限性,尤其在以下场景下表现不佳:
1. 信息整合困难:
-
- 当问题需要从多个信息来源提取和综合分析 时,Baseline RAG 无法有效关联分散的信息,导致缺乏深入的洞察力。
- 例如,在企业内部文档或学术研究中,不同文档之间的共享属性可能蕴含重要的关联信息,但 Baseline RAG 难以"串联"这些数据,导致信息整合能力不足。

Baseline RAG retrieved context

GraphRAG provenance
2. 难以处理大规模数据集:
-
- 在面对 超大规模数据集合或长篇文档 时,Baseline RAG 无法提供全面的语义理解。
- 由于 LLM 的 上下文窗口(context window) 存在限制,过长的文本可能会在上下文的中间部分"丢失"关键信息,使得 RAG 无法捕捉深层语义概念,从而影响整体理解质量。
微软 GraphRAG 方法:基于知识图谱的增强

为了解决上述问题,微软研究团队提出了一种基于图的 RAG 方法(GraphRAG) ,用于在私有文本语料库 上进行问答,并提升 LLM 处理全局理解任务的能力。GraphRAG 主要具备以下优势:
- 增强用户问题的广泛性 :通过构建知识图谱,GraphRAG 更好地捕捉不同文档之间的关联,从而提升回答复杂问题的能力。
- 扩展索引的文本数量 :相比于 Baseline RAG 受限于向量相似性检索,GraphRAG 允许更大规模的数据索引,使其更适用于大规模数据分析。
GraphRAG 的技术架构
GraphRAG 采用了两阶段 的 基于图的文本索引(graph-based text indexing) 方法:
1. 构建实体知识图(Entity Knowledge Graph)
-
- GraphRAG 从源文档中提取实体和它们的关系,构建知识图谱,使得信息之间的关联更加清晰。
- 例如,在企业研究文档中,GraphRAG 可提取公司名称、研究主题、关键技术等实体,并建立它们之间的联系。
2. 生成社区摘要(Community Summaries)
-
- 预生成相关实体群体的摘要,提高查询时的检索效率。
- 当用户提出问题时,GraphRAG 先从知识图谱中找到相关的社区摘要,并基于摘要生成部分答案 ,最后再将这些部分答案整合成最终的用户响应。
- 这一过程避免了单纯依赖向量搜索时的信息丢失问题,并在问答时提供更完整的上下文。
实验结果:GraphRAG 显著提升问答能力
在包含100 万 token 的数据集中,GraphRAG 展示了相较于 Baseline RAG 显著的改进,尤其在:
- 答案的全面性(completeness)
- 答案的多样性(diversity)
GraphRAG 能够提供更深入的综合分析,而不是仅仅依赖简单的相似性匹配进行片段检索。
GraphRAG 系统架构:Index & Query 模块
GraphRAG 主要由两个核心模块组成:
1. Index 模块:数据索引与存储
- 读取 输入文件(可以是本地存储或云端存储)。
- 使用 大模型(LLM) 进行 文本切分(chunking)、嵌入生成(embedding)和实体提取(entity extraction)。
- 将最终处理的结果存储为 Parquet 格式,以供后续查询使用。
2. Query 模块:智能问答
- 基于用户输入的问题 ,在本地索引文件中进行检索。
- 结合知识图谱,对查询结果进行分段处理,将相关信息提供给 LLM 进行答案生成。
- 生成最终的高质量响应,确保答案的全面性和多样性。
GraphRAG 的意义与应用场景
GraphRAG 解决了 RAG 在长文本理解 和复杂信息整合上的痛点,使其适用于以下场景:
- 企业内部知识管理(例如:法律文档、技术文档)
- 医学和科研分析(例如:医学病例研究、科研论文整合)
- 金融与商业数据分析(例如:市场分析、投资研究)
微软的研究表明,GraphRAG 超越了传统 RAG 的性能,在私有数据集的问答任务上实现了更高的准确性和信息整合能力。
项目实践
1.安装 GraphRAG
pip install graphrag
2.运行 Indexer
-
创建存储路径并导入相关测试文件
mkdir -p ./microsofttest/input
touch ./microsofttest/input/wangzengqi_test.txt //wangzengqi_test.txt的编码方式必须时utf8 -
初始化项目配置
python -m graphrag.index --init --root ./microsofttest
-
修改配置文件,主要修改llm api和embedding api
vi ./microsofttest/setting.yaml
yaml
llm:
api_key: "xxx"
type: openai_chat # or azure_openai_chat
model: deepseek-chat
model_supports_json: False # recommended if this is available for your model.
api_base: https://api.deepseek.com/v1
embeddings:
llm:
api_key: "xxx"
type: openai_embedding # or azure_openai_embedding
model: embedding-2
api_base: https://open.bigmodel.cn/api/paas/v4 -
运行
python -m graphrag.index --root ./microsofttest
⠋ GraphRAG Indexer
├── Loading Input (InputFileType.text) - 1 files loaded (0 filtered) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 0:00:00
├── create_base_text_units
├── create_base_extracted_entities
├── create_summarized_entities
├── create_base_entity_graph
├── create_final_entities
├── create_final_nodes
├── create_final_communities
├── join_text_units_to_entity_ids
├── create_final_relationships
├── join_text_units_to_relationship_ids
├── create_final_community_reports
├── create_final_text_units
├── create_base_documents
└── create_final_documents
All workflows completed successfully. -
可以看到创建了对应的artifacts文件
└── microsofttest
├── cache
├── input
│ └── wangzengqi_test.txt
├── output
│ └── 20240812-150155
│ ├── artifacts
│ │ ├── create_base_documents.parquet
│ │ ├── create_base_entity_graph.parquet
│ │ ├── create_base_extracted_entities.parquet
│ │ ├── create_base_text_units.parquet
│ │ ├── create_final_communities.parquet
│ │ ├── create_final_community_reports.parquet
│ │ ├── create_final_documents.parquet
│ │ ├── create_final_entities.parquet
│ │ ├── create_final_nodes.parquet
│ │ ├── create_final_relationships.parquet
│ │ ├── create_final_text_units.parquet
│ │ ├── create_summarized_entities.parquet
│ │ ├── join_text_units_to_entity_ids.parquet
│ │ ├── join_text_units_to_relationship_ids.parquet
│ │ └── stats.json
│ └── reports
│ ├── indexing-engine.log
│ └── logs.json
├── prompts
│ ├── claim_extraction.txt
│ ├── community_report.txt
│ ├── entity_extraction.txt
│ └── summarize_descriptions.txt
└── settings.yaml -
查询
➜ graphrag python3 -m graphrag.query --root ./microsofttest --method global "介绍汪曾祺的短篇小说《黄油烙饼》"
2024-08-12 17:01:41.769441: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.INFO: Reading settings from microsofttest/settings.yaml
/usr/local/lib/python3.12/site-packages/graphrag/query/indexer_adapters.py:71: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value insteadSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
entity_df["community"] = entity_df["community"].fillna(-1)
/usr/local/lib/python3.12/site-packages/graphrag/query/indexer_adapters.py:72: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value insteadSee the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
entity_df["community"] = entity_df["community"].astype(int)
creating llm client with {'api_key': 'REDACTED,len=35', 'type': "openai_chat", 'model': 'deepseek-chat', 'max_tokens': 4000, 'temperature': 0.0, 'top_p': 1.0, 'n': 1, 'request_timeout': 180.0, 'api_base': 'https://api.deepseek.com/v1', 'api_version': None, 'organization': None, 'proxy': None, 'cognitive_services_endpoint': None, 'deployment_name': None, 'model_supports_json': False, 'tokens_per_minute': 0, 'requests_per_minute': 0, 'max_retries': 10, 'max_retry_wait': 10.0, 'sleep_on_rate_limit_recommendation': True, 'concurrent_requests': 25}SUCCESS: Global Search Response: 《黄油烙饼》是汪曾祺创作的一篇短篇小说,收录于他的短篇小说集《晚饭花集》中。这篇小说通过讲述主人公萧胜与奶奶的生活变迁,展现了家庭情感和社会变迁的深刻主题。小说中,萧胜与奶奶的亲密关系、对食物质量的担忧、与父亲的旅行、在马缨花研究站的新生活以及对蘑菇圈的了解等情节,共同构成了小说的主要内容。
小说不仅关注物质生活,也深入探讨了家庭成员之间的情感纽带和相互支持。萧胜的祖母(奶奶)是社区的核心人物,负责照顾萧胜的日常生活,包括从食堂打饭。父亲每年回家看望奶奶,并带回食物,如土豆、口蘑和黄油。奶奶去世后,木业生产合作社为她制作了棺材。社区中的关系主要围绕家庭成员的日常生活和情感联系。[Data: Reports (90)]
《黄油烙饼》通过描述萧胜家庭的生活细节,展现了家庭成员之间的深厚情感和日常生活的艰辛。小说中,黄油作为一种牛奶炼制的食品,在社区中具有象征意义。父亲带回黄油给奶奶,但奶奶没有吃。这可能反映了家庭成员之间的情感联系和物质交换,以及奶奶对家庭成员的关心和照顾。[Data: Reports (90)]
汪曾祺的文学作品,包括《黄油烙饼》,通常以其对人物心理的细腻刻画和对生活细节的精准捕捉而著称。他的作品不仅展现了人物的内心世界,也反映了社会背景和时代特征,使读者能够通过小说的窗口窥见那个时代的风貌。《黄油烙饼》作为汪曾祺的代表作之一,不仅在中国文学界产生了广泛影响,也被翻译成多种语言在国际上传播,增进了世界对中国现代文学的了解和认识。
➜ graphrag