PostgreSQL pgvector:如何利用向量数据库提升搜索效率和精度

LLMs模型实战教程

文章来源:https://zhuanlan.zhihu.com/p/641516393

Kevin
一、介绍
随着基础模型的兴起,向量数据库的受欢迎程度也飙升。事实上,在大型语言模型环境中,向量数据库也很有用。

在机器学习领域,我们经常处理的是向量嵌入。向量嵌入是通过特定的机器学习模型运行对象的特征,将对象的上下文信息投射到潜在空间中来创建的。

为了在使用向量嵌入时能够表现得特别好,创建向量数据库是必要的。这方面的工作包括存储、更新和检索向量。当我们谈论检索时,通常是指检索与查询最相似的向量,这些向量与嵌入到同一潜在空间并传递到向量数据库中。这个检索过程被称为近似最近邻。

嵌入是由人工智能模型生成的,并且由于它们包含大量属性或特征,因此管理它们的表示可能很困难。在人工智能和机器学习的背景下,这些特征代表数据的许多元素,所有这些元素对于理解模式、相关性和底层结构都是必要的。

因此,我们需要专门为管理此类信息而开发的数据库。像Chroma-DB这样的向量数据库能够满足这一需求,因为它们提供了经过优化的嵌入式存储和查询功能,并且具备典型数据库所不具备的独立向量索引特性。此外,向量数据库还具备处理向量嵌入的专门能力,这是传统基于标量的数据库所不具备的。

PostgreSQL是一个强大的对象关系数据库系统,可在开源许可下使用。它已经积极开发了超过35年,这使得它在可靠性、稳健性和性能方面建立了良好的声誉。好消息是,除了外部扩展之外,PostgreSQL还支持向量。

一些流行的向量数据库包括:Pinecone、Weviate、Chroma、Milvus、Faiss。尽管Redis、Cassandra等数据库并非向量数据库,但越来越多的数据库提供商开始提供ANN搜索功能。

二、什么是向量数据库
向量数据库是一种专门用于存储、管理和搜索向量数据的数据库。它以向量的形式存储数据,其中向量是抽象实体(如图像、音频文件、文本等)的数学表示。通过存储数据向量并使用向量之间的相似度度量,向量数据库可以实现高效、准确的数据搜索和分析。

下面显示了一个非常简单的示例。虽然顶部的两个句子的含义非常相似,但底部的句子却截然不同。向量数据库能够将这些句子编码为向量,然后找到接近的句子 - 这意味着它们是相似的。

请记住,在实际应用中,我们拥有的维度远不止 2 个维度 - OpenAI 嵌入目前使用大约 1500 个维度来进行有意义的语言矢量化。

向量数据库的核心特点如下:

1)、向量表示:向量数据库将复杂的数据类型转换为向量表示,使得高维数据能够以多维空间中的点的形式表示。这种表示不仅具有高计算效率,还简化了数据点之间的比较和关联过程。

2)、基于相似性的搜索:向量数据库擅长根据向量表示来搜索与给定查询相似的数据项。它们使用欧氏距离、余弦相似度或曼哈顿距离等相似性度量来确定多维空间中数据点之间的接近程度,从而找到最相关和最相似的结果。

3)、可扩展性:向量数据库被设计成能够处理大规模的数据集,并且在数据集大小增长时能够保持高搜索精度和响应时间。此外,它们通常提供并行处理和分布式计算的机制,以满足不断增长的数据需求。

4)、与机器学习和人工智能兼容:随着人工智能和机器学习应用的迅速增长,向量数据库的采用也在增加。将复杂数据转换为向量表示可以与这些算法无缝集成,从而获得规模化的有价值洞见和预测。

总之,向量数据库利用向量数据的特性,提供高效、准确的搜索和分析功能。它们在处理高维数据和进行相似性搜索方面具有优势,并且与机器学习和人工智能应用的兼容性使其在各个领域中变得越来越重要。

