Azure Machine Learning - Azure AI 搜索中的矢量搜索

矢量搜索是一种信息检索方法,它使用内容的数字表示形式来执行搜索方案。 由于内容是数字而不是纯文本,因此搜索引擎会匹配与查询最相似的矢量,而不需要匹配确切的字词。本文简要介绍了 Azure AI 搜索中的矢量支持。 其中还解释了与其他 Azure 服务的集成,以及与矢量搜索开发相关的术语和概念

关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

file

Azure AI 搜索中的矢量搜索是什么?

矢量搜索是一项新功能,用于从搜索索引为矢量嵌入编制索引,以及存储和检索矢量嵌入。 可以使用它来助力相似性搜索、多模式搜索、推荐引擎或实现检索增强生成 (RAG) 体系结构的应用程序。

下图显示了矢量搜索的索引编制和查询工作流。

file

在索引编制端,可以准备包含嵌入的源文档。 尽管集成矢量化目前是作为公共预览版提供的,但正式版 Azure AI 搜索不会生成嵌入。 如果你需要遵守非预览版功能策略,则你的解决方案应包含对 Azure OpenAI 或其他模型的调用,这些模型可以将图像、音频、文本和其他内容转换为矢量表示形式。 将_矢量字段_添加到 Azure AI 搜索上的索引定义中。 使用包含矢量的文档有效负载加载索引。 索引现在可供查询。

在查询端,可以在客户端应用程序中收集查询输入。 添加一个用于将输入转换为矢量的步骤,然后将矢量查询发送到 Azure AI 搜索上的索引以进行相似性搜索。 Azure AI 搜索在结果中返回包含所请求的 k 个最近邻域 (kNN) 的文档。

可以将矢量数据与字母数字内容一起作为文档中的字段编制索引。 矢量查询可以单独发出,也可以与筛选器和其他查询类型(包括同一搜索请求中的字词查询(混合搜索)和语义排名)结合发出。

可用性和定价

矢量搜索作为所有区域中所有 Azure AI 搜索层级的一部分提供,不收取额外的费用。

备注

在 2019 年 1 月 1 日之前创建的一些较旧搜索服务部署在不支持矢量工作负载的基础结构上。 如果你在尝试将矢量字段添加到架构时收到错误,则原因是服务已过时。 在这种情况下,必须创建新的搜索服务来试用矢量功能。

矢量搜索支持哪些方案?

矢量搜索适合的方案包括:

  • 对文本进行矢量搜索。 使用嵌入模型(例如 OpenAI 嵌入)或开源模型(例如 SBERT)对文本进行编码,并使用同样编码为矢量的查询检索文档。

  • 跨不同数据类型进行矢量搜索(多模式)。 对图像、文本、音频和视频甚至它们的混合形式进行编码(例如,使用 CLIP 等模型),并对它们执行相似性搜索。

  • 多语言搜索。 使用多语言嵌入模型在单个矢量空间中以多种语言表示文档,以查找文档,无论它们采用哪种语言。

  • 混合搜索。 矢量搜索是在字段级别实现的,这意味着,你可以生成包含矢量字段和可搜索文本字段的查询。 查询将并行执行,结果将合并为单个响应。 (可选)添加[语义排名],以使用为必应提供支持的相同语言模型进行 L2 重新排名,从而获得更高的准确度。

  • 筛选的矢量搜索。 查询请求可以包含矢量查询和[筛选表达式]。 筛选器适用于文本和数字字段,可用于元数据筛选,并且在根据筛选条件包含或排除搜索文档时非常有用。 尽管矢量字段本身不可筛选,但你可以设置可筛选的文本或数字字段。 搜索引擎可以在执行矢量查询之前或之后处理筛选器。

  • 矢量数据库。 使用 Azure AI 搜索作为矢量存储来充当大型语言模型 (LLM) 或其他应用程序的长期内存或外部知识库。 例如,对于检索增强生成 (RAG) 应用程序,可以将 Azure AI 搜索用作 [Azure 机器学习提示流中的_矢量索引_]。

