postgresql 向量插件 pgvector

创建日期: 2024-04-08 10:27 | 作者: 风波 | 浏览次数: 15 | 分类: PostgreSQL

来源:https://blog.csdn.net/frenzytechai/article/details/131552053

1. clone 代码

git@github.com:pgvector/pgvector.git
https://github.com/pgvector

2. 启动一个容器

version: '3' 
services:
  pgvector_server:
    image: postgres:15-bullseye
    restart: always
    environment:
      POSTGRES_DB: facedb
      POSTGRES_USER: root
      POSTGRES_PASSWORD: 642a4dc6-cc76-4ebb-b828-f2c6125911a4
    network_mode: bridge
    ports:
      - 12532:5432
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
      - ./:/workspace

3. 安装依赖

先替换一下 apt 源

sed -i 's#http://deb.debian.org#http://mirrors.aliyun.com#g' /etc/apt/sources.list.d/debian.sources

安装依赖

apt update
apt install -y make gcc libpq-dev postgresql-server-dev-all

貌似使用这种方式安装的 pg 版本是最新的,当前的版本号是16,所以这个向量插件也是支持的16。

4. 编译、安装

make && make install

5. 启用扩展、插入向量

CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE items (id bigserial PRIMARY KEY, name varchar(10), features vector(3));
INSERT INTO items (features) VALUES ('[1,2,3]'), ('[4,5,6]');
INSERT INTO items (id, features) VALUES (1, '[1,2,3]'), (2, '[4,5,6]') ON CONFLICT (id) DO UPDATE SET features = EXCLUDED.features;

6. pgvector 查询运算符

SELECT id, name, features, features <-> '[0.45, 0.4, 0.85]' as distance
FROM items
ORDER BY features <-> '[0.45, 0.4, 0.85]';
SELECT id, name, features, features <=> '[0.45, 0.4, 0.85]' as similarity
FROM items
ORDER BY features <=> '[0.45, 0.4, 0.85]' DESC;
SELECT id, name, features, features <#> '[0.45, 0.4, 0.85]' as distance
FROM items
ORDER BY features <#> '[0.45, 0.4, 0.85]';

7. pgvector索引

一些关于 pgvector 索引的建议:

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

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

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

BEGIN;
SET LOCAL ivfflat.probes = 10;
SELECT ...
COMMIT;
CREATE INDEX ON items USING ivfflat (features vector_l2_ops) WITH (lists = 100);
CREATE INDEX ON items USING ivfflat (features vector_ip_ops) WITH (lists = 100);
CREATE INDEX ON items USING ivfflat (features vector_cosine_ops) WITH (lists = 100);
15 浏览
0 评论