通过 SQL 快速使用 OceanBase 向量检索学习笔记

背景
AI时代离不开向量数据库,向量数据库简单说就是在数据库中用多维向量存储某类事物的特征,通过公式计算各个向量在空间坐标系中的位置关系,以此来判断事物之间的相似性。相关基础概念如下:
● Embedding
● 距离/相似性度量
○ Cosine distance
○ Inner_product
○ L1 distance
○ L2_distance
○ Jaccard Distance
○ Hamming distance
● 相似性搜索算法
○ 典型算法
■ 倒排 + 数据压缩
■ 导航图索引 +分布式
○ HNSW
○ IVF
○ DisKANN
● 索引压缩算法
○ SQ(Scalar Quantization)
○ PQ(Product Quantization)
OceanBase 在向量检索方面的优势
OceanBase 在向量检索方面的优势,主要有以下几点:
1.OceanBase 在通过向量数据类型(vector)实现向量存储,通过多种类型的向量索引支持了高效的向量检索。在向量查询时,不仅支持按 TOPN 排序的相似度计算,还能够按照标量进行点查。
2.在应用开发方面,为用户提供了 python API和类似于 MilvusSDK 的开发工具包,而且还可以直接复用 MySQL 生态的客户端,对开发友好。

3.在运维方面,不需要引入新的工具和组件,可以完全复用现有的运维平台和工具,如 OBD、OCPobdiag 等。不用学习新的工具,直接复用已有的运维经验即可。

4.在数据库的其他能力方面,相比于专用的向量数据库 Pinecone/Milvus,以及正在逐步补齐向量检索能力的老牌数据库厂商 Elasticsearch/Redis 等,OceanBase 是一个支持金融级高可用的分布式向量数据库,除了基础的向量检索能力,还支持金融级高可用和容灾、弹性扩缩容、分布式事务,并有着极低的存储成本和优秀的查询分析性能。

5.在性能上,ANN Benchmarks GIST 960 排名第一。下图的 Vsag 即为 OceanBase 向量化引擎插件,和目前最好的 glass 相比,在 96.7% 召回率的情况下 QPS 能够提升 90% 左右,做到了SOTA(State ofthe Art)。并且还会持续依靠蚂蚁集团大量的向量化场景和专业的算法团队,不断进行性能优

现在 OceanBase 作为向量数据库,在更低成本的基础上,还可以获得比某专业向量数据库 Milvus 更好的性能。
OceanBase 可以简单理解成是一个复用了金融级分布式数据库内核能力的超级向量数据库。同时,还拥有简单易用的 API接口和丰富的生态工具体系,大大降低了适配和运维的难度。
向量概念简述
向量数据库简单说就是:在数据库中用多维向量存储某类事物的特征,通过公式计算各个向量在空间中的位置关系,判断事物之间的相似性。向量是一个浮点数组,这个数组中的每个元素代表向量的某个维度,每个元素都是一个浮点数。向量数组的大小(元素个数),代表整个向量空间的维度。
● 一个对象可以抽取多种正交的特征,比如(体型、毛长等),每个特征代表向量的一个维度。
● 每个维度的精度越细,区分度越高。
● 维度数越多,区分度越高,查询的相对越精确。
● 比如结构化数据都在一维空间做计算,维度越高,计算/查询空间越大,计算量越大。
Embedding
通过深度学习神经网络提取非结构化数据里的内容和语义,把图片、视频等变成特征向量,这个过程叫Embedding.

Embedding 技术将原始数据从高维度(稀疏)空间映射到低维度(稠密)空间,将具有丰富特征的多态数据,转换为多维数组(向量),向量可以通过向量距离来做计算,判断原始多模态数据的相似性。
距离/相似性度量
常见的相似度测量方式会涉及到一些中学数学的基础知识,例如:余弦相似度、内积(点积)、欧几里得距离(欧式距离)、曼哈顿距离。
Cosine distance
余弦相似度(cosine similarity):计算两个向量间夹角的余弦值。当两个向量方向相同时余弦相似度的值为1;当两个向量夹角为 90 度时余弦相似度的值为 0,当两个向量方向完全相反时余弦相似度的值为-1。
余弦相似度的计算方式为:

