创建向量表

更新时间:
复制 MD 格式

AnalyticDB for PostgreSQL 支持在普通表中创建向量列,并通过 Nova 向量索引加速相似度检索。本文介绍向量类型的选择方法和对应的建表示例。

前提条件

使用向量检索功能前,请确保满足以下条件:

  • 已开启向量检索引擎优化。具体操作,请参见开启或关闭向量检索引擎优化

  • 使用 Nova 向量索引时,实例需为 AnalyticDB for PostgreSQL 7.0版,且内核版本为 V7.4.2.7及以上。

  • 如果需要使用 pgvector 兼容模式,请按照Nova 向量检索引擎中的说明申请开通。

选择向量类型

Nova 支持稠密向量、稀疏向量、二值向量以及多种压缩向量类型。

数值精度

向量类型

说明

最大维度

适用场景

FP32

real[]float4[]

AnalyticDB for PostgreSQL原生浮点数组

8,000

常规稠密向量,推荐新建业务使用

vector(N)

pgvector兼容的稠密向量

8,000

pgvector迁移的业务

FP16

float2[]

AnalyticDB for PostgreSQL原生半精度浮点数组

16,000

使用数组语法且希望降低存储占用

halfvec(N)

pgvector兼容的半精度向量,存储空间约为vector的一半

16,000

pgvector迁移的高维向量业务

INT8

sq8vector(N)

使用SQ8量化压缩的稠密向量

8,000

对内存和存储成本敏感的稠密向量业务

FP32,单精度稀疏浮点

svector(N)

AnalyticDB for PostgreSQL原生稀疏向量,仅存储非零元素

1,000,000,000

关键词检索、稀疏特征及稀疏与稠密混合检索

sparsevec(N)

pgvector兼容的稀疏向量,仅存储非零元素

1,000,000,000

pgvector迁移的稀疏向量业务

二进制

bit(N)

二值向量

256,000

哈希指纹、二进制编码相似度检索

INT16

smallint[]int2[]

两字节整数数组

以索引限制为准

主要用于存量HNSW业务兼容

说明:

  • N表示向量维度。

  • svectorsparsevec最多包含4,000个非零元素。

  • 新建稠密向量业务建议优先使用real[]。如果需要减少存储占用,可以根据精度要求选择float2[]halfvecsq8vector

  • sq8vector采用INT8格式压缩向量。使用前建议结合实际数据测试召回率。

  • smallint[]主要用于存量业务兼容,新建Nova业务建议选择其他向量类型。

建表语法

创建向量表的语法与创建普通表相同:

CREATE TABLE <TABLE_NAME> (
    <ID_COLUMN> <DATA_TYPE> PRIMARY KEY,
    <OTHER_COLUMNS>,
    <VECTOR_COLUMN> <VECTOR_TYPE> NOT NULL
) DISTRIBUTED BY (<DISTRIBUTION_COLUMN>);

参数说明:

  • TABLE_NAME:向量表名称。

  • ID_COLUMN:主键列。

  • VECTOR_COLUMN:向量列。

  • VECTOR_TYPE:向量数据类型。

  • DISTRIBUTION_COLUMN:分布键。建议选择数据分布均匀且不会频繁更新的列。

一个表中可以包含多个向量列。

建表示例

创建单精度稠密向量表

real[]float4[]等价。以下示例创建一个使用real[]存储文本向量的表:

CREATE TABLE chunks_float4 (
    id BIGINT PRIMARY KEY,
    content TEXT,
    embedding REAL[] NOT NULL
) DISTRIBUTED BY (id);

数组类型不在建表语句中指定向量维度。创建向量索引时,需要通过dim参数指定维度。

创建pgvector兼容的稠密向量表

以下示例创建一个维度为1,536vector向量列:

CREATE TABLE chunks_vector (
    id BIGINT PRIMARY KEY,
    content TEXT,
    embedding VECTOR(1536) NOT NULL
) DISTRIBUTED BY (id);

该类型适用于需要兼容pgvector数据读写格式的业务。

创建半精度向量表

使用原生数组语法创建float2[]向量列:

CREATE TABLE chunks_float2 (
    id BIGINT PRIMARY KEY,
    content TEXT,
    embedding FLOAT2[] NOT NULL
) DISTRIBUTED BY (id);

使用pgvector兼容语法创建维度为1,536halfvec向量列:

CREATE TABLE chunks_halfvec (
    id BIGINT PRIMARY KEY,
    content TEXT,
    embedding HALFVEC(1536) NOT NULL
) DISTRIBUTED BY (id);

float2[]halfvec均使用半精度浮点数存储向量,可以降低高维向量的存储和内存占用。

创建SQ8压缩向量表

以下示例创建一个维度为1,536sq8vector向量列:

CREATE TABLE chunks_sq8 (
    id BIGINT PRIMARY KEY,
    content TEXT,
    embedding SQ8VECTOR(1536) NOT NULL
) DISTRIBUTED BY (id);

sq8vector使用INT8格式存储向量,可以配合NovamNovad索引使用,适用于关注内存和存储成本的场景。

创建原生稀疏向量表

以下示例创建一个维度为100,000svector稀疏向量列:

CREATE TABLE sparse_documents (
    id BIGINT PRIMARY KEY,
    content TEXT,
    embedding SVECTOR(100000) NOT NULL
) DISTRIBUTED BY (id);

svector使用indicesvalues表示非零元素。例如,以下数据表示一个8维稀疏向量,其中第2、3、6维的值分别为1.2、1.10.7:

SELECT
    '{"indices":[2,3,6],"values":[1.2,1.1,0.7]}'::SVECTOR(8);

使用svector时,请注意:

  • indices中的下标从0开始。

  • SVECTOR(N)的有效下标范围为0N-1

  • indicesvalues必须包含相同数量的元素,并按位置一一对应。

  • values不能包含NaNInfinity-Infinity

  • 每个向量最多包含4,000个非零元素。

创建pgvector兼容的稀疏向量表

以下示例创建一个维度为100,000sparsevec向量列:

CREATE TABLE sparse_documents_compat (
    id BIGINT PRIMARY KEY,
    content TEXT,
    embedding SPARSEVEC(100000) NOT NULL
) DISTRIBUTED BY (id);

该类型适用于需要兼容pgvector稀疏向量数据格式的业务。

创建二值向量表

以下示例创建一个维度为256的二值向量列:

CREATE TABLE binary_vectors (
    id BIGINT PRIMARY KEY,
    content TEXT,
    embedding BIT(256) NOT NULL
) DISTRIBUTED BY (id);

bit类型适用于哈希指纹和二进制编码等场景,支持使用汉明距离和杰卡德距离进行相似度检索。

注意事项

  • 写入数据的向量维度必须与向量列定义的维度一致。

  • 对于real[]float4[]float2[]smallint[]等数组类型,向量维度需要在创建索引时通过dim参数指定。

  • 对于vector(N)halfvec(N)sq8vector(N)svector(N)sparsevec(N)bit(N),向量维度在建表时指定。

  • 同一个表可以包含多个向量列,也可以分别为不同向量列创建索引。