为搜索查询和文档生成嵌入项

Azure AI 搜索不托管矢量化模型,因此你面临的挑战之一是为查询输入和输出创建嵌入项。 你可以使用任何嵌入模型,但本文假设你使用的是 Azure OpenAI 嵌入模型。

建议使用集成矢量化进行内置数据分块和矢量化。 集成矢量化依赖于索引器、技能组,以及指向在 Azure AI 搜索外部执行的模型的内置或自定义技能。

如果要自行处理数据分块和向量化,我们在示例存储库中提供了演示,展示如何与其他社区解决方案集成。

如何在矢量查询中使用嵌入模型

  • 查询输入是矢量,或者是在查询处理过程中转换为矢量的文本或图像。 Azure AI 搜索中的内置解决方案将使用矢量器。

    或者,你还可以通过将查询输入传递给所选的嵌入模型来自行处理转换。 为了避免速率限制,可以在工作负荷中实现重试逻辑。 对于 Python 演示,我们使用了 tenacity

  • 查询输出是在搜索索引中找到的任何匹配文档。 搜索索引之前必须已加载那些具有一个或多个带嵌入项的矢量字段的文档。 不管使用了什么嵌入模型编制索引,都应使用相同的模型进行查询。

在同一区域中创建资源

如果想要同一区域中的资源,请从以下区域开始:

  1. 检查文本嵌入模型的区域

  2. 查找 Azure AI 搜索的相同区域

为即兴查询生成嵌入项

以下 Python 代码将生成一个嵌入,可以将其粘贴到矢量查询的“values”属性中。

!pip install openai

import openai

openai.api_type = "azure"
openai.api_key = "YOUR-API-KEY"
openai.api_base = "https://YOUR-OPENAI-RESOURCE.openai.azure.com"
openai.api_version = "2024-02-01"

response = openai.Embedding.create(
    input="How do I use Python in VSCode?",
    engine="text-embedding-ada-002"
)
embeddings = response['data'][0]['embedding']
print(embeddings)

输出是 1536 个维度的矢量数组。

有关嵌入模型集成的提示和建议

  • 确定用例:评估具体用例,其中的矢量搜索功能的嵌入模型集成可以为搜索解决方案增加价值。 这可能包括将图像内容与文本内容进行匹配、进行跨语言搜索,或者查找类似文档。
  • 设计分块策略:嵌入模型对可以接受的令牌数有限制,这为大型文件引入了数据分块要求。 有关详细信息,请参阅“为矢量搜索解决方案将大型文档分块”。
  • 优化成本和性能:矢量搜索可能会占用大量资源,并且存在最大限制,因此请考虑仅对包含语义的字段进行矢量化。 减少矢量大小,以便可以以相同价格存储更多矢量。
  • 选择正确的嵌入模型:为具体用例选择适当的模型,例如用于基于文本的搜索的字词嵌入或用于视觉搜索的图像嵌入。 考虑使用预训练模型,例如 OpenAI 中的 text-embedding-ada-002Azure AI 计算机视觉中的图像检索 REST API。
  • 标准化矢量长度:确保在将矢量长度存储到搜索索引之前对其进行标准化,以提高相似性搜索的准确度和性能。 大多数预训练模型已经标准化,但并非全部如此。
  • 微调模型:如果需要,可以根据域特定数据微调所选模型,以提高其性能以及与搜索应用程序的相关性。
  • 测试和迭代:持续测试和完善嵌入模型集成,以实现所需的搜索性能和用户满意度。

后续步骤