你当前正在访问 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 嵌入模型的集成向量化不需要资源位于同一区域,但使用相同的区域可以提高性能并减少延迟。

若要对资源使用相同的区域,请执行以下操作:

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

  2. 检查 Azure AI 搜索的区域可用性

  3. 在同一区域中创建 Azure OpenAI 资源和 Azure AI 搜索服务。

小窍门

想在混合查询中使用语义排序,或在 AI 扩充自定义技能中使用机器学习模型吗? 选择提供这些功能的 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-KEYYOUR-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 个维度的矢量数组。