亚马逊AWS官方博客

使用 MongoDB Atlas 构建 RAG 应用程序,该服务现已在 Amazon Bedrock 知识库中推出



基础模型(FM)根据大量数据进行训练,使用数十亿个参数。但是,为了回答客户与特定域的私有数据相关的问题,需要参考模型训练数据来源之外的权威知识库。这通常使用一种称为检索增强生成(RAG)的技术来实现。通过从组织的内部或专有来源获取数据,RAG 无需重新训练模型即可将 FM 的功能扩展到特定域。这是改善模型输出的一种具有成本效益的方法,因此在各种情况下仍具有相关性、准确性和实用性。

Amazon Bedrock 知识库是一项完全托管的功能,可帮助您实施从摄取到检索和即时增强的整个 RAG 工作流程,而无需构建与数据来源的自定义集成,也无需管理数据流。

今天,我们宣布在 Amazon Bedrock 知识库中推出 MongoDB Atlas 作为向量存储。借助 MongoDB Atlas 向量存储集成,您可以构建 RAG 解决方案,将组织的私有数据来源安全地连接到 Amazon Bedrock 中的 FM。这种集成增加了 Amazon Bedrock 知识库支持的向量存储列表,包括 Amazon Aurora PostgreSQL 兼容版Amazon OpenSearch 无服务器的向量引擎PineconeRedis Enterprise Cloud

使用 MongoDB Atlas 和 Amazon Bedrock 知识库构建 RAG 应用程序
MongoDB Atlas 中的向量搜索由 vectorSearch 索引类型提供支持。在索引定义中,必须将包含向量数据的字段指定为向量类型。在应用程序中使用 MongoDB Atlas 向量搜索之前,您需要创建索引、摄取源数据、创建向量嵌入并将其存储在 MongoDB Atlas 集合中。要执行查询,您需要将输入文本转换为向量嵌入,然后使用聚合管线阶段,对 vectorSearch 类型索引中作为 vector 类型索引的字段执行向量搜索查询。

由于 MongoDB Atlas 与 Amazon Bedrock 知识库的集成,大部分繁重的工作都已完成。配置完向量搜索索引和知识库后,您可以将 RAG 整合到您的应用程序中。在后台,Amazon Bedrock 会将您的输入(提示)转换为嵌入,查询知识库,使用搜索结果作为上下文信息增强 FM 提示,并返回生成的响应。

我带您了解一下在 Amazon Bedrock 知识库中将 MongoDB Atlas 设置为向量存储的过程。

配置 MongoDB Atlas
首先在 AWS创建 MongoDB Atlas 集群。选择 M10 专用集群层。预置集群后,创建数据库集合。 接下来,创建数据库用户并授予其对任何数据库角色的读取和写入权限。选择密码作为身份验证方法。最后,配置网络访问权限以修改 IP 访问列表,添加 IP 地址 0.0.0.0/0 以允许从任何地方进行访问。

使用以下索引定义创建向量搜索索引

{
  "fields": [
    {
      "numDimensions": 1536,
      "path": "AMAZON_BEDROCK_CHUNK_VECTOR",
      "similarity": "cosine",
      "type": "vector"
    },
    {
      "path": "AMAZON_BEDROCK_METADATA",
      "type": "filter"
    },
    {
      "path": "AMAZON_BEDROCK_TEXT_CHUNK",
      "type": "filter"
    }
  ]
}

配置知识库
创建 AWS Secrets Manager 密钥以安全地存储 MongoDB Atlas 数据库用户凭证。选择其他作为密钥类型创建 Amazon Simple Storage Service(Amazon S3)存储桶并上传 Amazon Bedrock 文档用户指南 PDF。稍后,您将使用知识库询问有关 Amazon Bedrock 的问题。

您也可以选择使用其他文档,因为知识库支持多种文件格式(包括文本、HTML 和 CSV)。

导航到 Amazon Bedrock 控制台并参阅 Amazon Bedrock 用户指南来配置知识库。在选择嵌入模型和配置向量存储中,选择 Titan Embeddings G1 – Text 作为嵌入模型。从数据库列表中选择 MongoDB Atlas

输入 MongoDB Atlas 集群的基本信息(主机名数据库名称等)以及您之前创建的 AWS Secrets Manager 密钥的 ARN。在元数据字段映射属性中,输入向量存储的特定详细信息。这些信息应与您之前使用的向量搜索索引定义相匹配。

