当前位置: 首页 > news >正文

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产品研发负责人。

相关文章:

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

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

3 redis实现一个消息中间件

使用list实现一个队列,可以从左侧入队,也可以从右侧入对 即可以从左侧读取,也可以从右侧读取 1、Lindex Lindex 命令用于通过索引获取列表中的元素 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的…...

js添加dom到指定div之后,并给添加的dom类名,然后设置其样式,以及el-popover层级z-index过高问题解决。

遇到一个需求,Vue项目做一个表格,要求表头与表格内容分开,如下效果所示,表头与表格有个高度间隔边距(箭头所示),因为默认我们的el-table的表头与内容是一起的: 思路:通过querySelector获取el-table__header-wrapper元素,通过createElement创建一个div,通过 newElem…...

C语言结构体

#include <stdio.h> #include <string.h> #include <stdlib.h>//struct Student_s { // int num; // char name[20]; // char gender; // int age; // float Chinese; // float Math; // float English; // char addr[30]; //}; //最后的分号一定要写&#x…...

【Python大数据笔记_day10_Hive调优及Hadoop进阶】

hive调优 hive官方配置url: Configuration Properties - Apache Hive - Apache Software Foundation hive命令和参数配置 hive参数配置的意义: 开发Hive应用/调优时&#xff0c;不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率&#xff0c;或帮助定位问…...

React经典初级错误

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者&#xff0c;我们创造bug&#xff0c;传播bug&#xff0c;毫不留情地消灭bug&#xff0c;在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案&#xff0c;感兴…...

C# System.Array.CopyTo() 和 System.Array.Clone() 有什么区别

System.Array.CopyTo() 和 System.Array.Clone() 是用于数组复制的两种不同方法&#xff0c;它们在实现和用途上有一些区别。 System.Array.CopyTo() 方法&#xff1a; CopyTo() 方法用于将数组的元素复制到另一个数组。它是 Array 类的实例方法&#xff0c;可以用于复制一个…...

Stable Diffusion 启动时 got an unexpected keyword argument ‘socket_options‘ 错误解决

Stable Diffusion 启动时 got an unexpected keyword argument socket_options 错误解决 问题解决方法 问题 Launching Web UI with arguments: Traceback (most recent call last):File "launch.py", line 48, in <module>main()File "launch.py"…...

CSS 文本属性篇

文字颜色 属性名&#xff1a;color作用&#xff1a;控制文字的颜色可选值&#xff1a; 1.颜色名 color: blue; 2.rgb或rgba color:rgb(132, 220, 254); color:rgba(132, 220, 254,0.5); 3.hex或hexa&#xff08;十六进制&#xff09; color:#0078d4; color:#0078d48b; 4.hsl或h…...

Activiti,Apache camel,Netflex conductor对比,业务选型

Activiti,Apache camel,Netflex conductor对比&#xff0c;业务选型 1.activiti是审批流&#xff0c;主要应用于人->系统交互&#xff0c;典型应用场景&#xff1a;请假&#xff0c;离职等审批 详情可见【精选】activti实际使用_activiti通过事件监听器实现的优势_记录点滴…...

pythom导出mysql指定binlog文件

要求 要求本地有py环境和全局环境变量 先测试直接执行binlog命令执行命令 Windows 本地直接执行命令 # E:\output>E:\phpstudy_pro\Extensions\MySQL5.7.26\bin\mysqlbinlog binglog文件地址 # --no-defaults 不限制编码 # -h mysql链接地址 # -u mysql 链接名称 # -p m…...

TDengine 跨版本迁移实战

TDengine 3.0 已经退出了近一年&#xff0c;目前已经到了 3.2 版本。很遗憾的是 2.x 和 3.x 之间的数据文件不兼容。 如果向从 2.x 升级到 3.x 只能选择数据迁移的方式。 目前数据迁移有三种方法&#xff1a; 使用官方推荐工具 taosx。使用 taosdump 工具。自己写程序。 迁移…...

FPGA设计时序约束八、others类约束之Set_Case_Analysis

目录 一、序言 二、Set Case Analysis 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中&#xff0c;存在一类特殊的约束&#xff0c;划分在others目录下&#xff0c;可用于设置忽略或修改默认的时序…...

xftp连接wsl2

在WSL中默认是没有安装OpenSSH&#xff0c;需要自己安装。 安装 sudo apt update sudo apt install openssh-server检查是否安装成功 ssh -V配置ssh sudo vim /etc/ssh/ssh_config设置端口 Port 22启动ssh服务 sudo service ssh startxftp连接 主机地址&#xff1a;127.…...

Cross-View Transformers for Real-Time Map-View Semantic Segmentation 论文阅读

论文链接 Cross-View Transformers for Real-Time Map-View Semantic Segmentation 0. Abstract 提出了 Cross-View Transformers &#xff0c;一种基于注意力的高效模型&#xff0c;用于来自多个摄像机的地图视图语义分割使用相机感知的跨视图注意机制隐式学习从单个相机视…...

MySQL InnoDB 引擎底层解析(一)

6. InnoDB 引擎底层解析 MySQL 对于我们来说还是一个黑盒&#xff0c;我们只负责使用客户端发送请求并等待服务器返回结果&#xff0c;表中的数据到底存到了哪里&#xff1f;以什么格式存放的&#xff1f;MySQL 是以什么方式来访问的这些数据&#xff1f;这些问题我们统统不知…...

