码力全开 / PostgreSQL + 向量搜索:解锁关系型数据库的AI潜能

Created Tue, 17 Jun 2025 16:04:15 +0800 Modified Wed, 18 Jun 2025 10:15:43 +0800
1105 Words 1 min

国内的软件环境,实际上PostgreSQL用的企业并不是,但是PostgreSQL提供了一些扩展可以让关系型数据库转换为向量数据库。

借助PostgreSQL的向量化扩展,其支持:

  • 提取并搜索最近邻
  • 支持单精度、半精度、二进制和稀疏向量
  • 任何语言的PostgreSQL客户端
  • 支持多种距离度量方式,如L2距离、内积等6种方法

在PostgreSQL中提供了2种扩展:

这2种扩展都提供了对HNSW索引的支持,但是前者还提供了IVFFlat的支持。关于这部分内容实际上是数据挖掘中的内容,这里就不赘述了。更多内容可以参考之前的文章HNSW算法简述。需要注意的是,后者现在处于维护状态,换句话就是作者现在不维护了。

如果说向量数据库有什么用,实际上跟Dify并没有太大的联系。主要还是RAG的热度让其被大家所熟知,而该领域也只是个细分的领域,可以说是坑还是蛮多的。对于中小企业就不要想了,因为其成本根本不是企业能承受的。因此更多只是停留在demo阶段。

实际上除了RAG外,向量化还可以用于其他领域,比如听歌识曲这样的app。使用向量数据库可以很轻松解决查询效率慢的问题。

关于pg_vector扩展的使用可以参考原来项目。需要注意的是,其对PostgreSQL的版本要求是>=13.0。如果你使用的是低版本,就不要考虑了。其安装方法主要有2种:

  • 通过下载源码并编译
  • 使用docker镜像

而docker镜像可以使用类似如下的方法:

docker pull pgvector/pgvector:pg[version]

其中version替换为对应的数值,比如13、17,分别表示PostgreSQL版本13和17的镜像。

而源码安装的方式如下,首先是Linux和MacOS环境:

cd /tmp
git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git
cd pgvector
make
make install # may need sudo

可以将v0.8.0替换为任何版本,如v0.6.0。 而在Windows上则需要进行额外的配置,需要确保已经安装了Visual Studio 2022:

set "PGROOT=\path\to\PostgreSQL\17"
cd %TEMP%
git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git
cd pgvector
nmake /F Makefile.win
nmake /F Makefile.win install

因此一般测试使用建议通过Docker的方式进行安装。

安装完成后,就可以创建对应的扩展:

CREATE EXTENSION vector;

而在创建表时添加对应的向量列,例如:

CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));

而插入向量则以如下的方式进行添加:

INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');

之后可以通过L2距离查询其最近邻:

SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;

其支持的距离函数如下:

  • <-> - L2距离
  • <#> - (negative)内积或点积
  • <=> - 余弦距离
  • <+> - L1距离
  • <~> - Hamming距离 (binary vectors)
  • <%> - Jaccard距离 (binary vectors)

如果你觉得对这些概念生疏,建议学习一下数据挖掘或数据科学中的知识。整体来说,难度不是大。

最后该数据库可以支撑几百万数据量的业务场景,对于更大数据量需要使用其他的向量数据库。因为向量相似度计算是很耗资源的,否则会出现响应极度缓慢的问题。

参考文章:

https://www.timescale.com/blog/postgresql-as-a-vector-database-using-pgvector

如果喜欢这篇文章或对您有帮助,可以:[☕] 请我喝杯咖啡 | [💓] 小额赞助