向量计算
DWS通过集成pgvector插件(有关详细的规格和语法请参考pgvector),提供向量存储和检索能力。
注意事项
如需使用向量计算功能,请联系技术支持修改feature_support_options参数。
pgvector插件能力
- 支持向量数据类型:可在表中建立 vector(n) 列,用于存储高维向量。
- 向量相似度计算:支持多种距离或相似度运算符,包括 L2(欧氏距离)、Inner Product、Cosine 距离、L1(曼哈顿距离)、甚至 Hamming/Jaccard 等。
- 支持最近邻搜索(Nearest Neighbour Search, NNS),包括准确搜索和近似搜索(ANN)。
- 支持向量索引: IVFFlat、HNSW 索引结构,用于加速大规模向量检索。
pgvector插件功能当前版本仅支持行存表。
向量数据类型
|
数据类型 |
精度 |
支持维度 |
典型用途 |
|---|---|---|---|
|
vector |
单精度浮点,4 字节。 |
<=16000 |
传统 embedding。 |
|
halfvec |
半精度浮点(16 位浮点数,每元素 2 字节)。 |
<=16000 |
高维 embedding、内存敏感场景。 |
|
bit |
二进制向量类型(bit 向量)。 |
<= 64000 |
二进制哈希、图像/特征布尔表示。 |
|
sparsevec |
稀疏向量类型。 |
<=16000非0维度 |
文本TF-IDF稀疏特征、超高维稀疏 embedding。 |
以上向量支持的维度为数据类型本身支持的维度限制,ivfflat及hnsw索引对向量维度有额外支持维度范围:
- vector:<=2000
- halfvec:<=4000
- bit:<=64000
- sparsevec:<=1000非0维度(仅hnsw索引支持)
向量距离/相似度函数
|
操作符 |
距离/相似度类型 |
说明 |
|---|---|---|
|
<-> |
Euclidean距离 (L2) |
欧氏距离。 |
|
<#> |
(负)内积 (Inner Product) |
内积。 |
|
<=> |
Cosine距离 |
向量方向差异。 |
|
<+> |
L1距离 (Taxicab) |
向量坐标绝对差之和。 |
|
<~> |
Hamming距离 |
用于二进制bit向量,计算位不同数目。 |
|
<%> |
Jaccard距离 |
用于二进制bit向量/集合表示,衡量交集/并集差异。 |
索引类型
|
索引类型 |
原理 |
构建成本 |
查询速度 / 召回 (speed‑recall) |
主要调优参数 |
|---|---|---|---|---|
|
IVFFlat |
将向量分成若干“lists”(簇/桶),查询时只扫描部分 lists |
构建快、内存使用低。 |
查询速度中等;召回率略低。扫描范围受“probes”参数影响。 |
lists(簇数)、probes(扫描簇数)、maxProbes(最大扫描簇数)。 |
|
HNSW |
基于图结构(多层可导航小世界图),通过跳跃访问近邻点 |
构建较慢、内存占用较高。 |
查询速度快、召回率高;尤其适合高维、低延迟场景。 |
m(每层最大连接数)、ef_construction(构建候选数)、ef_search(查询候选数)、max_scan_tuples(最大扫描节点数)、mem_scan_mutiplier(内存动态扩张率)。 |
pgvector插件使用
- 初始化插件。
CREATE EXTENSION pgvector;
- 创建一个维度为3的向量列。
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
- 插入向量数据。
INSERT INTO items (embedding) VALUES ('[1, 2, 3]'), ('[0.5, 0.1, 0.9]'), ('[3, 2, 1]'), ('[0, 0, 1]'), ('[1.1, 2.2, 3.3]'); - L2距离查询最近相邻向量。
SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5; id | embedding ----+--------------- 3 | [3,2,1] 1 | [1,2,3] 5 | [1.1,2.2,3.3] 2 | [0.5,0.1,0.9] 4 | [0,0,1] (5 rows)
- 查询距离。
SELECT embedding <-> '[3,1,2]' AS distance FROM items; distance ------------------ 2.44948974278318 2.87576084849969 1.4142135623731 3.3166247903554 2.59615095306844 (5 rows)
对于内积(inner product),用 -1 * inner product来获取实际距离:
SELECT (embedding <#> ’[3,1,2]’) * -1 AS inner_product FROM items;
对于余弦距离(cosine distance), 用1 - cosine distance来获取实际距离:
SELECT 1 - (embedding <=> '[3,1,2]') AS cosine_similarity FROM items;
- 聚合计算。
SELECT AVG(embedding) FROM items; avg ------------------ [1.12,1.26,1.84] (1 row) SELECT SUM(embedding) FROM items; sum --------------- [5.6,6.3,9.2] (1 row)
索引使用
pgvector默认使用精确近邻搜索,提供百分之百召回率但查询速度较慢。可以按需使用近似相邻搜索索引来牺牲部分召回率以提高查询速度。不同于传统索引,近似搜索索引可能会返回不同的查询结果。pgvector目前支持的索引类型包括HNSW和IVFFlat。
- HNSW
- 添加索引。
-- L2 distance CREATE INDEX ON items USING hnsw (embedding vector_l2_ops); -- Inner product CREATE INDEX ON items USING hnsw (embedding vector_ip_ops); -- Cosine distance CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops); -- L1 distance CREATE INDEX ON items USING hnsw (embedding vector_l1_ops); -- Hamming distance CREATE INDEX ON items USING hnsw (embedding bit_hamming_ops); -- Jaccard distance CREATE INDEX ON items USING hnsw (embedding bit_jaccard_ops);
根据使用向量类型使用对应的距离函数,例如:halfvec向量L2距离使用halfvec_l2_ops,sparsevec向量类型使用 sparsevec_l2_ops。
- 构建参数。
ef_construction - 索引构建候选数 (默认值64)。
CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);
更大的构建选项值能够提供更高的召回率,但索引的构建以及数据插入时间会增加。
- 添加索引。
- IVFFlat
- 添加索引
-- L2 distance CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100); -- Inner product CREATE INDEX ON items USING ivfflat (embedding vector_ip_ops) WITH (lists = 100); -- Cosine distance CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100); -- Hamming distance CREATE INDEX ON items USING ivfflat (embedding bit_hamming_ops) WITH (lists = 100);
- 构建参数
lists - 构建索引时计算的聚簇的数量,值越大召回率越高,索引构建时间越长。
- 建议在导入数据后再创建IVFFlat索引。
- 选择合适的lists值,推荐1M以下数据量使用行数 /1000,1M以上数据量采用sqrt(行数)。
- 添加索引
- 索引参数
- 迭代扫描模式
HNSW和IVFFlat索引都支持迭代扫描模式,自动扫描更多索引来获取足够的数据量。
通过参数hnsw_iterative_scan和ivfflat_iterative_scan控制开关。
参数取值:off(默认值)、relaxed_order、strict_order(仅HNSW索引支持strict_order)。
- HNSW查询选项
hnsw_options:包含三个数值,控制查询参数ef_search(查询候选数)、max_scan_tuples(最大扫描节点数)及mem_scan_multiplier(内存动态扩张率)。
默认值:'40, 20000, 1.0'
- IVFFlat查询选项
ivfflat_options:包含两个数值,控制probes(扫描簇数)和maxProbes(最大扫描簇数)。
默认值:'1, 32768'
- 迭代扫描模式