由于余弦相似度度量越接近于1表示越相似,因此有时也使用余弦距离(或余弦不相似度)作为向量间距离的一种衡量方式,余弦距离可以通过1减去余弦相似度来计算:

余弦距离的取值范围是[0,2],其中0表示完全相同的方向(无距离),而2表示完全相反的方向。
Inner_product(lP/内积)
内积又称为点积或数量积,是线性代数中的一种重要运算,它定义了两个向量之间的一种乘积。在几何意义上,内积表征了两个向量的方向关系和大小关系。

除了和余弦相似度一样都会受到位置(或者叫夹角)关系的影响,向量的内积还会受到向量长度的影响。如果把向量进行归一化(即将每个向量除以其自身的长度,得到一个长度为1的单位向量),内积就将只反应方向,不涉及大小,此时内积就会变成上面的余弦相似度。

L1_distance
曼哈顿距离(Manhattan Distance)用于计算两个点在标准的坐标系中的绝对轴距总和。计算公式为:

一图胜千言,下图中的两个线条之和就表示两个向量在多维坐标系中的曼哈顿距离,也被称为城市街区距离。

L2 distance
欧几里得距离(Euclidean Distance)反映的是被比较的向量坐标之间的距离,也就是两个向量之间的直线距离。这个应该好理解,上图中的红色线条就表示两个向量在多维坐标系中的欧几里得距离。计算公式如下:

总结
Cosine(余弦距离):通过计算两个向量之间的夹角余弦值来衡量它们的相似程度,取值范围为
[-1,1],值越接近 1表示越相似。
● IP(lnner Product,内积):两个元素的对应元素相乘并求和的结果计算相似度,内积值越大相似度越高.通常在自然语言处理(NLP)领域中使用。
● L1(曼哈顿距离):曼哈顿距离是两个向量各个维度差值的绝对值之和。与欧氏距离不同,曼哈顿距离更关注各个维度的差异,而不是方向。
● L2(欧式距离):欧氏距离是两个向量之间的直线距离,可以表示为它们各个维度差值的平方和的平方根。欧氏距离越小,表示两个向量越相似,通常在自然语言处理(NLP)领域中使用。
针对二值向量的常用相似性度量方法
二值向量即向量中的每个元素要么是 0,要么是 1。二值向量的实现方式相比浮点向量也会有所不同,为了节省空间,数据库内部往往会用 byte 而非 float 来实现二值向量。
Jaccard Distance
杰卡德距离,计算的是两个集合并集中,不属于交集的元素的比例,用于反映差异度。

Hamming distance
汉明距离(Hamming distance)是数据传输差错控制编码中的概念,表示了两个字对应位不同的数量定义为将两个字进行异或运算后1的位数。

相似性搜索算法
向量数据库相似性搜索,是通过计算输入向量与目标向量的相似度,快速找出与输入向量最相似数据的搜索技术。这其中以 Approximate Nearest Neighbor(近似最近邻,ANN)搜索和以 K-Means 为代表的聚类搜索最具代表性。
典型算法
倒排+数据压缩
通过聚类算法(常用 KMeans 算法)将数据分为若干聚簇,按照聚簇中心建立倒排索引。每次搜索时先计算与聚簇中心的相似度,选择相似性最高聚簇进一步搜索。

导航图索引+分布式
将向量作为点,向量相似度作为边,建立近似近邻图,在图上进行贪心搜索逼近近邻区域。图索引在内存中最高效,因而对内存占用很大,经常基于分区以及分布式的方式,来解决大数据量的问题.缺点是成本高,有点是能够实现高召回率以及低延迟(思路类似六度分隔理论:最多通过六个人,你就能够认识任何一个陌生人)。

HNSW
Hierarchical Navigable Small World(分层导航小世界)小世界图是介于规则图和随机图之间的一种图结构,其特点是每个节点仅与很小有限的节点有联系,并且这些节点有一定的集中性。小世界图中大部分节点彼此并不联系,但大部分节点经过几步即可到达。HNSW 是基于“邻居的邻居可能是邻居”的核心思想,社交网络便是典型的小世界图结构。先看一个大家都更熟悉的数据结构 – 跳表 SkipList。
跳表是典型的用空间换取时间,索引分了好几层,最底层(图中 Level1)存储了所有的数据,而上面几层,则存储了指向某几个数据的索引,且越往上索引数量越少。跳表的作用就是:先快速的接近要查找的点的附近,然后再精确的搜索,这样就避免了路上做很多无用功耽误时间。个人理解,HNSW 就是将跳表运用在了图结构中。

