使用 LlamaIndex 和 Amazon Bedrock 构建强大的 RAG 管道
由 Shreyas Subramanian 和 Jerry Liu 于 2024 年 9 月 5 日撰写,文章发布于 Amazon Bedrock、生成式 AI 和 技术操作指南 直接链接 评论 分享
这篇文章与 LlamaIndex 的 Jerry Liu 合作撰写。
关键要点
RAG 技术:检索增强生成RAG结合外部数据源的丰富知识与大型语言模型LLM的生成能力,适用于解决复杂任务。LlamaIndex 功能:提供开放源代码的框架,支持构建生产级 RAG 管道,集成多种 LLM。Amazon Bedrock:提供高性能基础模型的托管服务,支持定制化生成 AI 应用,具备低延迟推断和模型评估等企业功能。进阶 RAG 样式:包括简单 RAG 管道、路由查询、子问题查询和状态化代理 RAG。检索增强生成RAG技术已成为增强大型语言模型LLM能力的强大手段。RAG 通过将外部数据源中存储的庞大知识与 LLM 的生成能力相结合,使得处理复杂的知识和创造性任务成为可能。如今,RAG 技术已被大小企业广泛应用,特别是在解决基于文档的问题回答和其他分析类型时。
尽管构建一个简单的 RAG 系统相对容易,但要使用先进模式构建生产级 RAG 系统却具有挑战性。生产 RAG 管道通常需处理更大体量和更复杂的数据,并且必须达到更高的质量标准。开发者面临的一个普遍挑战是响应质量低,RAG 管道往往无法充分回答大量问题。这可能是由于多种原因造成的,以下是一些最常见的原因:
挑战类型描述检索质量差缺少回答问题所需的相关上下文。回答不完整相关上下文部分存在但未完全提供,生成的输出无法完全解答输入问题。虚假回答尽管存在相关上下文,但模型无法提取相关信息以回答问题。这就需要在查询理解、检索和生成组件上采用更先进的 RAG 技术,以处理这些失败模式。
LlamaIndex 的角色
举例说明一下 LlamaIndex 是一个开源库,提供简单和高级技术,帮助开发者构建生产级 RAG 管道。它提供灵活和模块化的框架,用于构建和查询文档索引,集成多种 LLM,并实现先进的 RAG 模式。
Amazon Bedrock 是提供高性能基础模型的托管服务,通过统一的 API 访问领先 AI 供应商的模型,支持安全构建和定制生成 AI 应用。主要的高级功能包括使用您自己的数据进行模型定制与微调,以及通过从配置的知识库检索上下文来增强模型输出。
构建简单的 RAG 管道
RAG 的核心是从外部数据源中检索相关信息,并用于增强传递给 LLM 的提示。这允许 LLM 生成基于事实知识和针对特定查询定制的响应。
在 Amazon Bedrock 的 RAG 工作流中,来自配置知识库的文档经过预处理,拆分成块,嵌入向量,并在向量数据库中建立索引。这样,能在运行时高效检索相关信息。当用户查询到来时,使用相同的嵌入模型将查询文本转换为向量表示。查询向量与索引的文档向量进行比较,以识别知识库中最具有语义相似性的块。检索到的块提供与用户查询相关的额外上下文。这些上下文信息在传递给基础模型之前,会附加到原始用户提示中。通过将从知识库提取的相关数据增强提示,模型的输出可以利用组织的专有信息源。这一 RAG 过程还可以通过代理进行编排,代理使用基础模型确定何时查询知识库以及如何将检索到的上下文纳入工作流中。
以下是使用 LlamaIndex 构建 RAG 管道的简化示例:
pythonfrom llamaindex import SimpleDirectoryReader VectorStoreIndex
加载文档
documents = SimpleDirectoryReader(data/)loaddata()
创建向量存储索引
index = VectorStoreIndexfromdocuments(documents)
查询索引
response = indexquery(法国的首都是哪里?)
打印响应
print(response)
该管道包括以下步骤:1 使用 SimpleDirectoryReader 从 “data/” 加载文档。2 从加载的文档创建 VectorStoreIndex,该索引将文档转换为捕获其语义含义的数字表示向量。3 使用 “法国的首都在哪里?” 查询索引。该索引使用相似度度量识别与查询最相关的文档。4 然后使用检索到的文档增强基础模型的输入提示,生成基于合并信息的响应。
路由查询
RouterQueryEngine 允许根据查询的性质将查询路由到不同的索引或查询引擎。例如,可以将摘要问题路由到摘要索引,而将事实性问题路由到向量存储索引。
以下示例代码来自演示笔记本,展示了 RouterQueryEngine 的使用:
pythonfrom llamaindex import SummaryIndex VectorStoreIndexfrom llamaindexcorequeryengine import RouterQueryEngine
创建摘要和向量索引
summaryindex = SummaryIndexfromdocuments(documents)vectorindex = VectorStoreIndexfromdocuments(documents)
定义查询引擎
summaryqueryengine = summaryindexasqueryengine()vectorqueryengine = vectorindexasqueryengine()
创建路由查询引擎
queryengine = RouterQueryEngine( queryenginetools=[ summaryqueryengine vectorqueryengine ])
查询引擎
response = queryenginequery(文档的主要观点是什么?)
子问题查询
SubQuestionQueryEngine 将复杂查询分解为更简单的子查询,然后组合每个子查询的答案以生成综合响应。这在跨多个文档查询时特别有用。它首先将复杂查询拆解成每个相关数据源的子问题,然后收集中间响应,并综合每个子查询的相关信息生成最终的响应。
以下是使用 SubQuestionQueryEngine 的示例:
pythonfrom llamaindexcorequeryengine import SubQuestionQueryEngine
创建子问题查询引擎
subquestionqueryengine = SubQuestionQueryEnginefromdefaults( # 定义生成子问题和回答的工具)
查询引擎
response = subquestionqueryenginequery( 比较 Uber 和 Lyft 在 2020 年至 2021 年的营收增长)
状态化代理 RAG
代理化的 RAG 采用 LLM 来推理查询,并决定使用哪些工具如索引或查询引擎以及使用的顺序。这使得 RAG 管道更加动态和自适应。下图展示了 Amazon Bedrock 上代理化 RAG 的工作原理。
代理化 RAG 在 Amazon Bedrock 中结合了代理和知识库的能力,以启用 RAG 工作流。代理作为智能编排者,可以在其工作流中查询知识库,以检索相关信息和上下文,增强基础模型生成的响应。
在用户输入的初步预处理后,代理进入编排循环。在此循环中,代理调用基础模型,生成一条逻辑,概述代理应采取的下一步。某一步可以查询连接的知识库,以从索引文档和数据源中检索补充上下文。如果认为知识库查询是有益的,代理将特别调用 InvokeModel 生成知识库响应。这会根据与当前上下文的语义相似性从知识库中检索相关文档块。
以下是使用 ReAct 代理的示例:
pythonfrom llamaindexcoreagent import ReActAgent
使用定义的工具创建 ReAct 代理
agent = ReActAgentfromtools( queryenginetools llm=llm)
与代理聊天
response = agentchat(Lyft 在 2021 年的营收增长是多少?)
ReAct 代理将分析查询,并决定使用 Lyft 10K 工具还是其他工具来回答问题。
LlamaCloud 和 LlamaParse
LlamaCloud 是 LlamaIndex 生态环境中的一个重要进展,提供了专为企业级上下文化应用定制的全面托管服务。此服务使 AI 工程师能够专注于开发核心业务逻辑,简化数据整理的复杂过程。
其中一个关键组件是 LlamaParse,它是一种私有解析引擎,能够处理复杂的、半结构化的文档,能够与 LlamaIndex 的输入和检索管道无缝集成。另一个关键组件是管理式输入和检索 API,方便从不同源加载、处理和存储数据。
快橙加速器ios企业版这些功能共同提升了对大量生产数据的处理能力,增强了响应质量,并在 RAG 应用中解锁了前所未有的上下文感知问题回答能力。
将 Amazon Bedrock 和 LlamaIndex 集成以构建高级 RAG 管道
在本节中,我们展示如何结合 LlamaParse、LlamaIndex 和 Amazon Bedrock 服务包括 LLM、嵌入模型和 Bedrock 知识库构建高级 RAG 堆栈。
使用 LlamaParse 和 Amazon Bedrock 的高层步骤如下:
下载您的源文档。使用 Python SDK 将文档发送到 LlamaParse:pythonfrom llamaparse import LlamaParsefrom llamaindexcore import SimpleDirectoryReader
parser = LlamaParse( apikey=osenvironget(LLAMACLOUDAPIKEY) resulttype=markdown numworkers=4 verbose=True language=en)

fileextractor = {pdf parser}reader = SimpleDirectoryReader( inputdir=data/10k/ fileextractor=fileextractor)
等待解析作业完成,将结果 Markdown 文档上传至 Amazon Simple Storage Service (Amazon S3)。使用源文档创建 Amazon Bedrock 知识库。从 Amazon Bedrock 选择您偏好的嵌入和生成模型:pythonllm = Bedrock(model=anthropicclaudev2)embedmodel = BedrockEmbedding(model=amazontitanembedtextv1)
使用 LlamaIndex 实现高级 RAG 模式。在以下示例中,我们使用 SubQuestionQueryEngine 和为 Amazon Bedrock 知识库专门创建的检索器:pythonfrom llamaindexretrieversbedrock import AmazonKnowledgeBasesRetriever
最后,使用您的问题查询索引:pythonresponse = await queryengineaquery(比较 Uber 和 Lyft 从 2020 年到 2021 年的收入增长)
我们在一个现实世界的复杂示例中使用 LlamaParse,询问关于美国银行 2023 年第三季度财务结果的文档的问题。以下是一个来自 完整幻灯片48 张复杂幻灯片!的示例幻灯片。
使用上述程序,我们询问“从 3Q20 到 3Q23 数字家庭/关系的趋势是什么?”以下是使用 LlamaIndex 工具生成的答案与人类注释的参考答案的对比。
LlamaIndex LlamaParse答案参考答案数字家庭/关系的趋势显示,从 3Q20 到 3Q23 逐步增加。在 3Q20,数字家庭/关系数为 550K,3Q21 增加到 645K,3Q22 增加到 672K,最终在 3Q23 达到 716K。这表明在报告季度中家庭和关系的数字服务采纳持续增长。趋势显示,从 645000 在 3Q20 到 716000 在 3Q23,数字家庭/关系稳步增加。数字采纳比例在相同期间也从 76 增加到 83。以下是示例笔记本,以在您自己的示例中尝试这些步骤。请注意先决条件步骤,并在测试后清理资源。 使用 LlamaParse 上载到 S3 的知识库 与 Bedrock 知识库和 LlamaIndex SubQuestionQueryEngine的代理 RAG
结论
在本篇文章中,我们探讨了使用 LlamaIndex 和 Amazon Bedrock 的各种高级 RAG 模式。要深入了解 LlamaIndex 的功能及其与 Amazon Bedrock 的集成,请访问以下资源:
LlamaIndex 文档Amazon Bedrock 用户指南LlamaIndex 示例 GitHub 仓库通过结合 LlamaIndex 和 Amazon Bedrock 的力量,您可以构建强大且复杂的 RAG 管道,充分发挥 LLM 在知识密集型任务中的潜力。
关于作者
Shreyas Subramanian 是首席数据科学家,通过使用机器学习解决客户在 AWS 平台上的业务挑战。Shreyas 在大规模优化和机器学习方面具有背景,并在利用机器学习和强化学习加速优化任务方面拥有经验。
Jerry Liu 是 LlamaIndex 的联合创始人兼首席执行官,负责构建 LLM 应用的数据框架。在此之前,他在机器学习、研究和初创公司之间交叉的领域工作。他领导了 Robust Intelligence 的机器学习监测团队,并在 Uber ATG 从事自动驾驶 AI 研究,同时在 Quora 工作过推荐系统。
使用 Amazon SageMaker 推理 AudioCraft MusicGen 模型 机器学习
使用 Amazon SageMaker 进行 AudioCraft MusicGen 模型推理作者:Pavan Kumar Rao Navule David John Chakram Sudhansh...
利用 AWS 加强电信安全 安全博客
使用 Amazon SageMaker 进行 AudioCraft MusicGen 模型推理作者:Pavan Kumar Rao Navule David John Chakram Sudhansh...