亚马逊AWS官方博客

使用 Amazon Kendra、LangChain 和大型语言模型根据企业数据快速构建高精度的生成式人工智能应用程序

2023 年 6 月:这篇文章已更新,涵盖了针对 RAG 使用案例优化的 Amazon Kendra Retrieve API,而 Amazon Kendra 检索器现在是 LangChain GitHub 存储库的一部分。本次修订还更新了使用 AWS Samples GitHub 存储库中的新版本示例的说明。生成式人工智能(GenAI)和大型语言模型(LLM)(例如,即将通过 Amazon BedrockAmazon Titan 提供的模型)正在改变开发人员和企业解决与自然语言处理和理解相关的传统复杂挑战的方式。LLM 带来的一些好处包括:能够为客户服务应用程序创建更强大、更引人入胜的对话式人工智能体验;通过更直观、更准确的响应提高员工的工作效率。

然而,对于这些使用案例,实现对话体验的 GenAI 应用程序必须满足两个关键标准:仅限于对公司数据进行响应,从而减少模型幻觉(错误陈述),以及根据最终用户的内容访问权限筛选响应。

要将 GenAI 应用程序限制为仅对公司数据进行响应,我们需要使用一种名为检索式增强生成(RAG)的技术。使用 RAG 方法的应用程序会从企业知识库或内容中检索与用户请求最相关的信息,将这些信息作为上下文与用户请求捆绑在一起作为提示,然后将提示发送给 LLM 以获得 GenAI 响应。LLM 对输入提示的最大字数有限制,因此,在企业成千上万或数以百万计的文档中选择正确的段落,会直接影响 LLM 的准确性。

在设计有效的 RAG 时,内容检索是确保 LLM 从企业内容中获得最相关、最简洁的上下文以生成准确响应的关键步骤。这就是 Amazon Kendra 中由机器学习(ML)驱动的高精度智能搜索发挥重要作用的地方。Amazon Kendra 是一项完全托管的服务,提供现成的语义搜索功能,可对文档和段落进行最先进的排名。您可以使用 Amazon Kendra 中的高精度搜索来获取最相关的内容和文档,从而最大限度地提高 RAG 有效载荷的质量,与使用传统或基于关键字的搜索解决方案相比,获得更好的 LLM 响应。Amazon Kendra 提供易于使用的深度学习搜索模型,这些模型已在 14 个领域进行了预训练,不需要任何机器学习专业知识,因此无需处理 RAG 实现通常所需的单词嵌入、文档分块和其他较低级别的复杂性。Amazon Kendra 提供专为 RAG 使用案例设计的 Retrieve API。使用 Retrieve API,您可以检索多达 100 个语义相关的段落,每个段落最多包含 200 个标记词,并按相关性排序。Amazon Kendra 还预置了与 Amazon Simple Storage Service(Amazon S3)、SharePoint、Confluence 和网站等常用数据源连接的连接器,并支持 HTML、Word、PowerPoint、PDF、Excel 和纯文本文件等常见文档格式。为了仅根据最终用户权限允许的文档筛选响应,Amazon Kendra 提供了支持访问控制列表(ACL)的连接器。Amazon Kendra 还提供 AWS Identity and Access Management(IAM)和 AWS IAM Identity Center(AWS Single Sign-On 的后继产品)集成,以便与客户身份提供商(如 Okta 和 Azure AD)同步用户组信息。

在这篇文章中,我们将演示如何通过将 Amazon Kendra 的功能与 LLM 相结合来实现 RAG 工作流,从而创建最先进的 GenAI 应用程序来提供有关企业内容的对话体验。Amazon Bedrock 推出后,我们将发布一篇后续文章,展示如何使用 Amazon Bedrock 实现类似的 GenAI 应用程序,敬请关注。

解决方案概览

下图显示了采用 RAG 方法的 GenAI 应用程序的架构。

我们使用 Amazon Kendra 索引从 Wiki 页面、MS SharePoint 网站、Atlassian Confluence 和 Amazon S3 这样的文档存储库等数据来源中摄取企业非结构化数据。当用户与 GenAI 应用程序交互时,流程如下:

  1. 用户向 GenAI 应用程序发出请求。
  2. 该应用程序根据用户请求向 Amazon Kendra 索引发出搜索查询。
  3. 该索引返回搜索结果,其中包含从所摄取的企业数据中摘录的相关文档。
  4. 该应用程序在 LLM 提示中发送用户请求以及从索引中检索到的数据作为上下文。
  5. LLM 根据检索到的数据返回对用户请求的简洁响应。
  6. 来自 LLM 的响应发送回给用户。