跳表的每一层,都是一个小世界网络。其中最底层(Layer=0)是一个完整的 NSW(导航小世界网络),其它层存储的则是指向图节点的指针索引。使用类似于跳表的原因也很简单,为了少做无用功耽误时间。
上层小世界图可以看成是下层的缩放,多层图的方式目的是为了减少搜索时距离计算和比较的次数。检索时,从最高一层(即最稀疏的一层)开始,每一层得到的检索结果再作为下一层的输入,如此,不断迭代到最后一层。最后得到查询点的 K个近邻。HNSW 是目前最流行的向量检索算法,性能和召回率都比较不错,但是对内存有强依赖。
IVF
IVF(lnverted File Index)索引通过聚类算法将向量空间划分为多个子空间,并为每个子空间建立索引。在搜索过程中,IF 索引首先根据查询向量找到其所属的子空间(下图中红框表示子空间),然后在对应子空间中进行精确搜索。
优点是搜索速度快,缺点是召回率不优。因为聚类中心是预建的,增量数据的导入不会影响聚类中心的分布,数据更新后,依赖聚类的重建。

DiskANN
期望解决的问题:
如何能够减少访问磁盘的频率?先访问内存,只有真正需要原始向量时再去访问磁盘如何组织数据结构?保证一次读盘操作便可以取出相关的节点边图信息。DiskAnn 的思路:
DiskANN 算法结合了两类算法 – 聚类压缩算法和图结构算法。
算法如下:
通过压缩原始数据,仅将压缩后的码表信息和中心点映射信息放到内存中。而原始数据和C构建好的图结构数据存放到磁盘中,只需在查询匹配到特定节点时到磁盘中读取。修改向量数据和图结构的排列方式,将数据点与其邻居节点并排存放,这种方式使得一次磁盘操作即可完成节点的向量数据、邻接节点等信息的读取。

DiskANN 算法的优点和缺点多很明显
优点:大幅提升向量召回的读取效率,降低图算法的内存,提升召回率。
缺点:索引的构建开销较大,更适合静态数据集(或者不经常变的数据集合)
索引压缩算法
Quantized 是将现有的索引(如INF、HNSW)与量化等压缩方法结合起来,以减少内存占用并加快搜索速度。
向量的压缩,一般是基于降低向量维度,降低向量元素的精度的思路,分为两类:标量量化(ScalarQuantization,SQ)和乘积量化(Product Quantization,PQ)。例如 IVF-PQ、HNSW-PQ。
SQ(Scalar Quantization)
思想是:把一个高精度的浮点向量,主动丢失部分精度,变为一个低精度向量,减少计算和存储开销。
例如把向量中的元素 0.1192 和 0.1365 统一用 0.1 来替换。
大致原理:
1.分割范围:首先确定向量中数值的大致范围,然后将这个范围分成若干个等间隔的小段或桶(这称为量化级别或量化步长)。
2.映射值:将原始向量中的每个元素映射到最近的一个桶中。具体来说,就是将每个浮点数值舍入到其最近的量化级别的中心值,这个过程通常称为量化。
编码:被映射到各个桶中的值可以用更紧凑的形式表示,例如,用桶的索引(一个整数)来代替原3.始的浮点数,从而实现压缩。

