创建Nova向量索引(公测)

更新时间:

NovaAnalyticDB PostgreSQL 7.0新一代的向量检索引擎,旨在提供极致的查询性能和更高的性价比。它分为内存型(Novam)和磁盘型(Novad)两种模式,前者面向极致性能场景,后者则具有高性价比。本文为您介绍Nova索引的选型及创建操作。

优势

与传统的HNSW索引相比,Nova索引具备以下核心优势:

  • 查询性能提升:向量查询速度更快。

  • 内存效率优化:引入了Novad磁盘型索引,降低内存占用,提供更高的性价比。

  • 写入吞吐量增加:数据写入与索引构建过程解耦,提升向量数据的写入效率。

前提条件

  • 内核版本为7.4.1.0及以上的AnalyticDB for PostgreSQL7.0版实例。如需使用,请联系技术支持升级版本。

  • 开启向量检索引擎优化

容量评估与索引选型

Nova索引分为内存型(Novam)和磁盘型(Novad)两种模式:

  • 内存型(Novam):基于图索引实现,内存容量越大,性能越优,内存不足时自动访问磁盘。在内存充足的情况下,同等规格的Novam查询性能优于Novad。适用于实时推荐等高性能场景

  • 磁盘型(Novad):基于图+分区混合索引实现,HNSW常驻内存、IVF存储于磁盘,磁盘IO友好,索引规模远超内存时性能稳定。对内存依赖小于Novam,Novad的索引构建性能大大优于Novam,且索引磁盘占用远小于Novam。适用于大规模低成本检索的使用场景

重要

构建索引为异步操作,后台flush进程定期处理写入数据,无业务负载时也可能占用资源。

不同向量维度和向量数下的资源规格建议如下:

Novam

向量维度

向量数

建议总计算资源

128

<32M

8C

256

<16M

512

<8M

768

<5M

1024

<4M

1536

<2.6M

2048

<2M

128

<64M

16C

256

<32M

512

<16M

768

<10M

1024

<8M

1536

<5M

2048

<4M

128

<128M

32C

256

<64M

512

<32M

768

<20M

1024

<16M

1536

<10M

2048

<8M

Novad

向量维度

向量数

建议总计算资源

128

<320M

8C

256

<160M

512

<80M

768

<50M

1024

<40M

1536

<26M

2048

<20M

128

<640M

16C

256

<320M

512

<160M

768

<100M

1024

<80M

1536

<60M

2048

<40M

128

<1.28B

32C

256

<640M

512

<320M

768

<200M

1024

<160M

1536

<120M

2048

<80M

语法

CREATE INDEX [INDEX_NAME]
ON [SCHEMA_NAME].[TABLE_NAME]   
USING ANN(COLUMN_NAME) 
WITH (DIM=<DIMENSION>,
      ALGORITHM=<ALGORITHM>,
      DISTANCEMEASURE=<MEASURE>,
      ...);

参数说明:

  • INDEX_NAME:索引名。

  • SCHEMA_NAME:模式(命名空间)名。

  • TABLE_NAME:表名。

  • COLUMN_NAME:向量索引列名。

  • 其他向量索引参数:

    参数名

    含义

    默认值

    取值范围

    dim

    向量维度。

    无(必填)

    [1, 8192]

    algorithm

    索引算法:

    • novam: 不带量化压缩的图索引。

    • novad: 带rabitq量化的分区索引。

    • hnswflat: 不带量化压缩的hnsw索引。

    hnswflat

    (novam, novad, hnswflat)

    distancemeasure

    支持的相似度距离度量算法:

    • L2:使用欧氏距离(平方)函数构建索引,通常适用于图片相似度检索场景。计算公式:image.png

    • IP:使用反内积距离函数构建索引,通常适用于向量归一化之后替代余弦相似度。计算公式:image.png

    • COSINE:使用余弦距离函数构建索引,通常适用于文本相似度检索场景。计算公式:image.png

    l2

    (L2, IP, COSINE)

    max_delta_vecs

    最大写入攒批向量数。

    1048576

    [1024, 1073741824]

    hnsw_m

    Novam中邻居数,通常情况下,越大图质量越好,构建时间越长。

    16

    [10, 1000]

    hnsw_ef_construction

    Novam构建时搜索候选集大小,越大图质量越好,构建时间越长。

    64

    [40, 4000]

    base_slice_log2_size

    Novam文件分片大小的log2对数。

    24

    [10, 30]

    nlist

    Novad列表数。

    1024

    [2, 1073741824]

    accel_m

    Novad加速层邻居数。

    16

    [8, 1024]

    accel_efc

    Novad加速层构建候选集大小。

    128

    [1, 32768]

    rabitq_bits

    rabitq压缩比特数。

    1

    [1, 8]

    max_cluster_vecs

    Novad单文件中心点最大向量数。

    65536

    [1, 10000000]

示例

  1. 创建示例表。

    CREATE TABLE chunks (
        id SERIAL PRIMARY KEY,
        chunk VARCHAR(1024),
        intime TIMESTAMP,
        url VARCHAR(1024),
        feature REAL[]
    ) DISTRIBUTED BY (id);
  2. 对向量列创建Nova索引。

    • 创建欧氏距离度量的Novam向量索引。

      CREATE INDEX idx_feature_novam_l2 ON chunks 
      USING ann(feature) 
      WITH (
          dim=1536, 
          algorithm=novam, 
          distancemeasure=l2, 
          hnsw_m=32, 
          hnsw_ef_construction=200
      );
    • 创建余弦相似度度量的Novad向量索引。

      CREATE INDEX idx_feature_novad_cosine ON chunks 
      USING ann(feature) 
      WITH (
          dim=1536, 
          algorithm=novad, 
          distancemeasure=cosine, 
          nlist=4096, 
          rabitq_bits=1
      );