三、向量数据库的应用场景
向量数据库具有多种应用场景,以下是其中一些突出的应用领域:

自然语言处理(NLP):向量数据库可以有效处理词嵌入或文档向量,促进语义搜索和文本分析。它们可以用于文档分类、情感分析、关键词提取等任务,帮助组织理解来自社交媒体、论坛、客户互动等数据源的大量文本数据。
图像搜索和识别:图像数据库受益于向量数据库的向量表示和基于相似性的搜索功能。通过识别高维数据的相似性和模式,它们可以有效处理反向图像搜索、对象检测、人脸识别等任务。
推荐系统:强大的推荐引擎是现代电子商务和内容平台的关键组成部分之一。通过使用向量数据库,这些系统可以分析用户偏好和内容特征,实时生成个性化且高度相关的推荐。
异常检测和欺诈预防:特定领域的数据点(如金融交易或用户行为)可以转换为向量表示,进行实时分析。基于相似性的搜索功能可以快速识别异常模式或潜在欺诈,帮助组织减少风险。
基因组研究:在基因组学领域,研究人员处理复杂的生物数据,并经常需要识别相似的基因序列或结构。向量数据库的强大搜索功能可以加速这一过程,更准确地进行关键发现和进展。
多媒体内容管理:向量数据库可以通过将音频和视频转换为向量表示来处理各种内容。这种能力使得内容搜索和分析变得更加普遍,实现了基于相似性、模式识别或自动内容标记的媒体无缝检索。
除了上述应用领域,向量数据库在许多其他行业和领域中也有广泛的应用。随着对向量数据库潜力认识的增加,其在数据管理和分析方面的采用和探索将继续推动创新和发展。

四、PostgreSQL 向量扩展-pgvector
pgvector 是一个基于 PostgreSQL 的扩展,为用户提供了一套强大的功能,用于高效地存储、查询和处理向量数据。它具有以下特点:

直接集成:pgvector 可以作为扩展直接添加到现有的 PostgreSQL 环境中,方便新用户和长期用户获得矢量数据库的好处,无需进行重大系统更改。
支持多种距离度量:pgvector 内置支持多种距离度量,包括欧几里德距离、余弦距离和曼哈顿距离。这样的多功能性使得可以根据具体应用需求进行高度定制的基于相似性的搜索和分析。
索引支持:pgvector 扩展为矢量数据提供高效的索引选项,例如 k-最近邻 (k-NN) 搜索。即使数据集大小增长,用户也可以实现快速查询执行,并保持较高的搜索准确性。
易于查询语言访问:作为 PostgreSQL 的扩展,pgvector 使用熟悉的 SQL 查询语法进行向量操作。这简化了具有 SQL 知识和经验的用户使用矢量数据库的过程,并避免了学习新的语言或系统。
积极的开发和支持:pgvector 经常更新,以确保与最新的 PostgreSQL 版本和功能兼容,并且开发者社区致力于增强其功能。用户可以期待一个受到良好支持的解决方案,满足其矢量数据的需求。
稳健性和安全性:通过与 PostgreSQL 的集成,pgvector 继承了相同级别的稳健性和安全性功能,使用户能够安全地存储和管理其矢量数据。
总之,pgvector 是一个功能强大的 PostgreSQL 扩展,为用户提供了高效、灵活和可靠的方式来处理向量数据。它的直接集成、多种距离度量支持、索引支持和易于访问的查询语言使其成为处理矢量数据的理想选择。