PQ(Product Quantization)
思想是:把高维向量空间降维。因为低维向量的存储和计算开销都远远低于高维。
大致原理:
1.分组(Dimension Splitting):首先,将原始的高维向量空间分成多个子空间,通常是将 d维向量分为 m 个大小相等的子集,每个子集包含 d/m 维。这样做的目的是将一个复杂的高维问题分解为多个较低维度的问题,便于处理。
2.量化编码(Codebook Generation):对于每个子空间,构建一个码本(codebook)。码本是一个由k个向量组成的集合,这些向量是该子空间内所有训练向量的聚类中心。这一步通常通过聚类算法完成,每个子空间的向量被分配到离它最近的聚类中心。
3.编码(Encoding):对于每一个高维向量,将其在每个子空间上的投影与相应的码本进行比较,找出距离最近的码本向量,并记录下这个向量在码本中的索引。这样,原始的高维向量就被转换为了一个长度为 m 且每个元素范围在 0到k-1之间的整数序列,即可得到一个紧凑的量化表示。

召回率
最后再来一个大家都可以轻松理解的概念 – 召回率。召回率是说:检索出来的结果集中,接近目标向量的结果比例。召回率=真正例/(真正例 + 假反例)。暴力搜索的召回率可以100%,但是基本不可接受。基于向量索引搜索的召回率一般低于 100%,是一个非精确的搜索。召回率和向量索引的组织算法,压缩(压缩本质是通过降低精度,减少计算开销)算法等相关。
实验:通过 SQL 快速使用 OceanBase 向量检索
OceanBase 向量检索能力基于多模一体化能力上构建,在融合查询、扩展性、高性能、高可用、低成本、多租户、数据安全等方面均有优异的表现。有关向量检索的详细介绍,参考 向量检索。
注意:本篇教程以 MySQL 模式为例进行说明。
连接数据库
obclient -h127.0.0.1 -P2881 -uroot@mysql_tenant -A -Dtest
创建向量表
创建表时,可以使用 VECTOR(dim) 数据类型声明指定列为向量列及其维度。向量索引需要创建在向量列上,且至少需要提供 type 和 distance 两个参数。
示例中创建向量列 embedding,向量数据维度为 3,并在 embedding 列上创建 HNSW 索引,指定距离算法为 L2。
CREATE TABLE t1( id INT PRIMARY KEY, doc VARCHAR(200), embedding VECTOR(3), VECTOR INDEX idx1(embedding) WITH (distance=L2, type=hnsw) );
在数据量较大的情况下建议先导入完数据再创建向量索引,后建索引详情请参见 向量索引。
写入向量数据
为了模拟在向量检索的场景,需要先构造一些向量数据,每行数据都包括对数据的描述和对应的向量。示例中假设 ‘苹果’ 对应的向量为 ‘[1.2,0.7,1.1]’, ‘胡萝卜’ 对应的向量为 ‘[5.3,4.8,5.4]’ 等。
INSERT INTO t1 VALUES (1, ‘苹果’, ‘[1.2,0.7,1.1]’), (2, ‘香蕉’, ‘[0.6,1.2,0.8]’), (3, ‘橙子’,‘[1.1,1.1,0.9]’), (4, ‘胡萝卜’, ‘[5.3,4.8,5.4]’), (5, ‘菠菜’, ‘[4.9,5.3,4.8]’), (6, ‘西红柿’,‘[5.2,4.9,5.1]’);
为了方便展示,本例简化了向量的维度,仅使用了 3 维向量,且向量是人工生成的。在实际应用中,需要使用嵌入模型对真实的文本进行生成,维度会达到数百或上千维。
可以通过查询表中的数据查看是否写入成功。
SELECT * FROM t1;
返回结果如下:
obclient [test]> SELECT * FROM t1;
±—±----------±--------------+
| id | doc | embedding |
±—±----------±--------------+
| 1 | 苹果 | [1.2,0.7,1.1] |
| 2 | 香蕉 | [0.6,1.2,0.8] |
| 3 | 橙子 | [1.1,1.1,0.9] |
| 4 | 胡萝卜 | [5.3,4.8,5.4] |
| 5 | 菠菜 | [4.9,5.3,4.8] |
| 6 | 西红柿 | [5.2,4.9,5.1] |
±—±----------±--------------+
6 rows in set (0.008 sec)
执行向量检索
进行向量检索需要提供向量作为搜索条件。假设我们需要找到所有 ‘水果’,其对应的向量为 [0.9, 1.0, 0.9],则对应 SQL 为:
SELECT id, doc FROM t1 ORDER BY l2_distance(embedding, ‘[0.9, 1.0, 0.9]’) APPROXIMATE LIMIT 3;
返回结果如下:
obclient [test]> SELECT id, doc FROM t1 ORDER BY l2_distance(embedding, ‘[0.9, 1.0, 0.9]’) APPROXIMATE LIMIT 3;
±—±-------+
| id | doc |
±—±-------+
| 3 | 橙子 |
| 2 | 香蕉 |
| 1 | 苹果 |
±—±-------+
3 rows in set (0.094 sec)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PromptAD:首次引入提示学习,实现精准工业异常检测,1张正常样本即可超越现有方法

