Azure AI 搜索不托管嵌入模型,因此其中一项挑战是为查询输入和输出创建矢量。 可以使用任何受支持的嵌入模型,但本文假定 Azure OpenAI 嵌入模型供图示。
建议使用集成矢量化进行内置数据分块和矢量化。 集成矢量化依赖于索引器、技能组,以及指向在 Azure AI 搜索外部执行的模型的内置或自定义技能。 几个内置技能指向在 Azure AI Foundry 中嵌入模型,这使得集成矢量化成为解决嵌入挑战的最简单解决方案。
如果要自行处理数据分块和矢量化,我们在示例存储库中提供了演示,展示如何与其他社区解决方案集成。
如何在矢量查询中使用嵌入模型
查询输入是矢量,或者是在查询处理过程中转换为矢量的文本或图像。 Azure AI 搜索中的内置解决方案将使用矢量器。
或者,你也可以选择将查询输入传递给你所选的嵌入模型,自己进行转换处理。 为了避免速率限制,可以在工作负荷中实现重试逻辑。 对于 Python 演示,我们使用了 tenacity。
查询输出是在搜索索引中找到的任何匹配文档。 您的搜索索引之前必须已经被加载包含一个或多个带有嵌入项的向量字段的文档。 不管使用了什么嵌入模型编制索引,都应使用相同的模型进行查询。
在同一区域中创建资源
集成向量化通常需要资源位于同一区域:
为即兴查询生成嵌入项
以下 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-002 或来自 Azure AI 计算机视觉 的 图像检索 REST API。
标准化矢量长度:确保在将矢量长度存储到搜索索引之前对其进行标准化,以提高相似性搜索的准确度和性能。 大多数预训练模型已经标准化,但并非全部如此。
微调模型:如果需要,可以根据域特定数据微调所选模型,以提高其性能以及与搜索应用程序的相关性。
测试和迭代:持续测试和完善嵌入模型集成,以实现所需的搜索性能和用户满意度。