图RAG:微软为增强文件理解提供的开源解决方案
我一直在Reddit上看到有关GraphRAG的帖子,但直到大约一个月前我才决定尝试一下。在花了一些时间进行实验后,我可以说它很棒,但如果你使用OpenAI API的话,成本也相当高。在他们文档中提供的示例书籍上运行测试大约花费了我约7美元,所以虽然它提供的性能和组织是很可靠的,但并不算是预算友好的。
如果你是第一次接触 RAG 系统,我建议你先查看一些简介文章。
无论如何,这是传统抹布系统如何运作的概述
对于那些已经熟悉RAG的人来说,你可能遇到了和我一样的困扰:
- 上下文在文本块之间丢失
- 随着您的文档收藏增长,性能下降。
- 将外部知识融合进来感觉就像戴着眼罩解魔方。
GraphRAG 是如何运作的
GraphRAG是传统RAG的增强版本,主要分为两个阶段进行操作:
索引阶段:
- 从源文件开始,将其分割成更小的子文件(类似于传统的RAG)。
- 执行两个并行提取
- 实体提取:识别实体,如人物、地点、公司
- 关系提取:在不同块之间找到实体之间的连接。
- 创建一个知识图谱,其中节点表示实体,边表示它们的关系。
- 通过识别紧密相关的实体来建立社区
- 生成不同社区层次(三个层次)之间的层次摘要。
- 使用减少-映射方法逐步结合块以创建摘要,直到获得全面的概述。
查询阶段:
- 接受用户查询
- 根据所需的细节选择适当的社区级别
- 在社区级别执行检索(而不是像传统的RAG中的块级别)
- 检查社区摘要以生成部分回应
- 将来自多个相关社区的部分响应结合成最终的综合答案。
GraphRAG的关键创新在于将信息结构化为基于图形的格式,并利用社区检测来创建更加具有上下文意识的响应。然而,传统的RAG系统仍然有其存在的理由,特别是考虑到运行GraphRAG的计算成本。
建立GraphRAG
⚠️ 快速提醒:这个实验使用GPT-4的API运行,费用不菲。我的测试运行使用GPT-4模型,大约花费了7美元。
如果您想在本地LLMs上测试它,请在ollama上查看此视频:
让我们现在走一遍设置流程:
环境设置
首先,创建一个虚拟环境:
conda create -n GraphRAG
conda activate GraphRAG
安装GraphRAG包:
pip install graphrag
目录结构
GraphRAG需要一个特定的目录结构才能实现最佳运行效果: - 创建一个工作目录 - 在其中,创建一个ragtest/input文件夹结构 - 将您的源文件放入文件夹input中
在本篇文章中,我们将使用提供的书籍,在输入文件夹中使用以下命令下载它:
% curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt
配置
使用以下命令初始化您的工作空间:
python -m graphrag.index --init --root ./target
这将创建必要的配置文件,包括 settings.yml,在这里您需要:- 设置您的OpenAI API密钥- 配置模型设置(默认包括用于处理的GPT-4和OpenAI嵌入)- 根据需要调整块大小(默认为300个令牌)和重叠(默认为100个令牌)
构建知识图谱
运行索引过程:
python -m graphrag.index --init --root ./target
查询您的图表
GraphRAG提供两种主要的查询方法:
全球查询
python -m graphrag.query --root ./target --method global "what are the top themes in this story"
适用于关于主题和整体内容理解的广泛问题。
本地查询
python -m graphrag.query --root ./target --method local "what are the top themes in this story"
适用于有关文档中实体或关系的具体问题。
成本因素:是否值得?
让我们谈谈数字。在我对样本书的测试中,GraphRAG 制作:
- ~570次GPT-4 API调用。
- 大约有25个嵌入请求
- 处理了超过100万个标记
总损坏:大约每本书7美元。
资源
https://www.microsoft.com/zh-cn/research/blog/graphrag-new-tool-for-complex-data-discovery-now-on-github/