pgvector扩展在IvorySQL Oracle兼容模式下的应用实践

向量数据库是生成式人工智能(GenAI)的关键组成部分。作为PostgreSQL的重要扩展,pgvector支持高达16000维的向量计算能力,使得PostgreSQL能够直接转化为高效的向量数据库。

IvorySQL基于PostgreSQL开发,因此它同样支持添加pgvector扩展。在Oracle兼容模式下,pgvector扩展同样可用,这为习惯使用Oracle的用户使用向量数据库提供了极大的便利

01

安装IvorySQL

注意,请确认你的环境已安装了IvorySQL。如尚未安装,可参考安装指南进行配置安装。

https://docs.ivorysql.org/cn/ivorysql-doc/v3.2/v3.2/6

1.1 设置PG_CONFIG环境变量

export PG_CONFIG=/usr/local/ivorysql/ivorysql-3/bin/pg_config

1.2 获取pg_vector源码

git clone --branch v0.6.2 https://github.com/pgvector/pgvector.git

1.3 安装 pgvector

cd pgvector
sudo --preserve-env=PG_CONFIG make
sudo --preserve-env=PG_CONFIG make instal

1.4 psql连接创建扩展

psql -U ivorysql -d ivorysql
ivorysql=# create extension vector;
CREATE EXTENSION

02

向量相似的对比方法介绍

点积 (dot product):向量的点积相似度是指两个向量之间的点积值,它适用于许多实际场景,例如图像识别、语义搜索和文档分类等。但点积相似度算法对向量的长度敏感,因此在计算高维向量的相似性时可能会出现问题。

内积 (inner product):全称为 Inner Product,是一种计算向量之间相似度的度量算法,它计算两个向量之间的点积(内积),所得值越大越与搜索值相似。

欧式距离 (L2):直接比较两个向量的欧式距离,距离越近越相似。欧几里得距离算法的优点是可以反映向量的绝对距离,适用于需要考虑向量长度的相似性计算。例如推荐系统中,需要根据用户的历史行为来推荐相似的商品,这时就需要考虑用户的历史行为的数量,而不仅仅是用户的历史行为的相似度。

余弦相似度 (Cosine):两个向量的夹角越小越相似,比较两个向量的余弦值进行比较,夹角越小,余弦值越大。余弦相似度对向量的长度不敏感,只关注向量的方向,因此适用于高维向量的相似性计算。例如语义搜索和文档分类。

03

pgvector提供的方法

欧式距离 (L2),内积 (inner product),余弦相似度 (Cosine)

图片

兼容Oracle测试用例,以varchar2作为Oracle兼容字段为例建表:

ivorysql=# CREATE TABLE items (id bigserial PRIMARY KEY, name varchar2(20), embedding vector(3));
CREATE TABLE
ivorysql=# select * from items;id |      name      | embedding
----+----------------+-----------1 | ora_demo       | [1,2,3]2 | ora_compatible | [4,5,6]
(2 rows)

3.1 欧式距离

距离值越小,越相近

ivorysql=# SELECT *, embedding <-> '[3,1,2]' result FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;id |      name      | embedding |      result
----+----------------+-----------+-------------------1 | ora_demo       | [1,2,3]   | 2.4494897427831782 | ora_compatible | [4,5,6]   | 5.744562646538029
(2 rows)

3.2 内积

值越大越与搜索值相似

ivorysql=# SELECT *, embedding <#> '[3,1,2]' result FROM items ORDER BY embedding <#> '[3,1,2]' LIMIT 5;id |      name      | embedding | result
----+----------------+-----------+--------2 | ora_compatible | [4,5,6]   |    -291 | ora_demo       | [1,2,3]   |    -11
(2 rows)

3.3 余弦相似

两个向量的夹角越小越相似,比较两个向量的余弦值进行比较,夹角越小,余弦值越大。

ivorysql=# SELECT *, embedding <=> '[3,1,2]' result FROM items ORDER BY embedding <=> '[3,1,2]' LIMIT 5;id |      name      | embedding |       result
----+----------------+-----------+---------------------2 | ora_compatible | [4,5,6]   | 0.116739889383899681 | ora_demo       | [1,2,3]   |  0.2142857142857143
(2 rows)

获取与某向量关联的向量

