category
矢量搜索是信息检索中的一种方法,支持对内容的数字表示进行索引和查询执行。由于内容是数字而非纯文本,因此匹配基于与查询矢量最相似的矢量,从而可以在以下范围内进行匹配:
- 语义或概念相似(“dog”和“canine”,概念相似但语言不同)
- 多语言内容(英语为“dog”,德语为“hund”)
- 多种内容类型(纯文本中的“狗”和图像文件中的狗照片)
本文对Azure人工智能搜索中的矢量进行了高级介绍。它还解释了与其他Azure服务的集成,并涵盖了与矢量搜索开发相关的术语和概念。
我们推荐这篇文章作为背景,但如果你想开始,请遵循以下步骤:
- 为索引提供嵌入或在索引器管道中生成嵌入(预览)
- 创建矢量索引
- 运行矢量查询
您也可以从矢量quickstart或GitHub上的代码示例开始。
矢量搜索可以支持哪些场景?
矢量搜索的场景包括:
- 相似性搜索。使用OpenAI嵌入等嵌入模型或SBERT等开源模型对文本进行编码,并使用同样编码为矢量的查询检索文档。
- 跨不同内容类型进行搜索(多模式)。使用多模式嵌入对图像和文本进行编码(例如,在Azure OpenAI中使用OpenAI CLIP或GPT-4 Turbo with Vision),并查询由两种内容类型的矢量组成的嵌入空间。
- 混合搜索。在Azure AI搜索中,混合搜索是指在同一请求中执行向量和关键字查询。矢量支持在字段级别实现,索引包含矢量字段和可搜索文本字段。查询并行执行,结果合并为一个响应。或者,使用与Bing相同的语言模型,通过L2重新排序,添加语义排名以获得更高的准确性。
- 多语言搜索。通过嵌入用多种语言训练的模型和聊天模型,可以用用户自己的语言提供搜索体验。如果您需要对翻译进行更多控制,您可以在混合搜索场景中补充Azure AI Search支持的非矢量内容的多语言功能。
- 过滤矢量搜索。查询请求可以包括向量查询和过滤器表达式。筛选器适用于文本和数字字段,对于元数据筛选器以及根据筛选条件包括或排除搜索结果非常有用。虽然矢量字段本身不可筛选,但您可以设置可筛选的文本或数字字段。搜索引擎可以在矢量查询执行之前或之后处理过滤器。
- 矢量数据库。Azure AI搜索存储您查询的数据。任何时候,只要你需要长期记忆或知识库,或者检索增强生成(RAG)架构的基础数据,或者任何使用矢量的应用程序,都可以将其用作纯矢量存储。
矢量搜索在Azure AI搜索中的工作原理
矢量支持包括对搜索索引中的矢量嵌入进行索引、存储和查询。
下图显示了矢量搜索的索引和查询工作流。
矢量搜索工作流的体系结构。
在索引方面,Azure AI Search采用矢量嵌入,并使用最近邻居算法将相似的矢量放在索引中。在内部,它为每个向量场创建向量索引。
如何将源内容嵌入Azure AI搜索取决于您的方法以及是否可以使用预览功能。作为初步步骤,您可以使用OpenAI、Azure OpenAI和任何数量的提供商的模型,在广泛的源内容(包括文本、图像和模型支持的其他内容类型)上矢量化或生成嵌入。然后,您可以将预先构造的内容推送到向量存储中的向量字段。这是普遍可用的方法。如果你可以使用预览功能,Azure AI Search在索引器管道中提供集成的数据分块和矢量化。您仍然提供资源(端点和Azure OpenAI的连接信息),但Azure AI Search会进行所有调用并处理转换。
在查询端,在客户端应用程序中,通常通过提示工作流收集用户的查询输入。然后,您可以添加一个编码步骤,将输入转换为矢量,然后将矢量查询发送到Azure AI Search上的索引中进行相似性搜索。与索引一样,您可以部署集成的矢量化(预览)将问题转换为矢量。对于任何一种方法,Azure AI Search都会返回结果中包含请求的k个最近邻居(kNN)的文档。
Azure AI搜索支持并行运行矢量和关键字搜索的混合场景,返回统一的结果集,通常比单独的矢量或关键字搜索提供更好的结果。对于混合,矢量和非矢量内容被吸收到同一索引中,对于并排运行的查询。
可用性和定价
矢量搜索是所有地区所有Azure AI搜索层的一部分,不收取额外费用。
2024年4月3日之后创建的较新服务支持更高的矢量索引配额。
矢量搜索可用于:
- Azure portal using the Import and vectorize data wizard
- Azure REST APIs, version 2023-11-01
- Azure SDKs for .NET, Python, and JavaScript
- Other Azure offerings such as Azure AI Studio and Azure OpenAI Studio.
笔记
2019年1月1日之前创建的一些较旧的搜索服务部署在不支持矢量工作负载的基础设施上。如果您试图将矢量字段添加到模式中,但却出现错误,这是过时服务的结果。在这种情况下,您必须创建一个新的搜索服务来尝试矢量功能。
Azure集成和相关服务
Azure人工智能搜索在整个Azure人工智能平台上深度集成。下表列出了几种在矢量工作负载中有用的方法。
Product | Integration |
---|---|
Azure OpenAI Studio | In the chat with your data playground, Add your own data uses Azure AI Search for grounding data and conversational search. This is the easiest and fastest approach for chatting with your data. |
Azure OpenAI | Azure OpenAI provides embedding models and chat models. Demos and samples target the text-embedding-ada-002. We recommend Azure OpenAI for generating embeddings for text. |
Azure AI Services | Image Retrieval Vectorize Image API(Preview) supports vectorization of image content. We recommend this API for generating embeddings for images. |
Azure data platforms: Azure Blob Storage, Azure Cosmos DB | You can use indexers to automate data ingestion, and then use integrated vectorization (preview) to generate embeddings. Azure AI Search can automatically index vector data from two data sources: Azure blob indexers and Azure Cosmos DB for NoSQL indexers. For more information, see Add vector fields to a search index.. |
它也常用于LangChain等开源框架中。
矢量搜索概念
如果您是矢量的新手,本节将解释一些核心概念。
关于矢量搜索
矢量搜索是一种信息检索方法,其中文档和查询表示为矢量而不是纯文本。在矢量搜索中,机器学习模型生成源输入的矢量表示,这些输入可以是文本、图像或其他内容。拥有内容的数学表示为搜索场景提供了通用基础。如果所有内容都是向量,则查询可以在向量空间中找到匹配项,即使关联的原始内容使用的媒体或语言与查询不同。
为什么使用矢量搜索
当可搜索内容表示为向量时,查询可以在类似内容中找到紧密匹配。用于向量生成的嵌入模型知道哪些单词和概念是相似的,并将生成的向量紧密地放置在嵌入空间中。例如,关于“clouds”和“fog”的矢量化源文档更有可能显示在关于“mist”的查询中,因为它们在语义上相似,即使它们在词汇上不匹配。
嵌入和矢量化
嵌入是一种特定类型的内容或查询的矢量表示,由机器学习模型创建,该模型捕捉文本的语义或图像等其他内容的表示。自然语言机器学习模型在大量数据上进行训练,以识别单词之间的模式和关系。在训练过程中,他们学习在称为编码器的中间步骤中将任何输入表示为实数向量。训练完成后,可以修改这些语言模型,使中间向量表示成为模型的输出。由此产生的嵌入是高维向量,其中具有相似含义的单词在向量空间中更紧密地结合在一起,如Understand embeddings(Azure OpenAI)中所述。
向量搜索在检索相关信息方面的有效性取决于嵌入模型在将文档和查询的含义提取到结果向量中的有效性。最好的模型在它们所代表的数据类型方面训练有素。你可以评估现有的模型,如Azure OpenAI text-embedding-ada-002,带上你自己的直接在问题空间训练的模型,或者微调通用模型。Azure AI搜索不会对您选择的模型施加限制,因此请为您的数据选择最好的模型。
为了为矢量搜索创建有效的嵌入,考虑输入大小限制是很重要的。我们建议在生成嵌入之前遵循分块数据的指导原则。这种最佳实践确保嵌入准确地捕获相关信息,并实现更高效的矢量搜索。
嵌入空间是什么?
嵌入空间是矢量查询的语料库。在搜索索引中,嵌入空间是用来自同一嵌入模型的嵌入填充的所有向量场。机器学习模型通过将单个单词、短语或文档(用于自然语言处理)、图像或其他形式的数据映射到由表示高维空间中坐标的实数向量组成的表示中来创建嵌入空间。在这个嵌入空间中,相似的项目位于靠近的位置,而不同的项目位于相距更远的位置。
例如,关于不同种类狗的文件将在嵌入空间中紧密地聚集在一起。关于猫的文件会放在一起,但离狗群更远,同时仍然在附近寻找动物。云计算等不同的概念将离我们更远。在实践中,这些嵌入空间是抽象的,没有定义明确的、人类可解释的含义,但核心思想保持不变。
最近邻居搜索
在矢量搜索中,搜索引擎扫描嵌入空间内的矢量,以识别最接近查询矢量的矢量。这种技术被称为最近邻搜索。最近的邻居有助于量化项目之间的相似性。向量的高度相似性表明原始数据也相似。为了便于快速的最近邻搜索,搜索引擎进行优化,或者采用数据结构和数据分区来减少搜索空间。每种矢量搜索算法都以不同的方式解决最近邻问题,因为它们优化了最小延迟、最大吞吐量、调用和内存。为了计算相似性,相似性度量提供了计算距离的机制。
Azure AI搜索目前支持以下算法:
- 分层导航小世界【Hierarchical Navigable Small World】(HNSW):HNSW是一种领先的人工神经网络算法,针对数据分布未知或可能频繁变化的高召回率、低延迟应用进行了优化。它将高维数据点组织成分层图结构,实现快速和可扩展的相似性搜索,同时允许在搜索精度和计算成本之间进行可调的权衡。由于该算法要求所有数据点都驻留在内存中以进行快速随机访问,因此该算法消耗向量索引大小配额。
- 穷举K-最近邻【Exhaustive K-nearest neighbors】(KNN):计算查询向量和所有数据点之间的距离。它是计算密集型的,因此最适合较小的数据集。由于该算法不需要快速随机访问数据点,因此该算法不消耗向量索引大小配额。然而,该算法提供了最近邻居的全局集合。
在索引定义中,可以指定一个或多个算法,然后为每个矢量字段指定要使用的算法:
- 创建矢量存储以在索引和字段中指定算法。
- 对于详尽的KNN,请使用2023-11-01、2023-10-01-Preview和所有较新的预览API,或针对REST API版本的Azure SDK测试版库。
在创建索引期间用于初始化索引的算法参数是不可变的,并且在建立索引后不能更改。但是,可以修改影响查询时间特征(efSearch)的参数。
此外,指定HNSW算法的字段还支持使用查询请求参数“穷举”进行穷举KNN搜索:true。然而,情况并非如此。如果为exhausiveKnn对字段进行索引,则不能在查询中使用HNSW,因为不存在能够进行有效搜索的额外数据结构。
近似最近邻居(Approximate Nearest Neighbors)
近似最近邻搜索是一类在向量空间中寻找匹配的算法。这类算法采用不同的数据结构或数据划分方法来显著减少搜索空间,以加速查询处理。
ANN算法牺牲了一些准确性,但提供了可扩展和更快的近似近邻检索,这使它们成为现代信息检索应用中平衡准确性和效率的理想选择。您可以调整算法的参数,以微调搜索应用程序的调用、延迟、内存和磁盘占用空间要求。
Azure AI Search使用HNSW作为其ANN算法。
接下来的步骤
- 登录 发表评论
- 11 次浏览
Tags
最新内容
- 18 hours 37 minutes ago
- 20 hours 53 minutes ago
- 21 hours ago
- 3 days 12 hours ago
- 3 days 20 hours ago
- 3 days 20 hours ago
- 3 days 20 hours ago
- 3 days 21 hours ago
- 1 week 1 day ago
- 1 week 1 day ago