更新时间:2025-12-01 GMT+08:00
分享

向量计算

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插件使用

  1. 初始化插件。
    CREATE EXTENSION pgvector;
  2. 创建一个维度为3的向量列。
    CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
  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]');
  4. 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)
  5. 查询距离。
    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;
  6. 聚合计算。
    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
    1. 添加索引。
      -- 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。

    2. 构建参数。

      m - 图层最大连接数 (默认值16)。

      ef_construction - 索引构建候选数 (默认值64)。

      CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);

      更大的构建选项值能够提供更高的召回率,但索引的构建以及数据插入时间会增加。

  • IVFFlat
    1. 添加索引
      -- 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);
    2. 构建参数

      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'

相关文档