从RAG到GraphRAG:基于图的检索增强生成AI技术 -- 知识铺
[
自然语言处理中的RAG模型及其演变
引言近年来,自然语言处理(NLP)领域在**检索增强生成(RAG)**模型方面取得了显著进展。RAG模型通过利用外部知识源,显著提升了语言模型的性能。
RAG模型的诞生背景在信息更新迅速的时代,传统的语言模型需要频繁更新以保持信息的时效性。例如,一个技术产品聊天机器人需要不断更新以适应产品更新。RAG模型的出现,就是为了解决这种频繁更新的问题。
RAG模型的工作原理RAG模型结合了检索机制和生成模型,允许模型动态地访问最新信息,而无需重新训练。这使得模型能够实时获取并整合最新数据,生成准确的响应。
为什么选择RAG?
- 效率:RAG模型通过检索最新信息,减少了模型更新的频率和成本。
- 实时性:模型能够快速响应信息的更新,保持信息的时效性。
RAG模型的类比将RAG模型比作一个动态网页,它能够根据后端数据库的更新自动刷新用户界面。生成模型则类似于网页的UI,根据检索到的最新数据生成输出。
GraphRAG:RAG模型的新范式GraphRAG是RAG模型的新发展,它通过将基于图的结构纳入检索过程,进一步提升了模型的性能。
GraphRAG的优势
- 结构化信息检索:GraphRAG利用图结构来组织和检索信息,提高了信息检索的效率和准确性。
结论RAG及其发展模型GraphRAG,为AI系统提供了一种高效、实时更新信息的能力,使得AI系统能够更好地适应快速变化的信息环境。
参考文献
检索增强生成(RAG)框架概述
检索增强生成(RAG)是一种结合了检索机制和生成模型的框架,旨在生成信息丰富且上下文准确的输出。以下是RAG框架的两个主要组成部分:
检索器(Retriever)检索器负责从大型文档库中检索与查询相关的信息。其工作流程分为三个阶段:
- 型号选择:选择适合的检索器型号,例如BM25、DPR(密集通道检索)等。
- 训练/微调:对所选检索器进行微调,以适应特定的语料库,通常通过监督学习实现。
- 嵌入创建:生成文档和查询的嵌入,以便评估它们之间的相似性。
发生器(Generator)发生器是一个基于Transformer的模型,如GPT或BERT,它使用检索到的信息生成连贯且相关的响应。其工作流程同样分为两个阶段:
- 模型选择:选择一个适合的生成模型,例如GPT-3、BERT或T5。
- 微调:在特定数据集上微调生成模型,使其能够根据上下文和查询生成准确的答案。
RAG框架的工作流程
- 检索阶段:接收查询并检索知识库,获取相关文档。
- 排名阶段:根据相关性对文档进行排名,通过比较嵌入来评分。
- 生成阶段:将检索到的文档和原始查询输入到生成模型,合成包含最相关信息的响应。
RAG框架的优势在于能够确保生成的响应不仅准确,而且通过最新数据得到丰富,从而提高信息的质量和相关性。
检索增强生成(RAG)架构的优缺点分析
优点分析
-
提高准确性:RAG模型融合了检索与生成技术,通过访问庞大的数据库,相较于传统生成模型,能够提供更加准确和相关性强的答复。
-
动态更新能力:与需要频繁重新训练的静态模型不同,RAG模型能够通过检索知识库中的新数据来实时更新其答复,减少了重新训练的频率。
-
上下文理解增强:RAG模型的检索部分能够获取额外的上下文信息,使得生成部分能够产生更加细致和全面的答复,特别是在处理复杂查询时。
-
可扩展性:RAG模型能够有效地处理大规模知识库,其检索组件能够快速检索大量数据,而生成组件则专注于信息合成,适合大数据量处理。
-
灵活性:RAG模型的检索与生成过程相互独立,允许知识库的更新与生成模型的更新相互独立,提高了系统的适应性和灵活性。
缺点分析
-
模型复杂性:RAG模型的实现需要集成和微调检索与生成组件,这可能导致开发和维护成本较高。
-
响应延迟:检索过程在生成答复前增加了一个步骤,可能会引入额外的延迟,影响需要实时反馈的应用。
-
知识库依赖性:RAG模型的性能高度依赖于知识库的质量和更新频率,不完善的知识库可能导致答复的准确性下降。
-
信息过载风险:检索到的大量文档可能使生成模型难以处理,导致答复不连贯或过长,需要有效的文档排序和选择机制。
-
训练数据需求:为了达到最佳性能,RAG模型需要大量的高质量训练数据,获取和管理这些数据可能具有挑战性。
图1.3:RAG服务架构
超越RAG的发展:GraphRAG的崛起及其优势
什么是GraphRAG?
GraphRAG(如图1.5所示)是RAG框架的进化,它通过将基于图的结构引入检索过程,实现了对RAG的超越。与依赖于平面文本检索的RAG不同,GraphRAG采用知识图谱——一种结构化表示实体及其关系的图形式数据结构,来增强其检索和生成能力。
知识库的集成与角色关系识别
例如,假设我们有一个包含Marvel和DC漫画书角色嵌入的知识库。当GraphRAG与这样的漫画数据集成时,它能够创建角色之间的关系图谱。例如,GraphRAG能够识别出美国队长与钢铁侠或蝙蝠侠之间的联系。
GraphRAG的优势
尽管RAG也能够处理类似的任务,但GraphRAG通过利用图形化的关系,简化了检索过程,加速了角色间复杂联系的管理与检索。这使得GraphRAG在处理角色关系时更加高效。
结论
GraphRAG的引入,不仅提升了检索的效率,也使得在复杂数据集上的生成任务变得更加可行。它代表了RAG框架在知识表示和检索能力上的一大进步。
图1.4:GraphRAG显示字符之间的关系
GraphRAG如何工作
GraphRAG服务架构的优势分析
1. 基于图的检索GraphRAG与传统的RAG模型相比,具有显著的不同之处。它不是依赖于关键字匹配或相似性度量进行检索,而是利用知识图谱来实现更为精细和上下文感知的检索。这种检索方式的优势在于,它不仅能够定位到相关文档,还能够识别出与查询语义和上下文紧密相关的实体及其相互之间的关系。
2. 增强的上下文理解GraphRAG通过利用知识图谱中丰富的关系信息,能够更深入地理解复杂的关系和上下文,并将这些理解整合到其响应中。这种能力使得GraphRAG在处理涉及多个实体或复杂连接的查询时,能够进行更为复杂的分析和处理。
3. 生成器的集成一旦GraphRAG通过基于图的检索识别出相关的实体和关系,其生成器就会利用这些信息来生成更加准确和具有上下文基础的响应。结构化图数据的整合,使得生成器能够制作出更加深入反映对查询及其相关知识理解的响应。
GraphRAG与RAG的简单进化GraphRAG在RAG的基础上进行了优化和改进,使其在检索、上下文理解和生成响应方面都有所提升。
图RAG与传统RAG模型的比较与优势分析
引言本文旨在探讨GraphRAG模型相对于传统RAG模型的优势,并提供一个在本地使用Llama 3.1 7B模型运行GraphRAG的分步指南。
一、上下文理解的增强### 传统RAG模型
- 检索器基于关键字匹配或密集嵌入获取相关文档。
- 难以理解实体间的复杂关系或上下文。
GraphRAG模型
- 利用知识图谱,捕捉实体间的复杂关系。
- 提供更复杂的上下文理解。
二、检索精度的提升### 传统RAG模型
- 基于相似性度量,可能无法全面捕获文档上下文或语义相关性。
GraphRAG模型
- 知识图的集成,实现更精确的上下文感知检索。
- 提高检索精度,确保生成响应基于准确信息。
三、复杂问题的有效处理### 传统RAG模型
- 对多实体或复杂关系的查询整合信息可能不一致。
GraphRAG模型
- 基于图的方法,有效整合多源信息,生成准确全面响应。
四、结构化数据的可扩展性### 传统RAG模型
- 扩展需管理大型文本语料库,随语料库增长可能面临挑战。
GraphRAG模型
- 知识图的内在结构简化检索过程,提高可扩展性。
五、减少频繁重新调整的需要### 传统RAG模型
- 更新需重新调整检索器和生成器组件。
GraphRAG模型
- 知识图可独立更新,减少模型频繁重新训练的需求。
使用Llama 3.1 7B在本地运行GraphRAG的指南### 步骤1:创建Conda环境
- 创建新的Conda环境,确保干净隔离的工作空间。
步骤2:配置设置
- 配置环境,包括端口设置和API密钥。
步骤3:自定义settings.xml
- 自定义配置文件,以控制GraphRAG设置。
结语GraphRAG通过结合知识图谱和图结构,提供了一种更高效、更准确的信息检索和生成方式,尤其适用于处理复杂和多实体的查询任务。本指南提供了在本地环境中设置和运行GraphRAG的详细步骤,帮助用户充分利用Llama 3.1 7B模型的强大功能。
<span id="2f32" data-selectable-paragraph="">conda create -n kushagra_graphollama python=3.10 -y
- **解释:**此命令使用Python 3.10设置一个名为
kushagra_graphollama
的新Conda环境。-y
标志自动确认创建,而不提示用户输入。
激活环境:
<span id="a5ce" data-selectable-paragraph="">conda activate kushagra_graphollama
- **解释:**激活新创建的Conda环境,使其成为后续命令的活动环境。
步骤2:安装GraphRAG包
接下来,我们安装GraphRAG包,该包对于集成检索增强生成功能至关重要。
<span id="db53" data-selectable-paragraph="">pip install graphrag
- **说明:**此命令将GraphRAG包安装到活动Conda环境中。确保该包在PyPI或相关存储库上可用。
步骤3:设置目录结构
我们需要一个目录来存储索引的输入数据。
<span id="f498" data-selectable-paragraph="">mkdir -p graphollama/rag/input
- **说明:**创建一个目录结构
graphollama/rag/input
。p
标志确保父目录在不存在时被创建。
第4步:更改工作目录
导航到我们将在其中执行后续命令的目录。
<span id="0309" data-selectable-paragraph="">cd graphollama
- **说明:**将当前工作目录更改为
graphollama
,这是管理文件和运行与GraphRAG相关的命令所必需的。
第5步:下载示例数据
从Project古滕贝格下载一个示例文本文件,用作索引的输入数据。
<span id="400e" data-selectable-paragraph="">curl https://gutenberg.org/cache/epub/24022/pg24022.txt > ./rag/input
- **说明:**使用
curl
从Project古滕贝格获取文本文件并将其保存到。/ rag/input
目录。此文件将作为索引过程的示例输入。
步骤6:初始化GraphRAG索引
使用GraphRAG模块初始化索引过程。
<span id="b8f7" data-selectable-paragraph="">python -m graphrag.index --init --root ./rag
- 说明:-
-init
标志准备根目录的索引。/破布
。这一步非常关键,因为它建立了初始索引结构。
更新配置文件指南
重要提示在完成初始化过程后,请务必更新您的 settings.yaml
文件。这一步是为了确保文件中的设置能够与您本地环境的特定需求相匹配。特别是,您需要调整与Llama 3.1 7B模型相关的配置,例如服务器端口和API密钥。
步骤1:打开 settings.yaml
文件首先,找到并打开您的 settings.yaml
文件。这通常位于项目的根目录下。
步骤2:调整服务器端口在文件中找到服务器端口的配置项,并将其设置为您本地环境所需的端口号。
步骤3:设置API密钥同样地,在 settings.yaml
文件中,找到API密钥的配置项,并填入您从API提供商获取的密钥。
步骤4:保存并关闭文件完成上述设置后,保存文件并关闭编辑器。
步骤5:验证配置重新启动您的应用程序,以确保新的配置已经生效。
建立索引步骤
步骤1:定位数据确定您需要索引的数据存放在根目录的哪个位置。
步骤2:执行索引操作使用适当的工具或命令来建立索引。这可能涉及到运行特定的脚本或使用索引服务。
步骤3:验证索引索引完成后,检查索引是否正确建立,并确保所有数据都已被索引。
注意事项
- 确保在建立索引之前,您的数据已经是最新状态。
- 如果遇到任何问题,检查
settings.yaml
文件中的配置是否正确无误。
<span id="1a75" data-selectable-paragraph="">python -m graphrag.index --root ./rag
- **解释:**该命令处理输入数据,并使用先前初始化的设置构建索引。它为GraphRAG系统的检索准备数据。这是一个耗时的过程,因为它使用嵌入索引和创建图表。在我的mac m2机器,它花了1小时38分钟
图1.8 索引过程截图
附加配置:settings.xml
文件的定制指南
在使用GraphRAG系统时,您可能需要根据个人或项目需求调整配置。以下是如何修改settings.xml
文件的步骤:
1. 定位 settings.xml
文件
- 文件位置:此文件在系统初始化时自动生成,包含了系统运行所需的配置信息。
2. 修改配置项
- 端口设置:确保服务器配置为在端口
11434
上运行。如果需要,找到并修改指定端口的配置行。 - API 密钥:为了保护系统访问,定义一个API密钥(例如:
ollama
)。
3. 探索和调整配置选项
- 性能优化:尝试不同的配置选项,观察它们对GraphRAG性能和行为的影响。
- 参数调整:根据您的需求,调整检索设置、文档排名和生成选项等参数。
注意事项
- 在修改配置时,请确保您了解每项设置的具体作用,以避免不当配置影响系统正常运行。
结构化内容示例以下是使用Markdown格式编写的结构化内容示例:
- 文件定位:
settings.xml
文件通常位于项目的根目录下。 - 配置修改:
- 端口:
<server_port>11434</server_port>
- API 密钥:
<api_key>ollama</api_key>
配置示例```xml <server_port>11434</server_port> <api_key>ollama</api_key> <!-
- 更多配置项 –>``` 请根据上述指南进行操作,确保您的系统配置满足项目需求。
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20240801/%E4%BB%8ERAG%E5%88%B0GraphRAG%E5%9F%BA%E4%BA%8E%E5%9B%BE%E7%9A%84%E6%A3%80%E7%B4%A2%E5%A2%9E%E5%BC%BA%E7%94%9F%E6%88%90AI%E6%8A%80%E6%9C%AF--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com