4.1、如何使用 pgvector
在数据库服务器上安装 pgvector
cd /tmp
git clone --branch v0.4.2 https://github.com/pgvector/pgvector.git
cd pgvector
make
make install # 可能需要sudo
在您的数据库中,运行此命令以启用扩展
CREATE EXTENSION IF NOT EXISTS vector;
创建一个存储向量的表
CREATE TABLE items (id bigserial PRIMARY KEY, name, features vector(3));
添加数据的工作原理如下
INSERT INTO items (features) VALUES (‘[1,2,3]’), (‘[4,5,6]’);
由于 pgvector 构建在 postgres 之上,因此许多 PG DML 可用。例如。要更新插入,您可以运行
INSERT INTO items (id, features) VALUES (1, ‘[1,2,3]’), (2, ‘[4,5,6]’)
2ON CONFLICT (id) DO UPDATE SET features = EXCLUDED.features;
4.2、pgvector 查询运算符
在 pgvector 中,可以使用各种查询运算符对矢量数据进行不同的操作。这些运算符主要用于计算向量之间的相似度或距离,其中一些运算符使用不同的距离度量。以下是一些常用的 pgvector 查询运算符:

<->:该运算符计算两个向量之间的欧几里德距离。欧几里德距离是多维空间中向量表示的点之间的直线距离。较小的欧几里德距离表示向量之间的相似性较大,因此该运算符在查找和排序相似项目时非常有用。
SELECT id, name, features, features <-> ‘[0.45, 0.4, 0.85]’ as distance
2FROM items
3ORDER BY features <-> ‘[0.45, 0.4, 0.85]’;
<=>:该运算符计算两个向量之间的余弦相似度。余弦相似度比较两个向量的方向而不是它们的大小。余弦相似度的范围在 -1 到 1 之间,1 表示向量相同,0 表示无关,-1 表示向量指向相反方向。
SELECT id, name, features, features <=> ‘[0.45, 0.4, 0.85]’ as similarity
2FROM items
3ORDER BY features <=> ‘[0.45, 0.4, 0.85]’ DESC;
<#>:该运算符计算两个向量之间的曼哈顿距离(也称为 L1 距离或城市街区距离)。曼哈顿距离是每个维度对应坐标差的绝对值之和。相对于欧几里德距离而言,曼哈顿距离更加强调沿着维度的较小移动。
SELECT id, name, features, features <#> ‘[0.45, 0.4, 0.85]’ as distance
2FROM items
3ORDER BY features <#> ‘[0.45, 0.4, 0.85]’;p
在选择适当的运算符时,您应该考虑您的应用需求和数据特性。这可能涉及保持相对距离、强调大小或方向以及关注特定维度等因素。请注意,根据您的数据和用例,运算符的选择可能会对搜索结果的质量以及最终应用程序的有效性产生重大影响。

4.3、pgvector索引
在 pgvector 中,可以通过添加索引来使用近似最近邻搜索,以提高查询性能。以下是一些关于 pgvector 索引的建议:

1)、在表中有一定数量的数据后创建索引:在创建索引之前,确保表中有足够的数据,以便索引能够提供更好的查询性能。

2)、选择适当数量的列表:可以根据表的大小来选择适当数量的列表。一般来说,可以使用表的行数除以 1000(最多 1M 行)和平方根(rows)(超过 1M 行)作为起点。

3)、指定适当的探针数量:在执行查询时,可以指定适当的探针数量来平衡查询速度和召回率。一般来说,可以使用列表数量除以 10(最多 1M 行)和平方根(lists)(超过 1M 行)作为起点。

这些建议可以帮助您在近似最近邻搜索中获得良好的准确性和性能。请注意,具体的索引配置可能需要根据您的数据和查询需求进行调整,以达到最佳性能。

BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT …
COMMIT;
为您要使用的每个距离函数添加一个索引。

L2距离
CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);
内积
CREATE INDEX ON items USING ivfflat (embedding vector_ip_ops) WITH (lists = 100);
余弦距离
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
五、总结
在这篇文章中,我们探讨了矢量数据库在管理高维数据和其在各个行业中的应用中的重要性。我们介绍了 pgvector,这是一个功能强大的 PostgreSQL 扩展,支持矢量数据的存储和搜索,并提供了一个易于访问的矢量数据库解决方案。通过实用指南,我们演示了如何使用 pgvector 创建表、插入数据和查询相似项。此外,我们还讨论了 pgvector 中用于计算相似性度量的不同查询运算符,如欧几里得距离、余弦相似度和曼哈顿距离。

