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

Azure AI 搜索不托管嵌入模型,因此你负责为查询输入和输出创建矢量。 选择以下方法之一:

方法 Description
集成矢量化 在 Azure AI 搜索中使用内置数据分块和矢量化。 此方法依赖于索引器、技能集和指向外部嵌入模型的内置或自定义技能,例如 Azure AI Foundry 中的索引器、技能集和自定义技能。
手动矢量化 自行管理数据分块和矢量化。 若要编制索引,可将 预先编辑的文档推送 到搜索索引中的向量字段。 若要进行查询,请 向搜索引擎提供预计算向量 。 有关此方法的演示,请参阅 azure-search-vector-samples GitHub 存储库。

建议对大多数方案进行集成矢量化。 尽管可以使用任何受支持的嵌入模型,但本文使用 Azure OpenAI 模型进行演示。

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

嵌入模型为查询输入和查询输出生成矢量。 查询输入包括:

  • 在查询处理期间转换为矢量的文本或图像。 作为集成向量化的一部分, 向量器 将执行此任务。

  • 预计算向量。 可以通过将查询输入传递给所选的嵌入模型来生成这些向量。 若要避免 速率限制,请在工作负荷中实现重试逻辑。 我们的 Python 演示 使用 tenacity

根据查询输入,搜索引擎从搜索索引中检索匹配的文档。 这些文档是查询输出。

搜索索引必须已包含包含一个或多个通过嵌入填充的矢量字段的文档。 可以通过集成或手动矢量化创建这些嵌入内容。 若要确保结果准确,请使用相同的嵌入模型进行索引和查询。

关于模型嵌入集成的提示

  • 确定用例。 分析嵌入模型集成向量搜索功能为您的搜索解决方案增加价值的特定用例。 示例包括 多模态搜索、匹配图像与文本内容、多语言搜索和相似性搜索。

  • 设计分块策略。 嵌入模型对接受的令牌数有限制,因此对于大型文件来说, 数据分块 是必需的。

  • 优化成本和性能。 矢量搜索是资源密集型且受最大限制的约束,因此仅向量化包含语义含义的字段。 降低矢量大小 ,以存储相同价格的更多向量。

  • 选择正确的嵌入模型。 为用例选择模型,例如基于文本的搜索的单词嵌入或视觉搜索的图像嵌入。 请考虑预先训练的模型,例如 OpenAI 中的文本嵌入-ada-002 或 Azure AI 视觉中的图像检索 REST API。

  • 规范化矢量长度。 为了提高相似性搜索的准确性和性能,请在将矢量长度存储在搜索索引中之前规范化矢量长度。 大多数预先训练的模型已经规范化。

  • 微调模型。 如果需要,可以微调模型,使用您领域特定的数据,以提高模型在搜索应用程序中的性能和相关性。

  • 测试和迭代。 持续测试和优化嵌入模型集成,以实现所需的搜索性能和用户满意度。

在同一区域中创建资源

尽管使用 Azure OpenAI 嵌入模型的集成向量化不需要资源位于同一区域,但使用相同的区域可以提高性能并减少延迟。

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

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

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

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

小窍门

想要在混合查询中使用语义排名,或在AI 增强自定义技能中使用机器学习模型吗? 选择提供这些功能的 Azure AI 搜索区域。

在 Azure AI Foundry 中选择嵌入模型

Azure AI Foundry 门户中将知识添加到代理工作流时,可以选择创建搜索索引。 向导将指导你完成这些步骤。

一个步骤涉及选择嵌入模型来向量化纯文本内容。 支持以下模型:

  • text-embedding-3-small
  • 文本嵌入-3-大规模 (text-embedding-3-large)
  • text-embedding-ada-002
  • Cohere-embed-v3-english
  • Cohere-embed-v3-multilingual

模型必须已部署,并且必须具有访问它的权限。 有关详细信息,请参阅 Azure AI 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 个维度的矢量数组。