Azure AI 搜索中的集成数据分块和嵌入
集成矢量化是 Azure AI 搜索中索引和查询管道的扩展。 它添加了以下功能:
- 在索引编制期间进行数据分块
- 在索引编制期间进行文本到矢量的转换
- 在查询期间进行文本到矢量的转换
数据分块不是硬性要求,但除非原始文档很小,否则为了满足嵌入模型的令牌输入要求,分块是必要的。
矢量转换是单向的:文本到矢量。 查询或结果不会经过矢量到文本的转换(例如,无法将矢量结果转换为人类可读的字符串)。
集成数据分块和矢量化可以加快开发速度,并最大限度地减少数据引入和查询期间的维护任务,因为需要配置和管理的外部组件较少。 此功能现已正式发布。
进行数据分块和文本到矢量的转换时,需要依赖以下组件:
矢量索引,用于接收分块内容和矢量化内容。
技能组,配置用于:
文本拆分技能,用于对数据进行分块。
一种嵌入技能,用于生成矢量数组,可以是以下任何一种:
AzureOpenAIEmbedding 技能,附加到 Azure OpenAI 上的 text-embedding-ada-002、text-embedding-3-small、text-embedding-3-large。
自定义技能,指向 Azure 或另一个站点上的另一个嵌入模型。
Azure AI 视觉技能(预览版),指向 Azure AI 视觉的多模式 API。
在查询期间进行文本到矢量的转换时,需要依赖以下组件:
一个指定一个或多个矢量字段的查询。
在查询时转换为矢量的文本字符串。
矢量化器,在索引架构中定义,已分配到矢量字段,在查询时自动用来将文本查询转换为矢量。 设置的矢量化器必须与用于对内容进行编码的嵌入模型匹配。
下图显示了集成矢量化的组件。
工作流是一个索引器管道。 索引器从支持的数据源检索数据,并通过调用 Azure OpenAI、Azure AI 服务或用于文本到矢量转换或其他处理操作的自定义代码来启动数据扩充(或应用 AI)。
此图重点介绍集成矢量化,但你的解决方案并不局限于此列表。 可以添加其他 AI 扩充技能、创建知识存储、添加语义排名、添加相关性优化和其他查询功能。
集成矢量化在所有区域和层中都可用。 但是,如果正在使用 Azure OpenAI 和 Azure AI 技能和矢量器,请确保 Azure AI 多服务帐户在与 Azure AI 搜索相同的区域中可用。
如果使用的是自定义技能和 Azure 托管机制(例如 Azure 函数应用、Azure Web 应用和 Azure Kubernetes),请查看“Azure 产品(按区域)”页来了解功能可用性。
数据分块(文本拆分技能)是免费的,已在所有区域的所有 Azure AI 服务中提供。
备注
在 2019 年 1 月 1 日之前创建的一些较旧搜索服务部署在不支持矢量工作负载的基础结构上。 如果你在尝试将矢量字段添加到架构时收到错误,则原因是服务已过时。 在这种情况下,必须创建新的搜索服务来试用矢量功能。
将大型文档划分为区块,这对于矢量和非矢量方案很有用。 对于矢量方案,块可帮助你满足嵌入模型的输入约束。 对于非矢量方案,可以使用一个聊天式搜索应用,其中的 GPT 从编制了索引的区块中组合响应。 可以使用矢量化区块或非矢量化区块进行聊天式搜索。
生成一个矢量存储,其中的所有字段都是矢量字段,只有文档 ID(搜索索引所需)是字符串字段。 查询矢量存储以检索文档 ID,然后将文档的向量字段发送到另一个模型。
组合矢量和文本字段来执行提供或不提供语义排名的混合搜索。 集成矢量化简化了矢量搜索支持的所有方案。
我们建议使用 Azure AI Foundry 的内置矢量化支持。 如果此方法不能满足你的需求,你可以创建索引器和技能组,以便使用 Azure AI 搜索的编程接口调用集成矢量化。
对于仅限查询的矢量化:
更常见的方案 - 在索引编制期间进行数据分块和矢量化:
- 与支持的数据源建立数据源连接,以进行基于索引器的索引编制。
- 创建一个技能组,用于调用文本拆分技能进行分块,并调用 AzureOpenAIEmbeddingModel 或另一嵌入技能来将块矢量化。
- 创建一个索引用于指定查询时间的矢量化器,并将其分配到矢量字段。
- 创建一个索引器以驱动从数据检索到技能组执行,再到索引编制的整个流程。 我们建议按计划运行索引器,以选取已更改的文档或由于限制而遗漏的任何文档。
(可选)对于分块内容位于一个索引中但非分块内容位于另一个索引中的高级方案,请创建辅助索引。 分块索引(或次要索引)对于 RAG 应用非常有用。
提示
在编写任何代码之前,尝试使用 Azure 门户中新的“导入和矢量化数据”向导来探索集成矢量化。
如果你的体系结构需要绕过 Internet 的专用连接,则可以创建一个共享专用链接连接,连接到技能在查询时建立索引和矢量化期间使用的嵌入模型。
共享专用链接仅适用于 Azure 到 Azure 连接。 如果你要连接到 OpenAI 或其他外部模型,则必须通过公共 Internet 进行连接。
对于矢量化方案,可以使用:
openai_account
,作为在 Azure OpenAI 资源上托管的嵌入模型。sites
,作为自定义技能或自定义矢量化器访问的嵌入模型。sites
组 ID 适用于应用服务和 Azure 函数,可用于托管不是 Azure OpenAI 嵌入模型之一的嵌入模型。
确保了解嵌入模型的 Azure OpenAI 配额和限制。 Azure AI 搜索具有重试策略,但如果配额耗尽,重试会失败。
Azure OpenAI 每分钟令牌数限制是按模型、按订阅计算的。 如果对查询和索引编制工作负载使用嵌入模型,请记住这一点。 在可能的情况下遵循最佳做法。 为每个工作负载提供一个嵌入模型,并尝试将其部署在不同的订阅中。
请记住,在 Azure AI 搜索中,存在按层和按工作负载规定的服务限制。
下面是集成矢量化的一些重要优势:
没有单独的数据分块和矢量化管道。 代码更易于编写和维护。
自动进行端到端索引编制。 当源(例如 Azure 存储、Azure SQL 或 Cosmos DB)中的数据发生更改时,索引器可以在整个管道中传递这些更新(从检索到文档破解,再到可选的 AI 扩充、数据分块、矢量化和索引编制)。
批处理和重试逻辑是内置的(不可配置的)。 Azure AI 搜索具有内部重试策略,用于限制因 Azure OpenAI 终结点嵌入模型的令牌配额达到最大值而出现的错误。 我们建议对索引器进行计划(例如,将其频率设置为每 5 分钟一次),使索引器可以处理任何被 Azure OpenAI 终结点限制的调用,不受重试策略的限制。
将分块的内容投影到次要索引。 次要索引的创建方式与创建任何搜索索引(包含字段和其他构造的架构)一样,但索引器会将它们与主要索引一起填充。 在同一索引编制运行期间,每个源文档的内容都会流向主要和次要索引中的字段。
辅助索引旨在用于问答或聊天样式应用。 辅助索引包含更具体的匹配项的精细信息,但父索引包含更多信息,并且通常可以生成更完整的答案。 在辅助索引中找到匹配项后,查询会从主索引返回父文档。 例如,假设将一个大型 PDF 文件用作源文档,则主索引可能包含基本信息(标题、日期、作者、描述),而辅助索引则包含可搜索的内容块。