你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure AI 搜索不托管嵌入模型,因此你负责为查询输入和输出创建矢量。 选择以下方法之一:
| 方法 | DESCRIPTION |
|---|---|
| 集成矢量化 | 在 Azure AI 搜索中使用内置数据分块和矢量化。 此方法依赖于索引器、技能组和指向外部嵌入模型的内置或自定义技能,例如,Microsoft Foundry 中的模型。 |
| 手动矢量化 | 自行管理数据分块和矢量化。 在编制索引时,需要将预先矢量化的文档推送到搜索索引中的矢量字段中。 若要进行查询,请向搜索引擎提供预计算矢量。 有关此方法的演示,请参阅 azure-search-vector-samples GitHub 存储库。 |
我们建议在大多数情况下采用集成矢量化方法。 任何受支持的嵌入模型均可使用,但本文使用 Azure OpenAI 模型进行演示。
如何在矢量查询中使用嵌入模型
嵌入模型为查询输入和查询输出生成矢量。 查询输入包括:
在查询处理过程中转换为矢量的文本或图像。 作为集成矢量化的一部分,矢量化器将执行此任务。
预计算矢量。 可以通过将查询输入传递给所选的嵌入模型来生成这些矢量。 为了避免速率限制,可以在工作负荷中实现重试逻辑。 我们的 Python 演示使用了 tenacity。
根据查询输入,搜索引擎从搜索索引中检索匹配的文档。 这些文档是查询输出。
搜索索引必须已包含符合以下条件的文档:嵌入项已在文档中填充一个或多个矢量字段。 可以通过集成或手动矢量化创建这些嵌入项。 若要确保结果准确,请使用相同的嵌入模型编制索引和执行查询。
嵌入模型集成的提示
确定用例。 评估具体用例,其中的矢量搜索功能的嵌入模型集成可以为搜索解决方案增加价值。 例如,多模态搜索(将图像内容与文本内容进行匹配)、多语言搜索和相似度搜索。
设计分块策略。 嵌入模型对可接受的标记数量有限制,因此对于大文件来说,必须执行数据分块。
优化成本和性能。 矢量搜索资源消耗大,且有最大限制,因此只对包含语义含义的字段进行矢量化。 降低矢量大小,以相同价格存储更多矢量。
选择合适的嵌入模型。 根据用例选择合适的模型,例如,对于基于文本的搜索,选择单词嵌入;对于视觉搜索,选择图像嵌入。 考虑使用预训练模型,例如 OpenAI 的 text-embedding-ada-002 或 Foundry Tools 中的 Azure Vision 的图像检索 REST API。
规范化矢量长度。 为了提高相似度搜索的准确性和性能,在将矢量存储到搜索索引之前,对矢量长度进行规范化。 大多数预训练模型已经过规范化处理。
微调模型。 如果需要,可以根据域特定数据微调模型,以提高其性能以及与搜索应用程序的相关性。
测试和迭代。 持续测试和完善嵌入模型集成,以实现所需的搜索性能和用户满意度。
在同一区域中创建资源
尽管使用 Azure OpenAI 嵌入模型的集成向量化不需要资源位于同一区域,但使用相同的区域可以提高性能并减少延迟。
若要对资源使用相同的区域,请执行以下操作:
检查文本嵌入模型的区域可用性。
在同一区域中创建 Azure OpenAI 资源和 Azure AI 搜索服务。
在 Foundry 中选择嵌入模型
在 Foundry 门户中将知识添加到代理工作流时,可以选择创建搜索索引。 向导将指导你完成这些步骤。
其中一步是选择一个嵌入模型来矢量化你的纯文本内容。 支持以下模型:
- text-embedding-3-small
- text-embedding-3-large
- text-embedding-ada-002
- Cohere-embed-v3-english
- Cohere-embed-v3-multilingual
模型必须已经部署,并且你必须拥有访问权限。 有关详细信息,请参阅 Foundry 模型的部署概述。
为即兴查询生成嵌入项
如果不想使用集成矢量化,可以手动生成嵌入并将其粘贴到矢量查询的 vectorQueries.vector 属性中。 有关详细信息,请参阅在 Azure AI 搜索中创建矢量查询。
以下示例假设采用 text-embedding-ada-002 模型。 请将 YOUR-API-KEY 和 YOUR-OPENAI-RESOURCE 替换为 Azure OpenAI 资源详细信息。
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
class Program
{
static async Task Main(string[] args)
{
var apiKey = "YOUR-API-KEY";
var apiBase = "https://YOUR-OPENAI-RESOURCE.openai.azure.com";
var apiVersion = "2024-02-01";
var engine = "text-embedding-ada-002";
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}");
var requestBody = new
{
input = "How do I use C# in VS Code?"
};
var response = await client.PostAsync(
$"{apiBase}/openai/deployments/{engine}/embeddings?api-version={apiVersion}",
new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json")
);
var responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
}
输出是 1,536 个维度的矢量数组。