近年来,工业异常检测(Anomaly Detection)在智能制造、质量监控等领域扮演着越来越重要的角色。传统方法通常依赖大量正常样本进行训练,而在实际生产中,异常样本稀少甚至不存在,能否仅凭少量正常样本就实现精…

算法 --- 字符串

字符串 字符串算法题目主要处理文本的查找、匹配、比较、变换和统计问题,其核心特点是输入数据为字符序列,解题关键在于利用其连续性、前缀性、字典序等特性,并常借助哈希、自动机、指针滑动、动态规划等技巧高效处理。 详细分类型与适用场景…

SpringBoot中 Gzip 压缩的两种开启方式:GeoJSON 瘦身实战

目录 前言 一、GZIP压缩知识简介 1、什么是Gzip 2、Gzip特点 3、Gzip在GIS方面的应用 二、SpringBoot中开启Gzip的方式 1、在SpringBoot中开启Gzip的知识简介 2、SpringBoot中GeoJSON的实例 三、全局开启Gzip实现 1、实现原理 2、实现效果 四、局部约定配置 1、实现…

PPTist+cpolar:开源演示文稿的远程创作方案

文章目录前言【视频教程】1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址6. 配置固定公网地址前言 PPTist作为开源在线演示文稿工具,提供媲美PowerPoint的核心功能,支持多页面编辑、图表插入、音视频嵌入和动画效果设置。特…

服务注册/服务发现-Eureka

目的:解决微服务在调用远程服务时URL写死的问题注册中心服务提供者(Server):一次业务中,被其他微服务调用的服务,也就是提供接口给其他微服务。服务消费者(Client):一次业务中&#…

cuda stream

基本概念 cuda stream表示GPU的一个操作队列,操作在队列中按照一定的顺序执行,也可以向流中添加一定的操作如核函数的启动、内存的复制、事件的启动和结束等 一个流中的不同操作有着严格的顺序,但是不同流之间没有任何限制 cuda stream中排队…

数据结构:完全二叉树

完全二叉树 定义: 按层序遍历(从上到下,从左到右)填充节点。 除了最后一层外,其余各层必须全满。 最后一层的节点必须 连续靠左。 完全二叉树不一定是满二叉树。 满二叉树 (Full Binary Tree):每个节点都有…

【Java初学基础】⭐Object()顶级父类与它的重要方法equals()

