学习笔记
🗒️动手实操微软开源的GraphRAG
00 分钟
2024-7-5
2024-7-13
type
status
date
summary
slug
tags
category
password
URL
icon
 
微软在今年4月份的时候提出了GraphRAG的概念,然后在上周开源了GraphRAG,Github链接见
graphrag
microsoftUpdated Jul 13, 2024
,截止当前,已有6900+Star。

安装教程

官方推荐使用Python3.10-3.12版本,我使用Python3.10版本安装时,在初始化项目过程中会报错,切换到Python3.11版本后运行正常,推测是Python3.10与微软的一些最新的SDK不兼容。所以建议使用Python3.11的环境,安装GraphRAG比较简单,直接下面一行代码即可安装成功。

使用教程

在这个教程中,我们使用马伯庸的《太白金星有点烦》这个短篇小说为例,测试下使用微软开源的GraphRAG的处理效果。
注意,GraphRAG是使用LLM来提取文本片段中的实体关系,因此耗费Token数较多,如果是个人调研使用,不建议使用GPT4级别的模型(费用太高,不差钱的大佬请忽略此条建议)。综合成本和效果,我这里使用的是DeepSeek-Chat模型。

初始化项目

我这边先创建了一个临时测试目录myTest,然后按照官方教程,在myTest目录下创建了input目录,并把《太白金星有点烦》这本书的txt版本重命名为book.txt后放到input目录下。然后调用python -m graphrag.index --init 进行初始化工作,生成一些配置文件。
执行完成后,会在当前目录(即MyTest)目录下生成几个新的文件夹:output-后续执行生成的中间结果会保存到这个目录中;prompts-处理过程中用到的一些Prompt内容;.env-大模型API配置文件,里面默认就一个GRAPHRAG_API_KEY 用于配置大模型的apiKey;settings.yaml-该文件是整体的配置信息,如果我们使用的非OPENAI的官方模型和官方API,我们需要修改此配置文件来让GraphRAG按照我们指定的配置文件执行。

配置相关文件

先在.env文件中配置大模型API的Key,这个配置是全局生效的。我们在.env文件中配置完成后,不需要在settings.yaml文件中重复配置。settings.yaml中使用的默认模型为gpt-4-turbo-preview ,如果不需要修改模型以及调用的API地址,那现在就已经配置完成了,后续的配置内容可以执行忽略并直接到执行阶段。
我这里使用的是https://agicto.com/?channel=R2SyBolk1 提供的APIkey(主要是新用户注册可以免费获取到10块钱的调用额度,白嫖还是挺爽的)。我在这里主要就修改了API地址和调用模型的名称,修改完成后的settings文件完整内容如下:
 

执行并构建图索引

此流程是GraphRAG的核心流程,即构建基于图的知识库用于后续的问答环节,通过以下代码即可触发执行。
基于微软在论文中提到的实现思路,执行过程GraphRAG主要实现了如下功能:
  1. Source Documents → Text Chunks:将源文档分割成文本块。
  1. Text Chunks → Element Instances:从每个文本块中提取图节点和边的实例。
  1. Element Instances → Element Summaries:为每个图元素生成摘要。
  1. Element Summaries → Graph Communities:使用社区检测算法将图划分为社区。
  1. Graph Communities → Community Summaries:为每个社区生成摘要。
  1. Community Summaries → Community Answers → Global Answer:使用社区摘要生成局部答案,然后汇总这些局部答案以生成全局答案。
整体执行耗时与具体的文本大小有关。我这个例子整体耗时大概20分钟,耗费人民币大约4块钱。执行过程中的输出如下:
 

基于构建的知识库进行提问

GraphRAG支持两种提问方式,"global search"和"local search"。"global search"指的是那些需要理解整个文本语料库的问题,例如“数据集的主要主题是什么?”这类问题需要一种全局性的理解和摘要,而不是仅从文本的局部区域中检索信息。相反,"local search"在论文中通常指的是文本的局部区域或文本块,这些局部区域是RAG方法检索的单元。
让GraphRAG帮我介绍下这篇文章都讲述了什么内容,执行代码如下:
 
输出内容为:
同样的问题,我们使用"local search"的方式再问一下,执行代码
输出内容为:
 
对比之下可以看出,"local search"的查询方式确实会透出更多细节信息。

以上就是这篇文章的主要内容,第二篇文章我会找一个典型的文章,对比下GraphRAG和常规RAG在实际场景中的使用效果,第三篇文章会介绍下GraphRAG的主要实现原理(工作日通常会加班,下班较晚,回家后需要陪陪家人,因此更新可能会慢点,预计下周末出第二篇)。如果想看更多的理论细节,推荐阅读https://arxiv.org/pdf/2404.16130
 
 
上一篇
微软GraphRAG原理介绍(附带部分源码)
下一篇
看互联网大厂如何落地AI-Agent(3)