ivorysql=# SELECT * FROM items WHERE id != 1 ORDER BY embedding <-> (SELECT embedding FROM items WHERE id = 1) LIMIT 5;id |      name      | embedding
----+----------------+-----------2 | ora_compatible | [4,5,6]
(1 row)

04

pgvector提供的索引算法

4.1 HNSW

HNSW (Hierarchical Navigating Small World) 是一种基于图的索引算法,它由多层的邻近图组成,因此称为分层的 NSW 方法。它会为一张图按规则建成多层导航图,并让越上层的图越稀疏,结点间的距离越远;越下层的图越稠密,结点间的距离越近。

HNSW 算法是一种经典的空间换时间的算法,它的搜索质量和搜索速度都比较高,但是它的内存开销也比较大,因为不仅需要将所有的向量都存储在内存中。还需要维护一个图的结构,也同样需要存储。所以这类算法需要根据实际的场景来选择。

图片

pgvector的HNSW索引算法与Oracle兼容类型没有任何冲突,所以无需关心Oracle兼容类型是否会影响索引创建。

(1) L2 distance HNSW index
ivorysql=# CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);
CREATE INDEX

(2)Inner product HNSW index
ivorysql=# CREATE INDEX ON items USING hnsw (embedding vector_ip_ops);
CREATE INDEX

(3) Cosine distance HNSW index
ivorysql=# CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);
CREATE INDEX

4.2 ivfflat 

它的工作原理是将相似的向量聚类为区域,并建立一个倒排索引,将每个区域映射到其向量。这使得查询可以集中在数据的一个子集上,从而实现快速搜索。

通过调整列表和探针参数,ivfflat 可以平衡数据集的速度和准确性,使 PostgreSQL 有能力对复杂数据进行快速的语义相似性搜索。

通过简单的查询,应用程序可以在数百万个高维向量中找到与查询向量最近的邻居。对于自然语言处理、信息检索等,ivfflat 是一个比较好的解决方案

在建立 ivfflat 索引时,你需要决定索引中包含多少个 list。每个 list 代表一个 "中心";这些中心通过 k-means 算法计算而来。一旦确定了所有中心,ivfflat 就会确定每个向量最靠近哪个中心,并将其添加到索引中。

当需要查询向量数据时,你可以决定要检查多少个中心,这由 ivfflat.probes 参数决定。这就是 ANN 性能/召回率的结果:访问的中心越多,结果就越精确,但这是以牺牲性能为代价的。

图片

pgvector的ivfflat 索引算法与Oracle兼容类型没有任何冲突,所以无需关心Oracle兼容类型是否会影响索引创建。

(1)L2 distance ivfflat index
ivorysql=# CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops);
CREATE INDEX

(2) Inner product ivfflat index
ivorysql=# CREATE INDEX ON items USING ivfflat (embedding vector_ip_ops);
CREATE INDEX

(3) Cosine distance ivfflat index
ivorysql=# CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops);
CREATE INDEX

05

其他类型

5.1 Binary Vectors

Use thebit type to store binary vectors

ivorysql=# CREATE TABLE items5 (id bigserial PRIMARY KEY, name varchar2(20), num number(20), embedding bit(3));
CREATE TABLE
ivorysql=# INSERT INTO items5 (name, num, embedding) VALUES ('1st oracle data',0, '000'), ('2nd oracle data', 111, '111');
INSERT 0 2
ivorysql=# SELECT * FROM items5 ORDER BY bit_count(embedding # '101') LIMIT 5;id |      name       | num | embedding
----+-----------------+-----+-----------2 | 2nd oracle data | 111 | 1111 | 1st oracle data | 0   | 000
(2 rows)

06

Oracle兼容特性与pgvector适配

IvorySQL不仅支持Oracle的数据类型,还能够适配Oracle的匿名块、存储过程和函数等特性。安装了pgvector扩展的IvorySQL同样具备上述功能

6.1 匿名块

ivorysql=# declare
i vector(3) := '[1,2,3]';
begin
raise notice '%', i;
end;
ivorysql-# /
NOTICE:  [1,2,3]
DO

6.2 存储过程

