矢量搜索是一种信息检索方法,支持对内容的数字表示形式进行索引和查询。 由于内容是数字而不是纯文本,因此匹配是基于与查询矢量最相似的矢量,这可实现跨以下类型的匹配:
- 语义或概念相似性。 例如,“dog”和“canine”在概念上相似,但语言上不同。
- 多语言内容,如英语中的“狗”和德语中的“狗”。
- 多个内容类型,如纯文本中的“狗”和狗的图像。
本文概述了 Azure AI 搜索中的矢量搜索,包括支持的方案、可用性和其他 Azure 服务的集成。
矢量搜索支持哪些方案?
矢量搜索支持以下方案:
相似性搜索。 分别使用嵌入模型或开源模型(如 OpenAI 嵌入或 SBERT)对文本进行编码。 然后,使用也编码为矢量的查询检索文档。
混合搜索。 Azure AI 搜索将混合搜索定义为在同一请求中执行矢量搜索和 关键字搜索 。 矢量支持在域级实现。 如果索引包含向量和非函数字段,则可以编写面向两者的查询。 查询并行执行,结果合并为单个响应并相应地进行排名。
多模式搜索。 在 Azure OpenAI 中使用多模式嵌入(如 OpenAI CLIP 或 GPT-4 Turbo 和 Vision) 对文本和图像进行编码,然后查询由这两种内容类型中的矢量组成的嵌入空间。
多语言搜索。 Azure AI 搜索专为扩展性而设计。 如果您拥有以多种语言训练的嵌入模型和聊天模型,可以通过索引端的自定义或内置技能,或通过查询端的向量化工具来调用它们。 若要更好地控制文本翻译,请使用 Azure AI 搜索在混合搜索方案中针对非矢量内容支持的 多语言功能 。
筛选的矢量搜索。 查询请求可以包含矢量查询和筛选表达式。 筛选器适用于文本和数值字段。 它们对于元数据筛选器以及根据筛选条件包括或排除搜索结果非常有用。 虽然矢量字段不可筛选,但可以设置可筛选的文本或数字字段。 搜索引擎可以在执行向量查询之前或之后处理筛选器。
矢量数据库。 Azure AI 搜索存储所查询的数据。 当你需要长期记忆、知识库,或用于检索增强生成(RAG)架构和以矢量为基础的应用程序的数据时,可以将其用作纯矢量索引。
Azure AI 搜索中矢量搜索的工作原理
Azure AI 搜索支持索引、存储和查询搜索索引中的矢量嵌入。 下图显示了矢量搜索的索引编制和查询工作流。
在索引端,Azure AI 搜索使用 最近的邻居算法 将类似的向量放在索引中。 在内部,它会为每个 向量字段创建矢量索引 。
如何将源内容嵌入 Azure AI 搜索,具体取决于处理方法:
对于内部处理,Azure AI 搜索在索引器管道中提供 集成的数据分块和矢量化 。 你提供所需的资源,例如 Azure OpenAI 的终结点和连接信息。 然后,Azure AI 搜索进行调用并处理转换。 此方法需要索引器、受支持的数据源和驱动分块和嵌入的技能组。
在查询端,客户端应用通常通过提示收集用户输入。 可以添加编码步骤来向量化输入,然后将向量查询发送到 Azure AI 搜索索引,以便进行相似性搜索。 与索引一样,可以使用 集成矢量化 对查询进行编码。 对于任何一种方法,Azure AI 搜索都会在结果中返回具有请求的 k
近邻 (kNN) 的文档。
Azure AI 搜索支持并行运行矢量和关键字搜索的 混合方案 ,并返回统一的结果集,这通常比单独提供比矢量或关键字搜索更好的结果。 对于混合搜索,向量和非向量内容都被引入到同一个索引中,用于处理同时运行的查询。
可用性和定价
若要通过门户和编程方式访问矢量搜索,可以使用:
- Azure 门户中的 导入和矢量化数据向导 。
- 搜索服务 REST API。
- 用于 .NET、 Python 和 JavaScript 的 Azure SDK。
- 其他 Azure 产品/服务,例如 Azure AI Foundry。
注意
在 2019 年 1 月 1 日之前创建的一些搜索服务不支持矢量工作负荷。 如果你在尝试将矢量字段添加到架构时收到错误,则原因是服务已过时。 在这种情况下,必须创建新的搜索服务来试用矢量功能。
在 2024 年 4 月 3 日之后创建的搜索服务 为矢量索引提供更高的配额。
Azure 集成和相关服务
Azure AI 搜索在 Azure AI 平台上深度集成。 下表列出了在矢量工作负荷中有用的产品。
产品 | 集成 |
---|---|
Azure AI Foundry | 在聊天操场中,“添加自己的数据”使用 Azure AI 搜索进行基础数据和对话式搜索。 操场是使用数据进行聊天的最简单快捷的方式。 |
Azure OpenAI | Azure OpenAI 提供嵌入模型和聊天模型。 演示和示例针对 text-embedding-ada-002 模型。 我们建议使用 Azure OpenAI 来生成文本嵌入。 |
Azure AI 服务 | 图像检索矢量化图像 API (预览版) 支持图像内容的矢量化。 我们建议使用此 API 来生成图像嵌入。 |
Azure 数据平台:Azure Blob 存储、Azure Cosmos DB、Azure SQL、OneLake | 可以使用索引器自动执行数据引入,然后使用集成矢量化来生成嵌入。 Azure AI 搜索可以自动为 Azure Blob 索引器、 Azure Cosmos DB for NoSQL 索引器、 Azure Data Lake Storage Gen2、 Azure 表存储中的矢量数据编制索引。 有关详细信息,请参阅将矢量字段添加到搜索索引。 |
它通常用于开源框架,如 LangChain。
矢量搜索概念
如果你不熟悉矢量,本部分将解释一些核心概念。
关于矢量搜索
矢量搜索是一种信息检索方法,其中的文档和查询表示为矢量而不是纯文本。 在矢量搜索中,机器学习模型生成源输入的矢量表示,它们可以是文本、图像或其他内容。
对内容进行数学表示提供了一种用于比较不同内容的公共语言。 如果所有内容都是矢量,则查询可以在矢量空间中查找匹配项,即使关联的原始内容使用的媒体或语言与查询不同。
为何使用矢量搜索?
当可搜索内容表示为矢量时,查询可以在类似内容中找到相近匹配项。 用于矢量生成的嵌入模型知道哪些字词和概念相似,并将生成的向量放在嵌入空间中。
例如,关于“clouds”和“fog”的矢量化源文档更有可能显示在关于“mist”的查询中,因为它们在语义上相似,即使它们在词汇上不匹配。
嵌入和矢量化
机器学习模型创建 嵌入内容或查询的特定类型的矢量表示形式。 这些模型捕获其他内容(如图像)的文本或表示形式的语义含义。
自然语言机器学习模型基于大量数据进行训练,以识别字词之间的模式和关系。 在训练期间,模型学习将任何输入表示为中间步骤(称为 编码器)中的实数向量。 训练后,可以修改模型,使中间向量表示形式成为其输出。 生成的嵌入是高维向量,其中具有类似含义的字词在向量空间中更接近。 有关嵌入的详细信息,请参阅 在 Azure AI Foundry 模型中了解 Azure OpenAI 的嵌入内容。
检索相关信息的矢量搜索的有效性取决于嵌入模型将文档和查询的含义提取到生成的向量中的有效性。 最佳模型根据它们所表示的数据类型进行了很好的训练。 可以评估现有的模型(例如 Azure OpenAI text-embedding-ada-002),可以引入你自己的直接在问题空间训练的模型,还可以微调常规用途模型。 Azure AI 搜索不会对你选择的模型施加限制,因此请选择最适合你的数据的模型。
若要为矢量搜索创建有效的嵌入,请务必考虑输入大小限制。 我们建议在生成嵌入之前按照数据分块准则进行操作。 这种最佳做法可确保嵌入准确捕获相关信息并实现更高效的矢量搜索。
什么是嵌入空间?
嵌入空间是矢量查询的库。 在 搜索索引中,嵌入空间由来自同一嵌入模型的所有向量字段构成。 机器学习模型通过将单个字词、短语、文档(用于自然语言处理)、图像或其他数据的表示形式映射到充当高维空间中坐标的实数矢量构成的表示形式,从而创建嵌入空间。
在嵌入空间中,类似的项位于一起,而不同的项则相距较远。 例如,有关不同种类的狗的文档将聚集在一起。 关于猫的文档会靠得很近,但距离狗的群集较远,不过仍然在动物的附近区域。 像云计算这样的不同概念则会更显得遥远。
在实践中,嵌入空间是抽象的,没有明确定义的、可解释的含义,但核心思想保持不变。
最近邻域搜索
在矢量搜索中,搜索引擎扫描嵌入空间中的矢量,以识别最接近查询矢量的矢量。 此方法称为 最近的邻居搜索。
最近的邻域可量化项之间的相似性。 高度矢量相似性表示原始数据也相似。 为了加快最近的邻居搜索并减少搜索空间,搜索引擎使用数据结构和数据分区。 每个向量搜索算法以不同的方式解决最接近的邻居问题,针对最小延迟、最大吞吐量、召回和内存进行优化。 为了计算相似性,相似性指标提供了用于计算距离的机制。
Azure AI 搜索支持以下算法:
分层可导航小型世界(HNSW)。 HNSW 是一种领先的 ANN 算法,针对具有未知或易失性数据分布的高召回率、低延迟应用程序进行优化。 它将高维数据点组织到分层图形结构中,该结构可实现快速、可缩放的相似性搜索,并允许在搜索准确性和计算成本之间进行可权衡。 由于该算法要求所有数据点驻留在内存中以快速随机访问,因此 HNSW 使用 矢量索引大小 配额。
详尽的 k-最近的邻域 (KNN)。 KNN 计算查询向量与所有数据点之间的距离。 它是计算密集型的,最适合较小的数据集。 由于算法不需要快速随机访问数据点,KNN 不使用矢量索引大小配额。 但是,它提供最近的邻域的全局集。
若要了解如何为 HNSW 或 KNN 指定算法、矢量配置文件和配置文件分配,请参阅创建矢量字段。
在索引创建过程中用于初始化索引的算法参数是不可变的,并且在索引生成后无法更改。 但是,可以修改影响查询时特征 (efSearch
) 的参数。
指定 HNSW 算法的字段还支持使用 查询请求 参数 "exhaustive": true
进行详尽的 KNN 搜索。 然而,情况并非如此。 如果字段已索引为 exhaustiveKnn
,则不能在查询中使用 HNSW,因为不存在能够有效搜索的额外数据结构。
近似的最近的邻域
近似近邻 (ANN) 是一类算法,用于在矢量空间中查找匹配项。 此类算法使用不同的数据结构或数据分区方法来显著减少搜索空间并加速查询处理。
ANN 算法会牺牲一些准确性,但提供可缩放且更快的近邻检索,这使得它们非常适合在现代信息检索应用程序中平衡准确性和效率。 你可以调整算法的参数,以微调搜索应用程序的召回率、延迟、内存和磁盘占用空间要求。
Azure AI 搜索将 HNSW 用于其 ANN 算法。