通过使用 pgvector,我们可以轻松地处理高维数据,并根据具体需求进行相似性搜索和分析。pgvector 的直接集成、索引支持和易于查询的语言使其成为处理矢量数据的理想选择。无论是新用户还是长期用户,都可以从中获得矢量数据库的好处,而无需进行重大系统改动。

在选择适当的查询运算符和索引配置时,我们应该考虑数据特性、查询需求以及平衡准确性和性能的要求。通过合理地配置和使用 pgvector,我们可以获得高效、准确且可靠的矢量数据解决方案,满足不同行业和应用的需求。

项目地址:https://github.com/pgvector/pgvector

发布于 2023-07-04 23:33・IP 属地广东

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

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

相关文章

天池SQL训练营(三)-复杂查询方法-视图、子查询、函数等

-天池龙珠计划SQL训练营 SQL训练营页面地址&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicampsql 3.1 视图 我们先来看一个查询语句&#xff08;仅做示例&#xff0c;未提供相关数据&#xff09; SELECT stu_name FROM view_students_info;单从表面上看起来…

C#反射加载程序集并使用

具体实现参考&#xff1a; C# 动态加载DLL通过反射调用参数、方法、窗体_c#反射加载dll并传入参数-CSDN博客 C#进阶学习--反射(Reflection) - 知乎 走进C#反射机制 - 知乎 1.使用过程 //创建数据集 Assembly outerAsm Assembly.LoadFile("D:/your.dll");//获取…

rancher harvester deploy demo 【部署 harvester v1.2.1】

简介 Harvester 是一个现代的、开放的、可互操作的、基于Kubernetes的超融合基础设施(HCI)解决方案。它是一种开源替代方案&#xff0c;专为寻求云原生HCI解决方案的运营商而设计。Harvester运行在裸机服务器上&#xff0c;提供集成的虚拟化和分布式存储功能。除了传统的虚拟机…

pgsql存储过程

由于部分企业数据库从aws迁移到腾讯云&#xff0c;导致有一个定时任务&#xff08;从详情表汇总数据到统计表中&#xff09;错过了触发&#xff0c;所以这部分企业的数据需要触发重新刷一下&#xff0c;但是又有规定白天不允许上线&#xff0c;只能把定时任务的逻辑用存储过程&…

SQL SELECT 语句

SELECT 语句用于从数据库中选取数据。 SQL SELECT 语句 SELECT 语句用于从数据库中选取数据。 结果被存储在一个结果表中&#xff0c;称为结果集。 SQL SELECT 语法 SELECT column1, column2, ... FROM table_name; 与 SELECT * FROM table_name; 参数说明&#xff1a; …

五花八门客户问题(BUG) - 用好strace

strace简介 strace是一个用于跟踪系统调用和信号传递的Linux命令,它是一个集诊断、调试、统计于一体的工具。strace可以监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。它底层使用内核的ptrace特性来实现其功能。 strace最简单的用法是执行一个指定…

二分查找|双指针:LeetCode:2398.预算内的最多机器人数目

作者推荐 本文涉及的基础知识点 二分查找算法合集 滑动窗口 单调队列&#xff1a;计算最大值时&#xff0c;如果前面的数小&#xff0c;则必定被淘汰&#xff0c;前面的数早出队。 题目 你有 n 个机器人&#xff0c;给你两个下标从 0 开始的整数数组 chargeTimes 和 runnin…

Django回顾7

一.Django缓存 1.缓存介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力…

算法:最长公共前缀(横向扫描和纵向扫描)

横向扫描 时间复杂度 O(m * n)&#xff0c;空间复杂度O(1) /*** param {string[]} strs* return {string}*/ var longestCommonPrefix function(strs) {// 先把第一个字符串拿出来let str strs[0]// 用 startsWith 检查数组中每个字符串是否以当前字符串为前缀while(!strs.e…

听GPT 讲Rust源代码--src/tools(11)