有了这种架构,您就可以根据自己的使用案例选择最合适的 LLM。LLM 选项包括我们的合作伙伴 Hugging Face、AI21 Labs、Cohere 提供的模型和其他在 Amazon SageMaker 端点上托管的模型,以及 AnthropicOpenAI 等公司的模型。有了 Amazon Bedrock,您就可以安全地选择 Amazon Titan(Amazon 自己的 LLM)或合作伙伴的 LLM(例如,来自 AI21 Labs 和 Anthropic 的具有 API 的 LLM),而您的数据无需离开 AWS 生态系统。Amazon Bedrock 将提供的其他优势包括:无服务器架构、用于调用受支持 LLM 的单一 API 以及用于简化开发人员工作流程的托管服务。

为了获得最佳结果,GenAI 应用程序需要根据用户请求和正在使用的特定 LLM 来设计提示。对话式人工智能应用程序还需要管理聊天记录和上下文。GenAI 应用程序开发人员可以使用 LangChain 等开源框架,这些框架提供了与所选 LLM 集成的模块,以及用于聊天记录管理和提示工程等活动的编排工具。我们提供了 AmazonKendraRetriever 类,该类实现了一个 LangChain retriever 接口,应用程序可以将该接口与其他 LangChain 接口(如 chains)结合使用,从 Amazon Kendra 索引中检索数据。AmazonKendraRetriever 类使用 Amazon Kendra 的 Retrieve API 对 Amazon Kendra 索引进行查询,并获取与查询最相关的摘录段落结果。我们还在 GitHub 存储库中提供了一些示例应用程序。您可以使用这篇文章中的分步指南在 AWS 账户中部署此解决方案。

先决条件

在本教程中,您需要在 Linux、Mac 或 Windows Subsystem for Linux 上安装了 Python 3.9 或更高版本的 bash 终端,以及一个 AWS 账户。我们还建议使用 AWS Cloud9 实例或 Amazon Elastic Compute Cloud(Amazon EC2)实例。

实现 RAG 工作流

要配置 RAG 工作流,请完成以下步骤:

  1. 使用提供的 AWS CloudFormation 模板创建新的 Amazon Kendra 索引。

此模板包括示例数据,其中包含 Amazon Kendra、Amazon LexAmazon SageMaker 的 AWS 在线文档。或者,如果您有 Amazon Kendra 索引并且已经为自己的数据集编制了索引,则可以使用该索引。启动堆栈大约需要 30 分钟,然后大约需要 15 分钟来同步堆栈并摄取索引中的数据。因此,请在启动堆栈后等待大约 45 分钟。记下堆栈的输出选项卡上的索引 ID 和 AWS 区域。

  1. 本教程中使用的示例应用程序要求您有权访问 Flan-T5-XL、Flan-T5-XXL、Anthropic Claud-V1 和 OpenAI-text-davinci-003 中的一个或多个 LLM。
    1. 如果您想使用 Flan-T5-XL 或 Flan-T5-XXL,请使用 Amazon SageMaker Studio Jumpstart 将这些模型部署到端点进行推理。
    2. 如果您想使用 Anthropic Claud-V1 或 OpenAI-da-vinci-003,请分别从 https://www.anthropic.com/https://openai.com/ 获取您感兴趣的 LLM 的 API 密钥。
  2. 按照 GitHub 存储库中的说明安装必备组件,包括 LangChain 和示例应用程序。
  3. 在运行示例应用程序之前,需要使用首选 LLM 的 Amazon Kendra 索引详细信息和 API 密钥或使用 Flan-T5-XL 或 Flan-T5-XXL 部署的 SageMaker 端点设置环境变量。以下是用于设置环境变量的示例脚本(请注意,只要您只使用相应的示例,只需使用 FLAN_XL_ENDPOINTFLAN_XXL_ENDPOINTOPENAI_API_KEYANTHROPIC_API_KEY 中的一个就足够了):
    export AWS_REGION="<YOUR-AWS-REGION>"
    export KENDRA_INDEX_ID="<YOUR-KENDRA-INDEX-ID>"
    export FLAN_XL_ENDPOINT="<YOUR-SAGEMAKER-ENDPOINT-FOR-FLAN-T-XL>"
    export FLAN_XXL_ENDPOINT="<YOUR-SAGEMAKER-ENDPOINT-FOR-FLAN-T-XXL>"
    export OPENAI_API_KEY="<YOUR-OPEN-AI-API-KEY>"
    export ANTHROPIC_API_KEY="<YOUR-ANTHROPIC-API-KEY>"
  4. 在命令行窗口中,切换到克隆 GitHub 存储库的 kendra_retriever_samples 子目录。您可以通过 python <sample-file-name.py> 命令行运行命令行应用程序。通过将目录更改为 samples 并运行 streamlit run app.py <anthropic|flanxl|flanxxl|openai> 来运行 streamlit Web 应用程序。
  5. 在您选择的编辑器中打开示例文件 kendra_retriever_flan_xxl.py