启动知识库创建。完成后,将数据来源(S3 存储桶数据)与 MongoDB Atlas 向量搜索索引同步

同步完成后,导航到 MongoDB Atlas 以确认数据已被摄取到您创建的集合中。

请注意每个 MongoDB Atlas 文档中的以下属性:

  • AMAZON_BEDROCK_TEXT_CHUNK – 包含每个数据块的原始文本。
  • AMAZON_BEDROCK_CHUNK_VECTOR – 包含数据块的向量嵌入。
  • AMAZON_BEDROCK_METADATA – 包含用于来源归因和丰富查询功能的额外数据。

测试知识库
是时候通过查询知识库来询问有关 Amazon Bedrock 的问题了。您需要选择基础模型。在本例中,我选择了 Claude v2 并使用“什么是 Amazon Bedrock”作为我的输入(查询)。

如果您使用不同的源文档,请相应地调整问题。

您也可以更改基础模型。例如,我切换到了 Claude 3 Sonnet。注意输出中的差异,然后选择显示来源详细信息以查看每个脚注中引用的区块。

将知识库与应用程序集成
要在 Amazon Bedrock 知识库的基础上构建 RAG 应用程序,您可以使用 RetrieveAndGenerate API,查询知识库并获得响应。

以下是使用适用于 Python 的 Amazon SDK(Boto3)的示例:

import boto3

bedrock_agent_runtime = boto3.client(
    service_name = "bedrock-agent-runtime"
)

def retrieveAndGenerate(input, kbId):
    return bedrock_agent_runtime.retrieve_and_generate(
        input={
            'text': input
        },
        retrieveAndGenerateConfiguration={
            'type': 'KNOWLEDGE_BASE',
            'knowledgeBaseConfiguration': {
                'knowledgeBaseId': kbId,
                'modelArn': 'arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0'
                }
            }
        )

response = retrieveAndGenerate("What is Amazon Bedrock?", "BFT0P4NR1U")["output"]["text"]

如果您想进一步自定义 RAG 解决方案,可以考虑使用 Retrieve API,该 API 会返回语义搜索响应,您可以将其用于 RAG 工作流程的其余部分。

import boto3

bedrock_agent_runtime = boto3.client(
    service_name = "bedrock-agent-runtime"
)

def retrieve(query, kbId, numberOfResults=5):
    return bedrock_agent_runtime.retrieve(
        retrievalQuery= {
            'text': query
        },
        knowledgeBaseId=kbId,
        retrievalConfiguration= {
            'vectorSearchConfiguration': {
                'numberOfResults': numberOfResults
            }
        }
    )

response = retrieve("What is Amazon Bedrock?", "BGU0Q4NU0U")["retrievalResults"]

注意事项

  • MongoDB Atlas 集群层 – 这种集成要求至少为 M10 的 Atlas 集群层
  • AWS PrivateLink – 出于本演示的目的,MongoDB Atlas 数据库 IP 访问列表配置为允许从任何地方进行访问。对于生产部署,建议使用 AWS PrivateLink 来让 Amazon Bedrock 与您的 MongoDB Atlas 集群建立安全连接。有关详细信息,请参阅 Amazon Bedrock 用户指南(位于 MongoDB Atlas 下)。
  • 向量嵌入大小 – 向量索引和嵌入模型的维度大小应相同。例如,如果您计划使用 Cohere Embed(维度大小为 1024)作为知识库的嵌入模型,请务必相应地配置向量搜索索引。
  • 元数据筛选条件 – 您可以为源文件添加元数据,以根据应用的元数据筛选条件检索明确定义的语义相关区块子集。请参阅文档,了解有关如何使用元数据筛选条件的更多信息。

现已推出
Amazon Bedrock 知识库中的 MongoDB Atlas 向量存储已在美国东部(弗吉尼亚州北部)和美国西部(俄勒冈州)区域推出。请务必查看完整区域列表以了解将来的更新。

了解详情

试用 MongoDB Atlas 与 Amazon Bedrock 知识库的集成! 向 AWS re:Post for Amazon Bedrock 发送反馈或通过您平时的 AWS 联系人发送反馈,并通过 community.aws 与生成式人工智能构建者社区互动。

Abhishek