ivorysql=# CREATE OR REPLACE PROCEDURE ora_procedure()
AS
p vector(3) := '[4,5,6]';
begin
raise notice '%', p;
end;
/
CREATE PROCEDURE
ivorysql=# call ora_procedure();
NOTICE:  [4,5,6]
CALL

6.3 函数

ivorysql=# CREATE OR REPLACE FUNCTION AddVector(a vector(3), b vector(3))
RETURN vector(3)
IS
BEGIN
RETURN a + b;
END;
/
CREATE FUNCTION
ivorysql=# SELECT AddVector('[1,2,3]','[4,5,6]') FROM DUAL;addvector
----------------[5,7,9]
(1 row)

*参考文章

《向量数据库与pgvector》

https://zhuanlan.zhihu.com/p/649779973

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

springboot图书个性化推荐系统的设计与实现+1w字文档

项目演示视频: 【源码免费送】基于springboot图书个性化推荐系统的设计与实现录像 摘 要 本论文主要论述了如何使用JAVA语言开发一个图书个性化推荐系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项…

大米生产线投资全解析:成本、影响因素及市场潜力

在粮食加工行业中&#xff0c;大米生产线的投资一直是备受关注的热点。那么&#xff0c;大米生产线究竟需要多少钱?其成本受哪些因素影响?与星派来深入解析这一问题&#xff0c;并探讨大米生产线的市场潜力。 一、大米生产线的投资成本 大米生产线的投资成本因多种因素而异&a…

【HTTP协议】了解http需要学习哪些内容

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是超文本传输协议&#xff0c;互联网上应用最广泛的一种协议&#xff0c;它负责在客户端和服务器之间传输数据。本文将从HTTP协议的基本原理、请求-响应模型、常见特性以及应用场景等方面进行总结。 1. HTTP基本原理 …

InternVL——GPT-4V 的开源替代方案

您的浏览器不支持 video 标签。 在人工智能领域&#xff0c;InternVL 无疑是一颗耀眼的新星。它被认为是最接近 GPT-4V 表现的可商用开源模型&#xff0c;为我们带来了许多惊喜。 InternVL 具备强大的功能&#xff0c;不仅能够处理图像和文本数据&#xff0c;还能精妙地理解…

Gone框架介绍8 - gone支持的注入方式总结

文章目录 Gone支持哪些方式注入&#xff1f;共有属性注入 vs 私有属性注入匿名注入 vs 具名注入匿名埋葬 和 具名埋葬匿名注入具名注入 支持注入的属性类型1.指针类型2.值类型3.接口类型4.Slice 类型5.Map 类型指针注入 vs 接口注入Slice注入 vs Map注入 我从头到尾实现了一个G…

天天看源码就是“智商税”?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

四种网络IO模型

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;面经 ⛺️稳中求进&#xff0c;晒太阳 IO的定义 IO是计算机内存与外部设备之间拷贝数据的过程。CPU访问内存的速度远高于外部设备。因此CPU是先把外部设备的数据读取到内存&#xff0c;在…

网络编程中有关字节序、地址的转换

大家好&#xff0c;这里是小缺&#xff0c;一名对嵌入式软件开发充满热情的探索者。这一篇文章主要内容是带大家了解网络编程中的字节序和地址转换。 1.1 字节序概述 字节序概念 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。 分类 小端格式:将…

详细介绍如何使用YOLOv9 在医疗数据集上进行实例分割-含源码+数据集下载

深度学习彻底改变了医学图像分析。通过识别医学图像中的复杂模式,它可以帮助我们解释有关生物系统的重要见解。因此,如果您希望利用深度学习进行医疗诊断,本文可以成为在医疗数据集上微调YOLOv9 实例分割的良好起点。 实例分割模型不是简单地将区域分类为属于特定细胞类型,…

标贝语音识别技术在金融领域中的应用实例

随着语音识别技术与文本挖掘、自然语言处理等技术的不断融合&#xff0c;智能语音交互技术在金融领域中爆发了出巨大的应用潜力。标贝科技根据自身与金融领域合作的经验为大家梳理出以下几点智能语音识别技术在金融领域中的应用实例。 一、智能柜台服务 语音识别的主要功能就…

ctfshow web78 获取flag(用老版的火狐浏览器)