观察语句 result = run_chain(chain, "What's SageMaker?")。这是用户查询(“What’s SageMaker?”),该查询在使用 Flan-T-XXL 作为 LLM、使用 Amazon Kendra 作为检索器的链中运行。运行该文件时,可以观察到如下输出结果。该链将用户查询发送到 Amazon Kendra 索引,检索排名前三的结果摘录,并将这些摘录作为上下文与查询一起发送到提示中,LLM 对此作出简洁的回答。该链还提供了来源(生成答案时使用的文档的 URL)。

  1. 现在让我们通过 streamlit run app.py flanxxl 运行 Web 应用程序 app.py。在这次特定的运行中,我们使用 Flan-T-XXL 模型作为 LLM。

这次运行会打开一个带有 Web 界面的浏览器窗口。您可以输入查询,在本例中为“What is Amazon Lex?” 如以下屏幕截图所示,应用程序给出了答案,Sources(来源)部分提供了文档的 URL,从 Amazon Kendra 索引中检索这些文档摘录并在提示中作为上下文与查询一起发送给 LLM。

  1. 现在让我们再次运行 app.py,使用 streamlit run app.py anthropic 感受一下对话体验。这里使用的基础 LLM 是 Anthropic Claud-V1。

正如您在以下视频中看到的那样,LLM 根据从 Amazon Kendra 索引检索到的文档为用户的查询提供详细的答案,然后使用指向用于生成答案的源文档的 URL 来支持答案。请注意,随后的查询并未明确提及 Amazon Kendra;但是,ConversationalRetrievalChain(一种链,是 LangChain 框架的一部分,提供了一种简便的机制,用于开发从检索器实例检索的基于对话应用程序的信息,在此 LangChain 应用程序使用)管理聊天历史和上下文,以获得适当的响应。

另请注意,在以下屏幕截图中,Amazon Kendra 找到了查询的摘录答案,并列出了带有摘录的热门文档。然后,LLM 能够根据这些检索到的摘录生成更简洁的答案。

在以下各节中,我们将探讨在 Amazon Kendra 中使用生成式人工智能的两个使用案例。

使用案例 1:面向金融服务公司的生成式人工智能

金融组织通过各种数据存储库创建和存储数据,包括财务报告、法律文件和白皮书。这些组织必须遵守严格的政府法规和监督,这意味着员工需要快速找到相关、准确和可信的信息。此外,在各种数据来源中搜索和汇总洞察既繁琐又容易出错。借助 AWS 上的生成式人工智能,用户可以从各种数据来源和数据类型中快速生成答案,在企业范围内综合准确的答案。

我们选择了使用 Amazon Kendra 和 AI21 Lab 的 Jurassic-2 Jumbo Instruct LLM 的解决方案。使用 Amazon Kendra,您可以轻松地从 Amazon S3、网站和 ServiceNow 等多个数据来源摄取数据。然后,Amazon Kendra 使用 AI21 Lab 的 Jurassic-2 Jumbo Instruct LLM 对企业数据进行推理活动,如数据汇总、报告生成等。Amazon Kendra 增强了 LLM,为最终用户提供准确且可验证的信息,从而减少了 LLM 的幻觉问题。有了拟议的解决方案,财务分析师可以利用准确的数据更快地做出决策,从而快速建立详细而全面的投资组合。我们计划在不久的将来将此解决方案作为开源项目提供。

示例

利用 Kendra Chatbot 解决方案,财务分析师和审计师可以与企业数据(财务报告和协议)进行交互,从而为审计相关问题找到可靠的答案。Kendra ChatBot 在提供答案的同时还提供来源链接,并能对较长的答案进行总结。以下屏幕截图显示了与 Kendra ChatBot 的对话示例。

架构概览

下图展示了该解决方案的架构。

该工作流包括以下步骤:

  1. 财务文件和协议存储在 Amazon S3 上,并使用 S3 数据来源连接器摄取到 Amazon Kendra 索引中。
  2. LLM 托管在 SageMaker 端点上。
  3. Amazon Lex 聊天机器人用于通过 Amazon Lex Web 用户界面与用户互动。
  4. 该解决方案在 LangChain 中使用 AWS Lambda 函数,在 Amazon Kendra、Amazon Lex 和 LLM 之间进行编排。
  5. 当用户向 Amazon Lex 聊天机器人询问财务文件中的答案时,Amazon Lex 会调用 LangChain 编排工具来完成请求。
  6. 根据查询,LangChain 编排工具从 Amazon Kendra 中提取相关的财务记录和段落。
  7. LangChain 编排工具会将这些相关记录连同查询和相关提示一起提供给 LLM,以执行所需的活动。
  8. LLM 处理来自 LangChain 编排工具的请求并返回结果。
  9. LangChain 编排工具从 LLM 获取结果,然后通过 Amazon Lex 聊天机器人将结果发送给最终用户。