object类常见方法/*** native 方法&#xff0c;用于返回当前运行时对象的 Class 对象&#xff0c;使用了 final 关键字修饰&#xff0c;故不允许子类重写。*/ public final native Class<?> getClass() /*** native 方法&#xff0c;用于返回对象的哈希码&#xff0c;主…

用深度学习(LSTM)实现时间序列预测:从数据到闭环预测全解析

用深度学习&#xff08;LSTM&#xff09;实现时间序列预测&#xff1a;从数据到闭环预测全解析 时间序列预测是工业、金融、环境等领域的核心需求——小到预测设备温度波动&#xff0c;大到预测股价走势&#xff0c;都需要从历史数据中挖掘时序规律。长短期记忆网络&#xff08…

gpu-z功能介绍,安装与使用方法

GPU-Z 功能介绍、安装与使用方法 一、核心功能 硬件信息检测 识别显卡型号、制造商、核心架构&#xff08;如NVIDIA Ada Lovelace、AMD RDNA 3&#xff09;、制造工艺&#xff08;如5nm、7nm&#xff09;。显示显存类型&#xff08;GDDR6X、HBM2e&#xff09;、容量、带宽及显…

数据搬家后如何处理旧 iPhone

每年&#xff0c;苹果都会推出新款 iPhone&#xff0c;激发了人们升级到 iPhone 17、iPhone 17 Pro、iPhone 17 Pro Max 或 iPhone Air 等新机型的热情。但在获得新 iPhone 之前&#xff0c;有一件重要的事情要做&#xff1a;将数据从旧 iPhone 转移到新设备。虽然许多用户都能…

Java关键字深度解析(上)

这是一份全面的Java关键字实战指南 目录 1.数据类型关键字:内存布局与性能优化 1.1 基础类型的内存密码 byte-内存的极简主义者 int-Java世界的万能钥匙 long - 时间与ID的守护者 1.2 引用类型的架构设计 String-不是关键字但胜于关键字 2.访问修饰符:企业级权限控制 …

C语言深度解析:指针数组与数组指针的区别与应用

目录 1 引言&#xff1a;从名字理解本质区别 2 指针数组&#xff1a;灵活管理多个指针 2.1 基本概念与声明方式 2.2 内存布局与特性 2.3 典型应用场景&#xff1a;字符串数组与多维度数据管理 2.3.1 静态分配示例&#xff1a;字符串数组 2.3.2 动态分配示例&#xff1a;…

Node.js 高级应用:负载均衡与流量限制

在当今高并发的网络应用环境中&#xff0c;如何有效地分配服务器资源并保护系统免受恶意攻击是开发者必须面对的重要问题。Node.js 作为一款广受欢迎的服务器端 JavaScript 运行时环境&#xff0c;提供了丰富的工具和模块来应对这些挑战。本文将深入探讨如何在 Node.js 中实现负…

信任链验证流程

信任链验证流程 (The Chain of Trust)整个过程就像一场严格的接力赛&#xff0c;每一棒都必须从可信的上一位手中接过接力棒&#xff08;信任&#xff09;&#xff0c;验证无误后&#xff0c;再跑自己的那段路&#xff0c;并把信任传递给下一棒现在&#xff0c;我们来详细解读图…

黄昏时刻复古胶片风格人像风光摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程这套 黄昏时刻复古胶片风格人像风光摄影后期 Lr 调色方案&#xff0c;以落日余晖为核心色彩元素&#xff0c;加入复古胶片质感&#xff0c;让画面充满温暖与怀旧氛围。整体色调偏向橙红与青绿的互补对比&#xff0c;天空的夕阳光影与人像肤色相互映衬&#xff0c;既有胶…

硬件驱动——I.MX6ULL裸机启动(3)(按键设置及中断设置

重点&#xff1a;1.GIC&#xff1a;&#xff08;Generic Interrupt Controller&#xff09;通用中断控制器&#xff0c;是ARM架构中用于管理中断的核心模块&#xff0c;主要用于现代多核处理器系统。它负责接收&#xff0c;分发并分发中断请求&#xff0c;减轻CPU负担&#x…

用deepseek对GPU服务器进行压力测试

利用 DeepSeek 模型对 GPU 服务器进行压力测试&#xff0c;核心思路是通过模拟高负载的模型推理 / 微调任务&#xff0c;验证 GPU 服务器在计算、显存、网络等维度的承载能力&#xff0c;同时观察稳定性与性能瓶颈。以下是具体的测试方案&#xff0c;涵盖测试环境准备、核心测试…

ARM(7)IMX6ULL 按键控制(轮询 + 中断)优化工程

一、硬件介绍1. 开关功能定义共 3 个开关&#xff08;两红一黄&#xff09;&#xff0c;功能分工明确&#xff1a;中间开关&#xff1a;复位按钮左边开关&#xff1a;低功耗按钮右边开关&#xff1a;用户独立控制的试验按键&#xff08;核心控制对象&#xff09;2. 核心电平逻辑…

【QT随笔】什么是Qt元对象系统?Qt元对象系统的核心机制与应用实践

【QT随笔】什么是Qt元对象系统&#xff1f;Qt元对象系统的核心机制与应用实践 之所以写下这篇文章&#xff0c;是因为前段时间自己面试的时候被问到了&#xff01;因此想借此分享一波&#xff01;&#xff01;&#xff01;本文主要详细解释Qt元对象系统的概念、作用及实现机制…