可以使用其他 Azure 服务来提供嵌入和数据存储。

  • Azure OpenAI 提供嵌入模型。 演示和示例针对 [text-embedding-ada-002] 和其他模型。 我们建议使用 Azure OpenAI 来生成文本嵌入。

  • [图像检索矢量化图像 API(预览版)]支持图像内容的矢量化。 我们建议使用此 API 来生成图像嵌入。

  • Azure AI 搜索可以自动为来自两个数据源的矢量数据编制索引:[Azure Blob 索引器]和 [Azure Cosmos DB for NoSQL 索引器]。

  • LangChain 是用于开发由语言模型提供支持的应用程序的框架。 使用 Azure AI 搜索矢量存储集成可以简化使用 LLM 的、将 Azure AI 搜索用作矢量数据存储的应用程序的创建。

  • 语义内核是一个轻型 SDK,可用于将 AI 大型语言模型 (LLM) 与传统编程语言集成。 它很适合用于在将输入发送到嵌入模型的较大工作流中对大型文档进行分块。

矢量搜索概念

如果你不熟悉矢量,本部分将解释一些核心概念。

关于矢量搜索

矢量搜索是一种信息检索方法,其中的文档和查询表示为矢量而不是纯文本。 在矢量搜索中,机器学习模型生成源输入(可以是文本、图像、音频或视频内容)的矢量表示形式。 使用内容的数学表示形式可为搜索方案提供共同的基础。 如果所有内容都是矢量,则查询可以在矢量空间中查找匹配项,即使关联的原始内容与查询位于不同的媒体中或采用不同的语言。

为何使用矢量搜索

矢量可以使用机器学习模型来捕获上下文中单词和短语的含义,而不是仅仅依赖于词法分析和单个查询字词的匹配,因而克服了传统的基于关键字的搜索的局限性。 通过捕获查询的意图,即使文档中不存在确切的字词,矢量搜索也可以返回符合用户需求的更相关结果。

此外,矢量搜索可应用于不同类型的内容,例如图像和视频,而不仅仅是文本。 这使得新的搜索体验成为可能,例如多语言应用程序中的多模式搜索或跨语言搜索。

嵌入和矢量化

_嵌入_是内容或查询的一种特定矢量表示形式,它们由捕获文本语义或其他内容(例如图像)的表示形式的机器学习模型创建。 自然语言机器学习模型已基于大量的数据进行训练,可以识别单词之间的模式和关系。 在训练过程中,他们会试着在一个称为_编码器_的中间步骤中将任何输入表示为实数矢量。 训练完成后,可以修改这些语言模型,使中间矢量表示形式成为模型的输出。 生成的嵌入是高维矢量,其中具有相似含义的单词在矢量空间中距离更近,如了解嵌入 (Azure OpenAI)中所述。

矢量搜索在检索相关信息方面的有效性取决于嵌入模型将文档和查询的含义提取到结果矢量中的有效性。 最佳模型已基于其所代表的数据类型进行了全面的训练。 你可以评估现有模型(例如 Azure OpenAI text-embedding-ada-002),引入自己的、已直接在问题空间中训练的模型,或者微调通用模型。 Azure AI 搜索不会对你选择的模型施加限制,因此请选择最适合你的数据的模型。

若要为矢量搜索创建有效的嵌入,必须考虑到输入大小限制。 我们建议在生成嵌入之前按照数据分块准则进行操作。 这种最佳做法可确保嵌入准确捕获相关信息并实现更高效的矢量搜索。

什么是嵌入空间?

_嵌入空间_是矢量查询的语料库。 在搜索索引中,它是填充了来自同一嵌入模型的嵌入的所有矢量字段。 机器学习模型通过将各个单词、短语或文档(用于自然语言处理)、图像或其他形式的数据映射到由实数(表示高维空间中的坐标)矢量组成的表示形式,来创建嵌入空间。 在此嵌入空间中,相似的项位置相互靠近,而不相似的项位置相距较远。

例如,谈论不同种类的狗的文档将在嵌入空间中紧密聚类到一起。 有关猫的文档也会相互接近,但与狗的聚类相距较远,不过它们仍属于动物的邻域。 云计算等不同的概念则与此有很大的差异。 在实践中,这些嵌入空间是抽象的,没有明确定义的、人类可解释的含义,但核心思想保持不变。

最近邻域搜索

在矢量搜索中,搜索引擎将搜索嵌入空间中的矢量,以识别那些接近查询矢量的矢量。 此技术称为_最近邻域搜索_。 最近邻域有助于量化项之间的相似性。 矢量高度相似性表明原始数据也相似。 为了帮助实现快速的最近邻域搜索,搜索引擎将执行优化或采用数据结构或数据分区来减少搜索空间。 每种矢量搜索算法都会提供不同的方法来解决此问题,并权衡不同的特征,例如延迟、吞吐量、召回率和内存。 为了计算相似性,相似性指标提供了用于计算此距离的机制。

