向量与索引精度

本文介绍了向量表示与索引精度的基础概念。

半精度向量

相比单精度向量可节省50%存储空间,适用于对存储敏感但对精度要求不高的场景。使用halfvec类型存储半精度向量。

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

位向量

使用bit类型存储位向量。

CREATE TABLE items_bit (id bigserial PRIMARY KEY, embedding bit(3));
INSERT INTO items_bit (embedding) VALUES ('000'), ('111');

可执行以下语句,通过汉明距离获取最近邻:

SELECT * FROM items_bit ORDER BY embedding <~> '101' LIMIT 5;

此外,还支持Jaccard距离<%>获取最近邻。

稀疏向量

使用sparsevec类型存储稀疏向量。

CREATE TABLE items_spa (id bigserial PRIMARY KEY, embedding sparsevec(5));
INSERT INTO items_spa (embedding) VALUES ('{1:1,3:2,5:3}/5'), ('{1:4,3:5,5:6}/5');

稀疏向量格式为{索引1:值1,索引2:值2}/维度,并且索引从1开始,类似SQL数组。

可执行以下语句,通过L2距离获取最近邻:

SELECT * FROM items_spa ORDER BY embedding <-> '{1:3,3:1,5:2}/5' LIMIT 5;

半精度索引

使用半精度构建和存储索引向量。

CREATE INDEX ON items USING hnsw ((embedding::halfvec(3)) halfvec_l2_ops);

使用该索引获取最近邻:

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

二值量化

创建HNSW索引将向量进行二值化处理。

CREATE INDEX ON items USING hnsw ((binary_quantize(embedding)::bit(3)) bit_hamming_ops);

可执行以下语句,通过汉明距离获取最近邻:

SELECT * FROM items ORDER BY binary_quantize(embedding)::bit(3) <~> binary_quantize('[1,-2,3]'::halfvec) LIMIT 5;

此外,您还可以通过对原始向量进行重新排序,以实现更高的召回率。

SELECT * FROM (
    SELECT * FROM items ORDER BY binary_quantize(embedding)::bit(3) <~> binary_quantize('[1,-2,3]'::halfvec) LIMIT 20
) AS foo ORDER BY embedding <=> '[1,-2,3]' LIMIT 5;