本文介绍了向量表示与索引精度的基础概念。
半精度向量
相比单精度向量可节省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;
该文章对您有帮助吗?