题&#xff1a; 第一种&#xff1a;利用input伪协议 ,获取到flag ?filephp://input POST data <?php system(tac ls) ?> 第二种&#xff1a;利用flter协议,获取到flag https://21d9e58a-c0fd-47ea-a9c4-d875100f2fdb.challenge.ctf.show/?filephp://filter/readcon…

大语言模型在人类层面预测未来的研究与应用

概述 这项研究将探讨语言模型&#xff08;LM&#xff09;能否预测未来事件。在这项研究中&#xff0c;将开发一个系统来自动收集信息、生成和汇总预测结果。将从一个竞争性预测平台收集有关问题的数据&#xff0c;以评估 LM 的预测能力。结果表明&#xff0c;LM 可以与具有竞争…

# 使用 spring boot 时,@Autowired 注解 自动装配注入时,变量报红解决方法:

使用 spring boot 时&#xff0c;Autowired 注解 自动装配注入时&#xff0c;变量报红解决方法&#xff1a; 1、使用 Resource 代替 Autowired 注解&#xff0c;根据类型注入改为根据名称注入&#xff08;建议&#xff09;。 2、在 XXXMapper 上添加 Repository 注解&#xff0…

【MATLAB】解决不同版本MATLAB出现中文乱码的问题

解决不同版本MATLAB出现中文乱码的问题 方法1&#xff1a;更改保存类型为GBK方法2&#xff1a;记事本打开方法3&#xff1a;Notepad参考 低版本matlab打开高版本Matlab的.m文件时&#xff0c;出现中文乱码问题。比如下图&#xff1a; 出现原因为&#xff1a; 编码格式不统一问…

使用Redis Topic广播模式,实现类似mq消息的发布和订阅

一、背景 不同的mq中间件&#xff0c;不仅支持发送队列消息&#xff0c;也都可以发送广播消息。 有时候&#xff0c;我们的业务逻辑需要发送广播消息&#xff0c;却不想引入mq中间件时&#xff0c;推荐你使用redis的topic机制来实现。 原因是&#xff1a;它比较轻量级&#x…

为了不让共享单车进城,出租车司机剑走偏锋杀红了眼……

最近&#xff0c;小柴上网冲浪的时候&#xff0c;刷到一些看上去非常离谱的画面&#xff0c;不知道柴油们有没有刷到&#xff0c;大概是下面这样的&#xff0c;一道道出租车堆起来的钢铁长城…… 大量的出租车司机不出车&#xff0c;竟然联起手来&#xff0c;将车停在路边&…

Vue生命周期都有哪些?

定义 Vue的生命周期就是实例从创建到销毁的一个过程&#xff0c;即从创建、初始化数据、编译模板、挂载Dom($el)->渲染、更新->渲染&#xff0c;卸载等一系列的过程。el是挂载点如<div id"app"></div>。 Vue的生命周期分为八个阶段 1.beforeCreate…

在线教程|零门槛部署 Llama 3,70B 版本只占 1.07G 存储空间,新用户免费体验 8B 版本

4 月 18 日&#xff0c;Meta 宣布开源 Llama 3&#xff0c;这个号称「迄今为止最好的开源大模型」一经发布&#xff0c;立刻引爆科技圈&#xff01; 发布当天恰逢斯坦福大学教授、AI 顶尖专家吴恩达的生日&#xff0c;作为 AI 开源倡导者&#xff0c;他激动地发文表示&#xff…

Adobe推出AI视频超分辨率工具VideoGigaGAN

&#x1f989; AI新闻 &#x1f680; Adobe推出AI视频超分辨率工具VideoGigaGAN 摘要&#xff1a;Adobe公司最新推出的AI工具VideoGigaGAN&#xff0c;利用上采样技术将视频分辨率从128128提升至10241024。这一工具基于GigaGAN模型开发&#xff0c;专注于生成视频超分辨率&am…

华为手机回归之路:时隔13个季度,中国区市场份额重回第一 | 最新快讯

华为手机回归市场的速度&#xff0c;超出了市场预期。 根据市场分析机构 Canalys 发布的报告显示&#xff0c;2024 年第一季度&#xff0c;中国大陆智能手机市场时隔两年首次回暖&#xff0c;出货量与去年同期持平&#xff0c;达 6770 万台。其中&#xff0c;华为经历了 13 个季…