使用案例 2:面向医疗保健研究人员和临床医生的生成式人工智能

作为研究工作的一部分,临床医生和研究人员经常要对医学期刊或政府卫生网站上的数千篇文章进行分析。更重要的是,他们希望获得值得信赖的数据来源,用来验证和证实他们的调查发现。这一过程需要数小时的深入研究、分析和数据综合,延长了实现价值和创新的时间。借助 AWS 上的生成式人工智能,您可以连接到可信数据来源并运行自然语言查询,从而在数秒内生成对这些可信数据来源的洞察。您还可以查看用于生成响应的来源并验证来源的准确性。

我们选择了使用 Amazon Kendra 和Hugging Face 的 Flan-T5-XXL 的解决方案。首先,我们使用 Amazon Kendra 从整个语料库中的语义相关文档中识别文本片段。然后,我们利用 Flan-T5-XXL 等 LLM 的强大功能,将来自 Amazon Kendra 的文本片段作为上下文,获得简洁的自然语言答案。在这种方法中,Amazon Kendra 索引充当 RAG 机制中的通道检索器组件。最后,我们使用 Amazon Lex 为前端提供支持,为最终用户提供无缝且响应迅速的体验。我们计划在不久的将来将此解决方案作为开源项目提供。

示例

以下屏幕截图来自使用 GitHub 上提供的模板为解决方案构建的 Web 用户界面。粉色文本是来自 Amazon Kendra LLM 系统的响应,蓝色的文本是用户的问题。

架构概览

此解决方案的架构和解决方案工作流与使用案例 1 类似。

清理

为节约成本,请删除作为教程一部分部署的所有资源。如果您启动了 CloudFormation 堆栈,可以通过 AWS CloudFormation 控制台删除该堆栈。同样,您可以删除可能通过 SageMaker 控制台创建的任何 SageMaker 端点。

总结

由大型语言模型提供支持的生成式人工智能,正在改变人们从信息中获取和应用洞察的方式。但是,对于企业使用案例,必须使用检索式增强生成方法,根据企业内容生成洞察,以保持答案在领域内并减少幻觉。在 RAG 方法中,LLM 生成的洞察的质量取决于该模型所依据的检索到的信息的语义相关性,因此越来越有必要使用 Amazon Kendra 等解决方案,这些解决方案可提供现成的高精度语义搜索结果。凭借这些解决方案的 Retrieve API(专为 RAG 设计)、全面的数据来源连接器生态系统、对常见文件格式的支持以及安全性,您可以使用 Amazon Kendra 作为检索机制,快速开始在企业使用案例中使用生成式人工智能解决方案。

有关在 AWS 上使用生成式人工智能的更多信息,请参阅发布用于在 AWS 上使用生成式人工智能进行构建的新工具。您可以使用本博客中概述的方法,开始为企业 GenAI 应用程序试验和构建 RAG 概念证明(POC)。如前所述,一旦 Amazon Bedrock 推出,我们将发布后续博客,介绍如何使用 Amazon Bedrock 构建 RAG。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

Original URL: https://aws.amazon.com/blogs/machine-learning/quickly-build-high-accuracy-generative-ai-applications-on-enterprise-data-using-amazon-kendra-langchain-and-large-language-models/

关于作者

Abhinav JawadekarAbhinav Jawadekar 是 AWS 人工智能/机器学习语言服务团队的首席解决方案架构师,专注于 Amazon Kendra。Abhinav 与 AWS 客户和合作伙伴合作,协助他们在 AWS 上构建智能搜索解决方案。

Jean-Pierre Dodel 是 Amazon Kendra 的首席产品经理,负责关键战略产品能力和路线图优先级的确定。他为团队带来了丰富的企业搜索和机器学习/人工智能经验,在 7 年前加入 Amazon 之前,他曾在 Autonomy、HP 和搜索初创企业担任领导职务。

Mithil Shah 是 AWS 的机器学习/人工智能专家。目前,他通过在 AWS 上构建机器学习解决方案,协助公共部门客户改善市民生活。

Firaz Akmal 是AWS 的 Amazon Kendra 高级产品经理。他是客户倡导者,协助客户了解 AWS 上 Kendra 的搜索和生成式人工智能使用案例。工作之余,Firaz 喜欢在 PNW 的山区度过时光,或者通过女儿的视角体验世界。

Abhishek Maligehalli Shivalingaiah 是 AWS 的高级人工智能服务解决方案架构师,专注于 Amazon Kendra。他热衷于使用 Amazon Kendra、生成式人工智能和 NLP 构建应用程序。他在构建数据和人工智能解决方案,为客户和企业创造价值方面拥有约 10 年的经验。他构建了一个(个人)聊天机器人,以回答有关他的职业生涯和专业历程的问题为乐。工作之余,他喜欢为家人和朋友制作肖像,热爱艺术创作。