File: rust/src/tools/rust-analyzer/crates/hir/src/lib.rs 在Rust源代码中&#xff0c;rust/src/tools/rust-analyzer/crates/hir/src/lib.rs文件的作用是定义了Rust语言的高级抽象层次&#xff08;Higher-level IR&#xff0c;HIR&#xff09;。它包含了Rust语言的各种结构和…

Python:核心知识点整理大全10-笔记

目录 5.4 使用 if 语句处理列表 5.4.1 检查特殊元素 toppings.py 5.4.2 确定列表不是空的 5.4.3 使用多个列表 5.5 设置 if 语句的格式 5.6 小结 第6章 字 典 6.1 一个简单的字典 alien.py 6.2 使用字典 6.2.1 访问字典中的值 6.2.2 添加键—值对 6.2.3 先创建一…

智能优化算法应用:基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜉蝣算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜉蝣算法4.实验参数设定5.算法结果6.参考文献7.MA…

JAVA+SSM+springboot+MYSQL企业物资库存进销存管理系统

。该系统从两个对象&#xff1a;由管理员和员工来对系统进行设计构建。主要功能包括首页、个人中心、员工管理、项目信息管理、仓库信息管理、供应商管理、项目计划管理、物资库存管理、到货登记管理、物资出库管理、物资入库管理等功能进行管理。本企业物资管理系统方便员工快…

linux 定时任务

使用 crontab Usage: crontab [-u user] [-e|-l|-r] Crontab 的格式说明如下: * 逗号(‘,’) 指定列表值。如: “1,3,4,7,8″ * 中横线(‘-’) 指定范围值 如 “1-6″, 代表 “1,2,3,4,5,6″ * 星号 (‘*’) 代表所有可能的值 */15 表示每 15 分钟执行一次 # Use the ha…

C++编程法则365天一天一条(24)RTTI运行时类型信息typeid和type_info

文章目录 基本用法编译时或运行时判定 基本用法 typeid 是 C 的一个运算符&#xff0c;它用于获取表达式的类型信息。它返回一个 std::type_info 对象引用&#xff0c;该对象包含有关表达式的类型的信息。 要使用 typeid 运算符&#xff0c;需要包含 <typeinfo> 头文件…

关于振动试验

这是试验的说明&#xff08;来自gbt4710-2009&#xff09; 这是试验的参数&#xff1a; 一、试验方向&#xff1a; 振动试验中有几个方向 除有关规范另有规定外&#xff0c;应在产品的三个互相垂直方向上进行振动试验。 一般定义产品长边为X轴向&#xff0c;短边为Y轴向&…

飞书面试题汇总

面试相关经验 Interview | JavaGuide(Java面试 学习指南) 同学1 7次面试 编程题汇总&#xff1a; 有序链表找中位数 &#xff08;飞书1面&#xff09; m个有序数组合并 &#xff08;飞书1面&#xff09; 海量数据寻找TopK&#xff08;口述&#xff09; &#xff08;飞书…

Android 10(Q) 以上普通 APP 隐藏应用图标问题探究及解决方案

1、实验环境 aosp 版本 10.0 系统 aosp 版本 13.0 系统 2、验证结果 2.1 方式一 APP AndroidManifest.xml 中通过 activity-alias 配置带 LAUNCHER 属性 category&#xff0c;并且 android:enabled“true” 10.0 系统中可安装后正常显示 icon&#xff0c;通过 setComponen…

idea中run和debug是灰色的

【现象】idea中run和debug是灰色的 点击 旁边的Add Configuration…一看都是空白 【解决方法】&#xff1a; npm点开之后 【结果】

文本转图像 学习笔记

VQGAN (Vector Quantized Generative Adversarial Network) 是一种基于 GAN 的生成模型&#xff0c;可以将图像或文本转换为高质量的图像。 VQ &#xff08;Vector Quantization&#xff09;是一种数据压缩技术&#xff0c;是指将连续数据表示为离散化的向量。输入的图像或文本…