redis安装(Windows和linux)

如何实现Redis安装与使用的详细教程 Redis 简介 Redis是一个使用C语言编写的开源、高性能、非关系型的键值对存储数据库。它支持多种数据结构&#xff0c;包括字符串、列表、集合、有序集合、哈希表等。Redis的内存操作能力极强&#xff0c;其读写性能非常优秀&#xff0c;且…...

【LeetCode刷题-树】--1367.二叉树中的链表

1367.二叉树中的链表 方法&#xff1a;枚举 枚举二叉树中的每个节点为起点往下的路径是否与链表相匹配的路径&#xff0c;为了判断是否匹配设计了一个递归函数dfs(root,head),其中root表示当前匹配到的二叉树节点&#xff0c;head表示当前匹配到的链表节点&#xff0c;整个函数…...

【嵌入式 – GD32开发实战指南(ARM版本)】第2部分 外设篇 - 第3章 温度传感器DS18B20

1 理论分析 1.1 DS18B20概述 DS18B20 是 DALLAS 最新单线数字温度传感器,新的"一线器件"体积更小、适用电压更宽、更经济。Dallas 半导体公司的数字化温度传感器 DS1820 是世界上第一片支持 "一线总线"接口的温度传感器。 DS18B20采用的单总线协议,也…...

基于spring gateway 的静态资源缓存实现

由于子项目比较多&#xff0c;子项目都是通过嵌套的方式实现的。就会导致子页面加载比较慢&#xff0c;影响客户体验 实现思路&#xff08;AI搜的--!&#xff09;: 1、通过spring boot缓存实现静态资源缓存 2、在gateway过滤器&#xff0c;对静态资源进行缓存 直接上代码&a…...

SDUT OJ《算法分析与设计》搜索算法

A - 子集和问题 Description 子集和问题的一个实例为〈S,t〉。其中&#xff0c;S{ x1 &#xff0c; x2 &#xff0c;…&#xff0c;xn }是一个正整数的集合&#xff0c;c是一个正整数。子集和问题判定是否存在S的一个子集S1&#xff0c;使得&#xff1a; 。 试设计一个解子…...

【NI-DAQmx入门】校准

1.设备定期校准的理由 随着时间的推移电子器件的特性会发生自然漂移&#xff0c;可能会导致测量结果的不准确性。防止出现良品和差品筛选出错的情况满足行业国际标准降低设备出现故障的风险使测量结果更具备参考性 2.查找NI设备的校准间隔。 定期校准会使DAQ设备的精度保持在…...

C语言链表

head.h typedef struct Node_s{int data; //数据域struct Node_s *pNext; //指针域 } Node_t, *pNode_t;void headInsert(pNode_t *ppHead, pNode_t *ppTail, int data); void print(pNode_t pHead); void tailInsert(pNode_t *ppHead, pNode_t *ppTail, int data); void sort…...

LabVIEW进行MQTT通信及数据解析

需求&#xff1a;一般通过串口的方式进行数据的解析&#xff0c;但有时候硬件的限制&#xff0c;没法预留串口&#xff0c;那么如何通过网络的方式特别是MQTT数据的通信及解析 解决方式&#xff1a; 1.MQTT通信控件&#xff1a; 参考开源的mqtt-LabVIEW https://github.com…...

基于DOTween插件实现金币飞行到指定位置功能

文章目录 前言一、DOTween是什么&#xff1f;二、使用步骤1.导入DOTween插件在Unity官方插件商店找到DOTween插件导入DOTween插件启用DOTween插件 2.代码逻辑金币飞行代码控制飞行效果代码 3.物体配置1.物体上装配CoinEffect脚本2.在金币预制体上装配FlyControl脚本 三、效果展…...

python-opencv 培训课程作业

python-opencv 培训课程作业 作业一&#xff1a; 第一步&#xff1a;读取 res 下面的 flower.jpg&#xff0c;读取彩图&#xff0c;并用 opencv 展示 第二步&#xff1a;彩图 -> 灰度图 第三步&#xff1a;反转图像&#xff1a;最大图像灰度值减去原图像&#xff0c;即可得…...

【Go入门】并发

【Go入门】并发 有人把Go比作21世纪的C语言&#xff0c;第一是因为Go语言设计简单&#xff0c;第二&#xff0c;21世纪最重要的就是并行程序设计&#xff0c;而Go从语言层面就支持了并行。 goroutine goroutine是Go并行设计的核心。goroutine说到底其实就是协程&#xff0c;…...

Java虚拟机运行时数据区结构详解

Java虚拟机运行时数据区结构如图所示 程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。 多线程切换时&#xff0c;为了能恢复到正确的执行位置&#xff0c;每条线程…...

华为OD机试 - 转盘寿司(Java JS Python C)

目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码 Java算法源码...

【ATTCK】MITRE Caldera-emu插件

CALDERA是一个由python语言编写的红蓝对抗工具&#xff08;攻击模拟工具&#xff09;。它是MITRE公司发起的一个研究项目&#xff0c;该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的&#xff0c;能够较真实地APT攻击行为模式。 通过CALDERA工具&#xff0c;安全…...