微软 GraphRAG 项目学习总结

news2025/4/4 10:08:18

微软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 在长文本理解复杂信息整合上的痛点,使其适用于以下场景:

  1. 企业内部知识管理(例如:法律文档、技术文档)
  2. 医学和科研分析(例如:医学病例研究、科研论文整合)
  3. 金融与商业数据分析(例如:市场分析、投资研究)

微软的研究表明,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 instead

See 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 instead

See 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# dataGridView 自动生成几行几列及手动输入整型字符

C# dataGridView生成12号4列的表格 private void Form1_Load(object sender, EventArgs e) {// 清除默认列dataGridView1.Columns.Clear();// 添加4列(首列为序号列)dataGridView1.Columns.Add("ColIndex", "序号");dataGridView1.…

Day17 -实例:利用不同语言不同框架的特征 进行识别

前置:我们所需的web站点,都可以利用fofa去搜索,例如:app"flask"这样的语句去找对应的站点,找到后,我们模拟不知道是什么框架,再根据特征去判断它的框架。 ***利用工具可以再去结合大…

Pycharm(八):字符串切片

一、字符串分片介绍 对操作的对象截取其中一部分的操作,比如想要获取字符串“888666qq.com前面的qq号的时候就可以用切片。 字符串、列表、元组都支持切片操作。 语法:字符串变量名 [起始:结束:步长] 口诀:切片其实很简单,只顾头来…

Mysql从入门到精通day5————子查询精讲

本文主要讲述子查询的几种方法,读者注意体会它们的不同场合的适用情况及功能,本篇文章也融入了小编实践过程遇到的坑,希望读者不要再踩坑 一.带IN关键字的子查询 in关键字可以检测结果集中是否存在某个特定的值,检测成功则执行外…

虫洞数观系列二 | Python+MySQL高效封装:为pandas数据分析铺路

目录 系列文章 1. 引言 2. 常规写法mysql 3. 封装设计接口mysql 3.1dbname.py文件 3.1.1. 导入和基类定义 3.1.2. 具体表定义类 3.1.3. 表定义整合函数 3.1.4. 全局字典和测试代码 3.2mysql_dao文件 3.2.1. 模块导入与配置 3.2.2. 数据库连接池初始化 3.2.3. Comm…

MySQl之Binlog

前言 Binlog(Binary Log)是MySQL中至关重要的日志模块,它直接关系到数据恢复、主从复制等高阶架构设计。无论你是刚入门的新手还是有一定经验的开发者,掌握Binlog的原理和应用都是进阶的必经之路。 BinLog是什么? Bin…

开源项目解读(https://github.com/zjunlp/DeepKE)

1.DeepKE 是一个开源的知识图谱抽取与构建工具,支持cnSchema、低资源、长篇章、多模态的知识抽取工具,可以基于PyTorch实现命名实体识别、关系抽取和属性抽取功能。同时为初学者提供了文档,在线演示, 论文, 演示文稿和海报。 2.下载对应的de…

「MethodArgumentTypeMismatchException:前端传递 ‘undefined‘ 导致 Integer 类型转换失败」

遇到的问题: Failed to convert value of type java.lang.String to required type java.lang.Integer; nested exception is java.lang.NumberFormatException: For input string: "undefined" 原因分析: 大致意思就是我传递的参数到后端没…

LabVIEW故障诊断数据处理方法

在LabVIEW故障诊断系统中,数据处理直接决定诊断的准确性和效率。工业现场常面临噪声干扰、数据量大、实时性要求高等挑战,需针对性地选择处理方法。本文结合电机故障诊断、轴承损伤检测等典型案例,详解数据预处理、特征提取、模式识别三大核心…

基于 SpringBoot 的火车订票管理系统

收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…

Python的概论

免责声明 如有异议请在评论区友好交流,或者私信 内容纯属个人见解,仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示:: 提示:以下是本篇文章正文内容&#xff0c…

构建大语言模型应用:句子转换器(Sentence Transformers)(第三部分)

本系列文章目录 简介数据准备句子转换器(本文)向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 在之前的博客中,我们学习了为RAG(检索增强生成,Retrieval Augmented Generati…

怎样提升大语言模型(LLM)回答准确率

怎样提升大语言模型(LLM)回答准确率 目录 怎样提升大语言模型(LLM)回答准确率激励与规范类知识关联类情感与语境类逆向思维类:为什么不,反面案例群体智慧类明确指令类示例引导类思维引导类约束限制类反馈交互类:对话激励与规范类 给予奖励暗示:在提示词中暗示模型如果回…

【进阶】vscode 中使用 cmake 编译调试 C++ 工程

基于 MSYS2 的 MinGW-w64 GCC 工具链与 CMake 构建系统,结合VSCode及其扩展插件( ms-vscode.cmake-tools),可实现高效的全流程C开发调试。既可通过 VSCode 可视化界面(命令面板、状态栏按钮)便捷完成配置、…

流影---开源网络流量分析平台(三)(管理引擎部署)

目录 前沿 功能介绍 部署过程 前沿 在上一篇文章中,最后因为虚拟机的资源而没看到最后的效果,而是查看了日志,虽然效果是有了,但后来我等了很久,还是那个转圈的画面,所以我猜测可能是少了什么东西&#…

QT Quick(C++)跨平台应用程序项目实战教程 5 — 界面设计

目录 1.版面设计 2. 自定义按钮 2.1 自定义工具栏按钮 2.2 自定义图标按钮 3. 顶部工具栏 4. 主体 5. 底部工具栏 6. 主文件 7. 最终效果 上一章内容讲解了QML基本使用方法。本章内容继续延续“音乐播放器”项目主线,完成程序的界面设计任务。 1.版面设计…

【微服务架构】SpringCloud Alibaba(三):负载均衡 LoadBalance

文章目录 SpringCloud Alibaba1、核心组件2、优势3、应用场景 一、Loadbalance介绍二、Ribbon和Loadbalance 对比三、整合LoadBlance1、升级版本2、移除ribbon依赖,增加loadBalance依赖 四、自定定义负载均衡器五、重试机制六、源码分析1、猜测源码的实现2、初始化过…

06-02-自考数据结构(20331)- 查找技术-动态查找知识点

自考数据结构动态查找算法主要讲二叉树和平衡二叉树,但是感觉到了,就又续接了一部分,所以这篇备考的小伙伴着重看前两种就可以了。 知识拓扑 知识点介绍 二叉排序树(BST) 定义 二叉排序树(Binary Search Tree)又称二叉查找树,它或者是一棵空树,或者是具有下列性质的二…

Upload-labs 靶场搭建 及一句话木马的原理与运用

1、phpstudy及upload-labs下载 (1)下载phpstudy小皮面板 首先需要软件phpstudy 下载地址 phpStudy下载-phpStudy最新版下载V8.1.1.3 -阔思亮 (2)然后到github网址下载源码压缩包 网址 https://github.com/c0ny1/upload-labs 再…

爬虫的第三天——爬动态网页

一、基本概念 动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。 特点: 用户交互:动态网页能够根据用户的请求而生成不同的内容。内容动态生成:数据来自数据库、API或用户输入。客户端动态渲染:浏览器…