Azure AI 搜索中的矢量
矢量搜索是信息检索中的一种方法,支持对内容的数字表示形式进行索引编制和查询执行。 由于内容是数字而不是纯文本,因此匹配是基于与查询矢量最相似的矢量,这可实现跨以下类型的匹配:
- 语义或概念相似(“狗”和“犬”,概念相似但语言不同)
- 多语言内容(英语中的“dog”与中文中的“狗”)
- 多个内容类型(纯文本中的“狗”与图像文件中狗的照片)
本文提供了对 Azure AI 搜索中的矢量的概况介绍。 其中还解释了与其他 Azure 服务的集成,以及与矢量搜索开发相关的术语和概念。
建议阅读本文以了解背景信息,但如果希望立即开始使用,请执行以下步骤:
还可以从矢量快速入门或 GitHub 上的代码示例开始。
矢量搜索支持哪些方案?
矢量搜索适合的方案包括:
相似性搜索。 使用嵌入模型(例如 OpenAI 嵌入)或开源模型(例如 SBERT)对文本进行编码,并使用同样编码为矢量的查询检索文档。
跨不同内容类型的搜索(多模式)。 使用多模式嵌入对图像和文本进行编码(例如,在 Azure OpenAI 中使用 OpenAI CLIP 或 GPT-4 Turbo with 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 AI 搜索层级的一部分提供,不收取额外的费用。
2024 年 4 月 3 日之后创建的较新服务支持更高的矢量索引配额。
矢量搜索可用于:
- Azure 门户:导入和矢量化数据向导
- Azure REST API
- 适用于 .NET、Python 和 JavaScript 的 Azure SDK
- 其他 Azure 产品/服务,例如 Azure AI Studio 和 Azure OpenAI Studio。
注意
在 2019 年 1 月 1 日之前创建的一些较旧搜索服务部署在不支持矢量工作负载的基础结构上。 如果你在尝试将矢量字段添加到架构时收到错误,则原因是服务已过时。 在这种情况下,必须创建新的搜索服务来试用矢量功能。
Azure 集成和相关服务
Azure AI 搜索在 Azure AI 平台上深度集成。 下表列出了在矢量工作负载中有用的几个方法。
产品 | 集成 |
---|---|
Azure OpenAI Studio | 在与数据操场的聊天中,“添加自己的数据”使用 Azure AI 搜索进行基础数据和对话搜索。 这是与数据聊天的最简单、最快速的方法。 |
Azure OpenAI | Azure OpenAI 提供嵌入模型和聊天模型。 演示和示例针对 text-embedding-ada-002。 我们建议使用 Azure OpenAI 来生成文本嵌入。 |
Azure AI 服务 | 图像检索矢量化图像 API(预览版)支持图像内容的矢量化。 我们建议使用此 API 来生成图像嵌入。 |
Azure 数据平台:Azure Blob 存储、Azure Cosmos DB | 可以使用索引器自动执行数据引入,然后使用集成矢量化来生成嵌入。 Azure AI 搜索可以自动为来自两个数据源的矢量数据编制索引:Azure Blob 索引器和 Azure Cosmos DB for NoSQL 索引器。 有关详细信息,请参阅将矢量字段添加到搜索索引。 |
它通常用于开源框架,如 LangChain。
矢量搜索概念
如果你不熟悉矢量,本部分将解释一些核心概念。
关于矢量搜索
矢量搜索是一种信息检索方法,其中的文档和查询表示为矢量而不是纯文本。 在矢量搜索中,机器学习模型生成源输入的矢量表示,它们可以是文本、图像或其他内容。 使用内容的数学表示形式可为搜索方案提供共同的基础。 如果所有内容都是矢量,则查询可以在矢量空间中查找匹配项,即使关联的原始内容使用的媒体或语言与查询不同。
为何使用矢量搜索
当可搜索内容表示为矢量时,查询可以在类似内容中找到相近匹配项。 用于矢量生成的嵌入模型知道哪些字和概念是相似的,并且它将生成的矢量紧密地放置在嵌入空间中。 例如,关于“clouds”和“fog”的矢量化源文档更有可能显示在关于“mist”的查询中,因为它们在语义上相似,即使它们在词汇上不匹配。
嵌入和矢量化
嵌入是内容或查询的一种特定矢量表示形式,它们由捕获文本语义或其他内容(例如图像)的表示形式的机器学习模型创建。 自然语言机器学习模型已基于大量的数据进行训练,可以识别单词之间的模式和关系。 在训练过程中,他们会试着在一个称为编码器的中间步骤中将任何输入表示为实数矢量。 训练完成后,可以修改这些语言模型,使中间矢量表示形式成为模型的输出。 生成的嵌入是高维矢量,其中具有相似含义的单词在矢量空间中距离更近,如了解嵌入 (Azure OpenAI) 中所述。
矢量搜索在检索相关信息方面的有效性取决于嵌入模型将文档和查询的含义提取到结果矢量中的有效性。 最佳模型已基于其所代表的数据类型进行了全面的训练。 你可以评估现有模型(例如 Azure OpenAI text-embedding-ada-002),引入自己的、已直接在问题空间中训练的模型,或者微调通用模型。 Azure AI 搜索不会对你选择的模型施加限制,因此请选择最适合你的数据的模型。
若要为矢量搜索创建有效的嵌入,必须考虑到输入大小限制。 我们建议在生成嵌入之前按照数据分块准则进行操作。 这种最佳做法可确保嵌入准确捕获相关信息并实现更高效的矢量搜索。
什么是嵌入空间?
嵌入空间是矢量查询的语料库。 在搜索索引中,嵌入空间是填充了来自同一嵌入模型的嵌入的所有矢量字段。 机器学习模型通过将各个单词、短语或文档(用于自然语言处理)、图像或其他形式的数据映射到由实数(表示高维空间中的坐标)矢量组成的表示形式,来创建嵌入空间。 在此嵌入空间中,相似的项位置相互靠近,而不相似的项位置相距较远。
例如,谈论不同种类的狗的文档将在嵌入空间中紧密聚类到一起。 有关猫的文档也会相互接近,但与狗的聚类相距较远,不过它们仍属于动物的邻域。 云计算等不同的概念则与此有很大的差异。 在实践中,这些嵌入空间是抽象的,没有明确定义的、人类可解释的含义,但核心思想保持不变。
最近邻域搜索
在矢量搜索中,搜索引擎扫描嵌入空间中的矢量,以识别最接近查询矢量的矢量。 此方法称为“最近邻搜索”
。 最近邻域有助于量化项之间的相似性。 矢量高度相似性表明原始数据也相似。 为了帮助实现快速的最近的邻域搜索,搜索引擎将执行优化或采用数据结构或数据分区来减少搜索空间。 每个矢量搜索算法都以不同的方式解决了最近的邻域问题,因为它们针对最小延迟、最大吞吐量、召回和内存进行优化。 为了计算相似性,相似性指标提供了用于计算距离的机制。
Azure AI 搜索目前支持以下算法:
分层可导航小世界 (HNSW):HNSW 是一种领先的 ANN 算法,它已针对数据分布未知或可能频繁变化的高召回率、低延迟应用程序进行优化。 它将高维数据点组织成分层图形结构,从而实现快速且可缩放的相似性搜索,同时允许在搜索准确度和计算成本之间进行可优化的权衡。 由于该算法要求所有数据点都驻留在内存中以便能够快速随机访问,因此它会消耗矢量索引大小配额。
穷举 K 最近邻域(KNN):计算查询矢量与所有数据点之间的距离。 这是一种计算密集型算法,因此最适合较小的数据集。 由于该算法不要求快速随机访问数据点,因此不消耗矢量索引大小配额。 但是,该算法提供了全局最近的邻域集。
若要使用这些算法,请参阅创建矢量字段,获取有关指定算法、矢量配置文件和配置文件分配的说明。
在索引创建过程中用于初始化索引的算法参数是不可变的,并且在索引生成后无法更改。 但是,可以修改影响查询时特征 (efSearch
) 的参数。
此外,指定 HNSW 算法的字段还支持使用查询请求参数 "exhaustive": true
执行穷举 KNN 搜索。 但是反过来则不适用。 如果字段已索引为 exhaustiveKnn
,则不能在查询中使用 HNSW,因为不存在能够有效搜索的额外数据结构。
近似最近邻域
近似最近邻域 (ANN) 搜索是一种用于在矢量空间中查找匹配项的算法。 此类算法采用不同的数据结构或数据分区方法来显著减少搜索空间,以加速查询处理。
ANN 算法牺牲了一些准确度,但提供了可缩放且更快的近似最近邻域检索,这使得它们非常适合用于在现代信息检索应用程序中平衡准确度和效率。 你可以调整算法的参数,以微调搜索应用程序的召回率、延迟、内存和磁盘占用空间要求。
Azure AI 搜索将 HNSW 用于其 ANN 算法。
需要将输入向量与数据集中的所有向量进行详尽比较。 虽然每个向量相似性计算相对较快,但由于比较数量庞大,在大型数据集中执行这些详尽比较会非常昂贵且速度缓慢。 例如,如果数据集包含 1000 万个 1,000 维向量,则计算查询向量与数据集中的所有向量之间的距离需要扫描 37 GB 的数据(假设为单精度浮点向量)和进行大量的相似性计算。
为了应对这一挑战,使用近似最近邻 (ANN) 搜索方法来权衡召回率与速度。 这些方法可以有效地找到一小组候选向量,这些向量类似于查询向量,并且很有可能是全局最相似的邻近向量。 每个算法有不同的方法来减少矢量比较总数,但它们都通过调整算法配置参数来平衡准确性和效率。 -->