本博客文章与deepset的Tuana Çelik共同撰写。
企业搜索是通过文档数字化和知识管理提高组织效率的关键组成部分。企业搜索涵盖存储数字文件、为搜索索引文档,并根据用户查询提供相关结果。随着大型语言模型(LLM)的出现,我们可以在向用户提供结果时实现对话式体验。然而,我们需要确保LLM将响应限制在公司数据范围内,从而减轻模型的幻觉。
在本文中,我们展示了如何使用Haystack流水线和来自Amazon SageMaker JumpStart和Amazon OpenSearch Service的Falcon-40b-instruct模型构建一个针对企业搜索的端到端生成式AI应用程序。本文展示的示例的源代码可在GitHub存储库中获取。
解决方案概述
为了将生成式AI应用程序的响应限制在公司数据范围内,我们需要使用一种称为检索增强生成(RAG)的技术。使用RAG方法的应用程序从企业知识库或内容中检索与用户请求最相关的信息,将其作为上下文与用户请求一起捆绑作为提示,然后将其发送给LLM以获得响应。LLM在输入提示的最大字数方面存在限制,因此在企业的数千或数百万个文档中选择合适的段落对LLM的准确性有直接影响。
RAG技术在企业搜索中变得越来越重要。在本文中,我们展示了一种利用SageMaker JumpStart部署Falcon-40b-instruct模型并使用Haystack设计和运行检索增强型问答流水线的工作流程。最终的检索增强型工作流程包括以下高级步骤:
- 用户查询用于检索器组件,该组件进行向量搜索,从我们的数据库中检索出与上下文最相关的内容。
- 将此上下文嵌入到设计为仅从提供的上下文中生成答案的提示中。
- LLM通过仅考虑嵌入到接收到的提示中的上下文来对原始查询生成响应。
SageMaker JumpStart
SageMaker JumpStart是一个模型中心,集成了广泛的用于文本、视觉、音频和嵌入式用例的深度学习模型。它的模型中心包括来自AWS合作伙伴(如AI21、Stability AI、Cohere和LightOn)的公共和专有模型,还包括亚马逊独家开发的基础模型,如AlexaTM。其中一些模型提供了使用自己的数据进行微调的功能。SageMaker JumpStart还提供解决方案模板,用于为常见用例设置基础设施,并提供用于SageMaker机器学习(ML)的可执行示例笔记本。
Haystack
Haystack是由deepset开发的开源框架,允许开发人员编排由不同组件(如模型、向量数据库、文件转换器和无数其他模块)组成的LLM应用程序。Haystack提供了流水线和Agents两个强大的结构,用于设计各种用例的LLM应用程序,包括搜索、问答和对话式AI。它非常注重最先进的检索方法和可靠的评估指标,为您提供了一切所需,以交付一个可靠、可信赖的应用程序。您可以将流水线序列化为YAML文件,通过REST API公开它们,并根据工作负载灵活扩展它们,使您可以轻松将应用程序从原型阶段移至生产阶段。
Amazon OpenSearch
OpenSearch服务是一项完全托管的服务,可简化在AWS云中部署、扩展和操作OpenSearch。OpenSearch是一套可扩展、灵活和可扩展的开源软件套件,用于搜索、分析、安全监控和可观察性应用程序,其许可证为Apache 2.0。
近年来,机器学习技术在增强搜索方面越来越受欢迎。其中包括使用嵌入模型,一种可以将大量数据编码为n维空间的模型,其中每个实体都被编码为该空间中的一个数据点,类似的实体彼此更接近。向量数据库通过提供诸如k-NN索引之类的专用索引,提供高效的向量相似性搜索。
借助OpenSearch服务的向量数据库功能,您可以实现语义搜索、RAG与LLM、推荐引擎和搜索丰富媒体。在本文中,我们使用RAG技术使我们能够将生成式LLM与通常使用向量数据库构建的外部知识库相结合。
应用概述
下图显示了最终应用的结构。
在这个应用中,我们使用Haystack索引管道来管理上传的文档并对文档进行索引,使用Haystack查询管道从索引的文档中进行知识检索。
Haystack索引管道包括以下高级步骤:
- 上传文档。
- 初始化
DocumentStore
并对文档进行索引。
我们使用OpenSearch作为我们的DocumentStore,并使用Haystack索引管道对文件进行预处理和索引到OpenSearch中。Haystack FileConverters和PreProcessor可以让您清理和准备原始文件,使其具备自然语言处理(NLP)管道和所选择的语言模型处理的形状和格式。我们在这里使用的索引管道还使用sentence-transformers/all-MiniLM-L12-v2
为每个文档创建嵌入向量,我们可以用于高效的检索。
Haystack查询管道包括以下高级步骤:
- 我们向RAG管道发送查询。
- 一个EmbeddingRetriever组件作为过滤器,从我们在OpenSearch中索引的文档中检索出最相关的
top_k
个文档。我们在嵌入向量模型的选择上使用了我们自己的选项,以在索引时嵌入查询和文档。 - 检索到的文档被嵌入到我们提供给Falcon-40b-instruct模型的提示中。
- LLM根据检索到的文档返回响应。
对于模型部署,我们使用SageMaker JumpStart,通过简单的一键操作来简化模型的部署。尽管我们在这个示例中使用和测试了Falcon-40b-instruct模型,但您可以使用SageMaker上任何可用的Hugging Face模型。
最终的解决方案可以在haystack-sagemaker存储库中找到,并使用OpenSearch网站和文档(适用于OpenSearch 2.7)作为我们的示例数据来执行检索增强问答。
先决条件
在使用任何AWS服务之前,首先要确保我们已经注册并创建了一个AWS帐户。然后您应该创建一个管理员用户和组。有关这两个步骤的说明,请参阅设置Amazon SageMaker先决条件。
为了能够使用Haystack,您需要安装带有所需依赖项的farm-haystack
软件包。为了实现这一点,可以通过运行pip install requirements.txt
命令来使用GitHub存储库中的requirements.txt
文件。
将文档索引到OpenSearch
Haystack提供了许多与数据库的连接器,称为DocumentStores
。对于这个RAG工作流程,我们使用OpenSearchDocumentStore
。示例存储库包括一个索引管道和AWS CloudFormation模板,用于设置一个从OpenSearch网站和文档页面爬取的OpenSearchDocumentStore
。
通常,在为生产用例创建NLP应用程序时,我们最终需要考虑数据准备和清洗。这在Haystack索引管道中得到了覆盖,它允许您设计自己的数据准备步骤,最终将您的文档写入您选择的数据库。
索引管道还可以包括为文档创建嵌入向量的步骤。这对于检索步骤非常重要。在我们的示例中,我们使用sentence-transformers/all-MiniLM-L12-v2作为我们的嵌入模型。该模型用于为我们所有的索引文档创建嵌入向量,还用于在查询时嵌入用户的查询。
要将文档索引到OpenSearchDocumentStore
中,我们提供了两个选项,并在示例存储库的README中提供了详细说明。在这里,我们将步骤介绍为将文档索引到在AWS上部署的OpenSearch服务。
启动OpenSearch服务
使用提供的CloudFormation模板在AWS上设置OpenSearch服务。通过运行以下命令,您将拥有一个空的OpenSearch服务。然后,您可以选择索引我们提供的示例数据或使用您自己的数据,您可以使用Haystack索引管道进行清理和预处理。请注意,这将创建一个对外开放的实例,不建议用于生产环境。
```bash
aws cloudformation create-stack --stack-name HaystackOpensearch --template-body file://cloudformation/opensearch-index.yaml --parameters ParameterKey=InstanceType,ParameterValue=r5.large.search ParameterKey=InstanceCount,ParameterValue=3 ParameterKey=OSPassword,ParameterValue=Password123!
```
请耐心等待大约30分钟以完成堆栈的启动。您可以通过导航到AWS CloudFormation控制台的堆栈页面并查找名为HaystackOpensearch
的堆栈来检查其进度。
将文档索引到OpenSearch
既然我们有一个正在运行的OpenSearch服务,我们可以使用OpenSearchDocumentStore类连接到它并将我们的文档写入其中。
要获取OpenSearch的主机名,请运行以下命令:
```bash
aws cloudformation describe-stacks --stack-name HaystackOpensearch --query "Stacks[0].Outputs[?OutputKey=='OpenSearchEndpoint'].OutputValue" --output text
```
首先,导出以下内容:
```bash
export OPENSEARCH_HOST='your_opensearch_host'
export OPENSEARCH_PORT=443
export OPENSEARCH_USERNAME=admin
export OPENSEARCH_PASSWORD=Password123!
```
然后,您可以使用opensearch_indexing_pipeline.py
脚本预处理和索引提供的演示数据。
如果您想使用自己的数据,请修改opensearch_indexing_pipeline.py
中的索引管道,以包括您所需的FileConverter和PreProcessor设置步骤。
实施检索增强型问答流水线
既然我们在OpenSearch中索引了数据,我们可以对这些文档进行问答。对于这个RAG流水线,我们使用了在SageMaker JumpStart上部署的Falcon-40b-instruct模型。
您还可以选择从Jupyter笔记本中以编程方式部署模型。有关说明,请参阅GitHub仓库。
-
在SageMaker JumpStart上搜索Falcon-40b-instruct模型。
-
在SageMaker JumpStart上部署您的模型,并记下终端节点的名称。
-
导出以下值:
```bash export SAGEMAKER_MODEL_ENDPOINT=your_falcon_40b_instruc_endpoint export AWS_PROFILE_NAME=your_aws_profile export AWS_REGION_NAME=your_aws_region ```
-
运行
python rag_pipeline.py
。
这将启动一个命令行实用程序,等待用户的问题。例如,让我们问“如何安装OpenSearch cli?”
之所以能够得到这个结果,是因为我们在Haystack PromptTemplate中定义了我们的提示,如下所示:
```python
question_answering = PromptTemplate(prompt="给定上下文,请回答问题。如果答案不包含在下面的上下文中,请说“我不知道”。\n"
"上下文:{join(documents)};\n 问题:{query};\n 答案:", output_parser=AnswerParser(reference_pattern=r"Document\[(\d+)\]"))
```
进一步定制
您可以对解决方案中的不同元素进行其他定制,例如:
- 数据 – 我们提供了OpenSearch文档和网站数据作为示例数据。如果您选择使用自己的数据,请记得修改
opensearch_indexing_pipeline.py
脚本以适应您的需求。 - 模型 – 在这个例子中,我们使用了Falcon-40b-instruct模型。您可以自由地在SageMaker上部署和使用任何其他Hugging Face模型。请注意,更改模型可能意味着您应该将提示调整为适合处理的内容。
- 提示 – 对于这篇文章,我们创建了自己的
PromptTemplate
,指示模型根据提供的上下文回答问题,并在上下文不包含相关信息时回答“我不知道”。您可以更改此提示以尝试使用Falcon-40b-instruct的不同提示。您还可以从PromptHub中提取我们的一些提示。 - 嵌入模型 – 在检索步骤中,我们使用了一个轻量级的嵌入模型:sentence-transformers/all-MiniLM-L12-v2。但是,您也可以根据需要进行更改。请记得相应地修改
DocumentStore
中的预期嵌入维度。 - 检索的文档数量 – 您还可以选择在每个查询中要求
EmbeddingRetriever
检索的文档数量进行调整。在我们的设置中,这被设置为top_k=5。您可以尝试更改此数字,以查看是否提供更多上下文可以提高结果的准确性。
生产就绪性
本文中提出的解决方案可以加速项目开发过程中的价值实现时间。您可以构建一个易于扩展的项目,并在AWS云上的安全和隐私环境中进行。
对于安全和隐私,OpenSearch服务通过身份和访问管理以及交叉服务混淆代理预防提供数据保护。您可以采用细粒度的用户访问控制,使用户只能访问他们被授权访问的数据。此外,SageMaker为访问控制、数据保护、日志记录和监控提供可配置的安全设置。您可以使用AWS密钥管理服务(AWS KMS)密钥在静止和传输中保护数据。您还可以使用Amazon CloudWatch跟踪SageMaker模型部署或端点访问的日志。有关更多信息,请参阅使用Amazon CloudWatch监控Amazon SageMaker。
对于OpenSearch服务的高可扩展性,您可以通过调整OpenSearch服务域的大小并采用操作最佳实践来进行调整。您还可以利用自动缩放SageMaker端点的功能 – 您可以在流量增加或资源未被使用时自动调整SageMaker模型的端点。
清理
为了节省成本,请删除本文所部署的所有资源。如果您启动了CloudFormation堆栈,可以通过AWS CloudFormation控制台删除它。类似地,您可以通过SageMaker控制台删除任何可能创建的SageMaker端点。
结论
在本文中,我们展示了如何使用Haystack流水线和来自SageMaker JumpStart和OpenSearch服务的Falcon-40b-instruct模型构建一个端到端的企业搜索生成式AI应用程序。RAG方法在企业搜索中至关重要,因为它确保生成的响应是领域内的,从而减轻了幻觉的出现。通过使用Haystack流水线,我们能够编排由不同组件(如模型和向量数据库)组成的LLM应用程序。SageMaker JumpStart为我们提供了一键部署LLM的解决方案,我们使用OpenSearch服务作为索引数据的向量数据库。您可以使用本文中概述的步骤和GitHub存储库中提供的源代码,开始尝试构建用于企业生成式AI应用程序的RAG概念验证。