国内的软件环境,实际上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