Azure AI 搜索目前支持以下算法:

  • 分层可导航小世界 (HNSW):HNSW 是一种领先的 ANN 算法,它已针对数据分布未知或可能频繁变化的高召回率、低延迟应用程序进行优化。 它将高维数据点组织成分层图形结构,从而实现快速且可缩放的相似性搜索,同时允许在搜索准确度和计算成本之间进行可优化的权衡。 由于该算法要求所有数据点都驻留在内存中以便能够快速随机访问,因此它会消耗[矢量索引大小]配额。

  • 穷举 K 最近邻域(KNN):计算查询矢量与所有数据点之间的距离。 这是一种计算密集型算法,因此最适合较小的数据集。 由于该算法不要求快速随机访问数据点,因此不消耗矢量索引大小配额。 但是,该算法将提供全局最近邻域集。

在索引定义中,可以指定一种或多种算法,然后为每个矢量字段指定要使用的算法:

  • [创建矢量索引],以指定索引和字段中的算法。

  • 对于穷举 KNN,请使用面向任一 REST API 版本的 [2023-11-01]、[2023-10-01-Preview]或 Azure SDK Beta 版库。

在索引创建过程中用于初始化索引的算法参数是不可变的,并且在索引生成后无法更改。 但是,可以修改影响查询时特征 (efSearch) 的参数。

此外,指定 HNSW 算法的字段还支持使用[查询请求]参数 "exhaustive": true 执行穷举 KNN 搜索。 但是反过来则不适用。 如果针对 exhaustiveKnn 将某个字段编制索引,则无法在查询中使用 HNSW,因为实现高效搜索的其他数据结构不存在。

近似最近邻域

近似最近邻域搜索 (ANN) 是一种用于在矢量空间中查找匹配项的算法。 此类算法采用不同的数据结构或数据分区方法来显著减少搜索空间,以加速查询处理。

ANN 算法牺牲了一些准确度,但提供了可缩放且更快的近似最近邻域检索,这使得它们非常适合用于在现代信息检索应用程序中平衡准确度和效率。 你可以调整算法的参数,以微调搜索应用程序的召回率、延迟、内存和磁盘占用空间要求。

Azure AI 搜索将 HNSW 用于其 ANN 算法。

关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/161179.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【js作用域】JavaScript中作用域的是什么?:从编译时其承担什么角色和查询作用域中的变量的角度解析作用域

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:JavaScript进阶指南 👐学习格言:成功不是终点,失败也并非末日,最重要的是继…

Python语言这么火热,其实具有以下特点

Python语言具有以下特点: 简单易学:Python语言是一种解释型语言,语法简单明了,代码简洁,易于理解,可以一边编码一边运行,非常合适编程初学者。门槛较低:Python不需要复杂的环境配置…

null 不好,我真的推荐你使用 Optional

"Null 很糟糕." - Doug Lea。 Doug Lea 是一位美国的计算机科学家,他是 Java 平台的并发和集合框架的主要设计者之一。他在 2014 年的一篇文章中说过:“Null sucks.”1,意思是 null 很糟糕。他认为 null 是一种不明确的表示&#x…

持续集成交付CICD:Jenkins Sharedlibrary 共享库

目录 一、理论 1.共享库 2.共享库配置 3.使用共享库 4.共享库扩展 二、实验 1.连接共享库 2.使用共享库 三、问题 1.路径报错 2.readJSON 报错 一、理论 1.共享库 (1)概念 1)共享库这并不是一个全新的概念,其实在编…

electron使用better-sqlite3打包失败(electron打包有进程没有界面)

remove *\chrome_100_percent.pak: Access is denied. 解决: 管理员权限执行:taskkill /IM 你的进程名.exe /F,再次执行build electron使用better-sqlite3打包后有进程没有界面 原因是代码及依赖包安装有误,模块丢失。主要分享的…

企业月结快递管理教程

什么是月结快递?员工可能不清楚,但是企业行政人员应该很熟悉。各大快递公司为了留住商企这些大客户,推出了月结协议寄件,企业可以和快递公司签订月结协议,员工寄件不需要当场结算快递费,而是将快递费挂在企…

Git详解及 github使用

