亚马逊AWS官方博客

Amazon DocumentDB(与 MongoDB 兼容)向量搜索现已正式发布



今天,我们宣布正式发布适用于 Amazon DocumentDB(与 MongoDB 兼容)的向量搜索,这是一项新的内置功能,可让您在文档数据库中以毫秒级响应时间存储、索引和搜索数百万个向量。

向量搜索是机器学习(ML)中使用的一项新兴技术,通过使用距离或相似度指标比较向量表示来查找与给定数据相似的数据点。向量是由托管在 Amazon Bedrock、Amazon SageMaker 和其他开源或专有机器学习服务中的大型语言模型(LLM)创建的非结构化数据的数字表示。这种方法可用于借助检索式增强生成(RAG)模型方法创建生成式人工智能(AI)应用程序,例如直观搜索、产品推荐、个性化和聊天机器人。例如,如果您的数据集包含电影的单个文档,则可以根据共享上下文(例如“船”、“悲剧”或“根据真实故事改编的电影”)进行语义搜索,查找与《泰坦尼克号》相似的电影,而不仅仅是匹配关键字。

借助 Amazon DocumentDB 向量搜索,您可以根据细微的含义和上下文有效搜索数据库,而无需耗费时间和成本来管理单独的向量数据库基础设施。Amazon DocumentDB 还提供完全托管、可扩展、安全且高度可用的基于 JSON 的文档数据库,为您带来便利。

开始使用 Amazon DocumentDB 向量搜索
向量搜索功能可以在基于实例的 Amazon DocumentDB 5.0 集群上使用。要实施向量搜索应用程序,您可以使用文档中字段的嵌入模型生成向量,并将向量与源数据并排存储在 Amazon DocumentDB 中。

接下来,在向量字段上创建向量索引,这将有助于检索相似向量,并且可以使用语义搜索来搜索 Amazon DocumentDB 数据库。最后,使用相同的嵌入模型将用户提交的查询转换为向量,获取语义相似的文档并将其返回给客户端。

下面,我们来看看如何在 Amazon DocumentDB 上使用向量搜索实施简单的语义搜索应用程序。

步骤 1.使用 Amazon Titan Embeddings 模型创建向量嵌入
我们使用 Amazon Titan Embeddings 模型来创建嵌入向量。Amazon Titan Embeddings 模型可在无服务器生成式人工智能服务 Amazon Bedrock 中使用。您可以使用单个 API 轻松访问,无需管理任何基础设施。

prompt = "I love dog and cat."
response = bedrock_runtime.invoke_model(
    body= json.dumps({"inputText": prompt}),
    modelId='amazon.titan-embed-text-v1',
    accept='application/json',
    contentType='application/json'
)
response_body = json.loads(response['body'].read())
embedding = response_body.get('embedding')

返回的向量嵌入如下所示:

[0.82421875, -0.6953125, -0.115722656, 0.87890625, 0.05883789, -0.020385742, 0.32421875, -0.00078201294, -0.40234375, 0.44140625, ...]

步骤 2.插入向量嵌入并创建向量索引
您可以使用 insertMany( [{},...,{}] ) 操作和要添加到 Amazon DocumentDB 集合的文档列表来添加生成的向量嵌入。

db.collection.insertMany([
    {sentence: "I love a dog and cat.", vectorField: [0.82421875, -0.6953125,...]},
    {sentence: "My dog is very cute.", vectorField: [0.05883789, -0.020385742,...]},
    {sentence: "I write with a pen.", vectorField: [-0.020385742, 0.32421875,...]},
  ...
]);

您可以使用 createIndex 命令创建向量索引。Amazon DocumentDB 使用带平面压缩的反向文件(IVFFLAT)向量索引执行近似最近邻(ANN)搜索。此功能支持三个距离指标:欧几里得、余弦和内积。我们将使用欧几里得距离,来衡量空间中两点间的直线距离。欧几里得距离越小,向量间距离越近。

db.collection.createIndex (
   { vectorField: "vector" },
   { "name": "index name",
     "vectorOptions": {
        "dimensions": 100, // the number of vector data dimensions
        "similarity": "euclidean", // Or cosine and dotProduct
        "lists": 100 
      }
   }
);

步骤 3. 从 Amazon DocumentDB 搜索向量嵌入
现在,您可以使用 $search 中的新聚合管道运算符在文档中搜索相似的向量。搜索“I like pets”的示例代码如下:

db.collection.aggregate ({
  $search: {
    "vectorSearch": {
      "vector": [0.82421875, -0.6953125,...], // Search for ‘I like pets’
      "path": vectorField,
      "k": 5,
      "similarity": "euclidean", // Or cosine and dotProduct
      "probes": 1 // the number of clusters for vector search
      }
     }
   });

此代码将返回诸如“I love a dog and cat.”之类语义上相似的搜索结果。

要了解更多信息,请参阅 Amazon DocumentDB 文档。要查看更实用的示例(使用 Amazon DocumentDB 进行电影语义搜索),请在 GitHub 存储库中查找 Python 源代码和数据集。

现已推出
现在,所有在已推出 Amazon DocumentDB 的 AWS 区域使用基于实例的 Amazon DocumentDB 5.0 集群的客户均可使用 Amazon DocumentDB 向量搜索,无需支付额外费用。在 Amazon DocumentDB 上存储、索引和搜索向量嵌入时,将收取标准计算、I/O、存储和备份费用。

要了解更多信息,请参阅 Amazon DocumentDB 文档;如有反馈,请发送至 AWS re:Post for Amazon DocumentDB 或通过您通常的 AWS Support 联系方式发送反馈。

Channy