创建向量表
AnalyticDB for PostgreSQL 支持在普通表中创建向量列,并通过 Nova 向量索引加速相似度检索。本文介绍向量类型的选择方法和对应的建表示例。
前提条件
使用向量检索功能前,请确保满足以下条件:
已开启向量检索引擎优化。具体操作,请参见开启或关闭向量检索引擎优化。
使用 Nova 向量索引时,实例需为 AnalyticDB for PostgreSQL 7.0版,且内核版本为 V7.4.2.7及以上。
如果需要使用 pgvector 兼容模式,请按照Nova 向量检索引擎中的说明申请开通。
选择向量类型
Nova 支持稠密向量、稀疏向量、二值向量以及多种压缩向量类型。
数值精度 | 向量类型 | 说明 | 最大维度 | 适用场景 |
FP32 |
| AnalyticDB for PostgreSQL原生浮点数组 | 8,000 | 常规稠密向量,推荐新建业务使用 |
| pgvector兼容的稠密向量 | 8,000 | 从pgvector迁移的业务 | |
FP16 |
| AnalyticDB for PostgreSQL原生半精度浮点数组 | 16,000 | 使用数组语法且希望降低存储占用 |
| pgvector兼容的半精度向量,存储空间约为 | 16,000 | 从pgvector迁移的高维向量业务 | |
INT8 |
| 使用SQ8量化压缩的稠密向量 | 8,000 | 对内存和存储成本敏感的稠密向量业务 |
FP32,单精度稀疏浮点 |
| AnalyticDB for PostgreSQL原生稀疏向量,仅存储非零元素 | 1,000,000,000 | 关键词检索、稀疏特征及稀疏与稠密混合检索 |
| pgvector兼容的稀疏向量,仅存储非零元素 | 1,000,000,000 | 从pgvector迁移的稀疏向量业务 | |
二进制 |
| 二值向量 | 256,000 | 哈希指纹、二进制编码相似度检索 |
INT16 |
| 两字节整数数组 | 以索引限制为准 | 主要用于存量HNSW业务兼容 |
说明:
N表示向量维度。svector和sparsevec最多包含4,000个非零元素。新建稠密向量业务建议优先使用
real[]。如果需要减少存储占用,可以根据精度要求选择float2[]、halfvec或sq8vector。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,536的vector向量列:
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,536的halfvec向量列:
CREATE TABLE chunks_halfvec (
id BIGINT PRIMARY KEY,
content TEXT,
embedding HALFVEC(1536) NOT NULL
) DISTRIBUTED BY (id);float2[]和halfvec均使用半精度浮点数存储向量,可以降低高维向量的存储和内存占用。
创建SQ8压缩向量表
以下示例创建一个维度为1,536的sq8vector向量列:
CREATE TABLE chunks_sq8 (
id BIGINT PRIMARY KEY,
content TEXT,
embedding SQ8VECTOR(1536) NOT NULL
) DISTRIBUTED BY (id);sq8vector使用INT8格式存储向量,可以配合Novam或Novad索引使用,适用于关注内存和存储成本的场景。
创建原生稀疏向量表
以下示例创建一个维度为100,000的svector稀疏向量列:
CREATE TABLE sparse_documents (
id BIGINT PRIMARY KEY,
content TEXT,
embedding SVECTOR(100000) NOT NULL
) DISTRIBUTED BY (id);svector使用indices和values表示非零元素。例如,以下数据表示一个8维稀疏向量,其中第2、3、6维的值分别为1.2、1.1和0.7:
SELECT
'{"indices":[2,3,6],"values":[1.2,1.1,0.7]}'::SVECTOR(8);使用svector时,请注意:
indices中的下标从0开始。SVECTOR(N)的有效下标范围为0至N-1。indices和values必须包含相同数量的元素,并按位置一一对应。values不能包含NaN、Infinity或-Infinity。每个向量最多包含4,000个非零元素。
创建pgvector兼容的稀疏向量表
以下示例创建一个维度为100,000的sparsevec向量列:
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),向量维度在建表时指定。同一个表可以包含多个向量列,也可以分别为不同向量列创建索引。