1.1 关于版本控制 开始之前先看一个没有版本控制的例子 1.1.1 本地版本控制 本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的 好处就是简单,但是特别容易犯错。有时候会混淆所在…

Android 解决CameraView叠加2个以上滤镜拍照黑屏的BUG (二)

1. 前言 这段时间,在使用 natario1/CameraView 来实现带滤镜的预览、拍照、录像功能。 由于CameraView封装的比较到位,在项目前期,的确为我们节省了不少时间。 但随着项目持续深入,对于CameraView的使用进入深水区,逐…

windows快捷方式图标变成空白

今天突然有客户说应用程序快捷方式图标变成了空白,就研究了一下,网上找了一下很多都说是什么图标缓存有问题,试过之后发现并不能解决问题。 然后发现用户的文件上都一把黄色的小锁的标志,查了一下说是文件属性里面设置加密之后就会…

【全网首发】2023年NOIP真题

目录 前言 真题 结尾 前言 NOIP题目了解一下,后续有可能会出讲解,题目全部来自于洛谷 真题 第一题:词典 第二题:三值逻辑 第三题:双序列扩展 第四题: 天天爱打卡 结尾 大家可以把你的预期分数打在评论…

Java(一)(引用类型的参数在传递,方法重载,面向对象编程基础)

基本类型和引用类型的参数在传递的时候有什么不同? 基本类型的值传递:参数传输存储的数据值 引用类型的值传递:参数传输存储的地址值 传递数组名字的时候,传递的是数组的地址,change方法可以通过地址直接访问我们在堆内存中开辟的数组,然后改变数组,数组中的元素发生变化 方…

Google Chrome 任意文件读取 (CVE-2023-4357)漏洞复现

Google Chrome 任意文件读取 (CVE-2023-4357)漏洞复现 1.漏洞描述 该漏洞的存在是由于 Google Chrome 中用户提供的 XML 输入验证不足。远程攻击者可以创建特制网页,诱骗受害者访问该网页并获取用户系统上的敏感信息。远程攻击者可利用该漏洞通过构建的 HTML 页面…

Linux进程控制

目录 写实拷贝 为什么要写实拷贝? fork函数 返回值 常规用法 调用失败的原因 进程终止 情况分类 a.代码正常执行完了 b.崩溃了(进程异常) 进程的退出码 c语言提供的系统的退出码 如何理解进程退出 操作都有哪些方式&#xff…

「Verilog学习笔记」使用3-8译码器①实现逻辑函数

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule decoder_38(input E1_n ,input E2_n ,input E3 ,input A0 ,input A1…

ExoPlayer架构详解与源码分析(9)——TsExtractor

系列文章目录 ExoPlayer架构详解与源码分析(1)——前言 ExoPlayer架构详解与源码分析(2)——Player ExoPlayer架构详解与源码分析(3)——Timeline ExoPlayer架构详解与源码分析(4)—…

Linux 阻塞机制及等待队列

原文地址: http://www.cnblogs.com/gdk-0078/p/5172941.html 阻塞与非阻塞是设备访问的两种方式。驱动程序需要提供阻塞(等待队列,中断)和非阻塞方式(轮询,异步通知)访问设备。在写阻塞与非阻塞的驱动程序时…

DB9串口引脚介绍

一、公头和母头 图片示意源于网络: 二、 每个引脚的功能定义 公头:所有排针式的接头(5针朝上,从左到右序号依次是1~9) 母头:所有插槽式的接孔(5孔朝上,从右到左序号依次是1~9) 针…

Go 之 captcha 生成图像验证码

目前 chptcha 好像只可以生成纯数字的图像验证码,不过对于普通简单应用来说也足够了。captcha默认将store封装到内部,未提供对外操作的接口,因此使用自己显式生成的store,可以通过store自定义要生成的验证码。 package mainimpor…

“升级图片管理,优化工作流程——轻松将JPG转为PNG“

在图片时代,无论是工作还是生活,图片管理都显得尤为重要。批量处理图片,将JPG格式轻松转换为PNG格式,能够使您的图片管理更优化,提高工作效率。 首先,我们进入首助编辑高手主页面,会看到有多种…

Springboot更新用户密码

UserController PatchMapping("/updatePwd")//RequestBody注解&#xff0c;mvc框架才能自动的去读取请求体里的json数据&#xff0c;转换成map集合对象public Result updatePwd(RequestBody Map<String,String> params){//1.校验数据String oldPwd params.get…