tencent cloud

云数据库 PostgreSQL

文档云数据库 PostgreSQLAI 实践基于 PostgreSQL + pgvectorscale 的高性能向量检索

基于 PostgreSQL + pgvectorscale 的高性能向量检索

PDF
聚焦模式
字号
最后更新时间: 2026-05-06 16:53:46
本文为您介绍基于 PostgreSQL + pgvectorscale 的高性能向量检索的 AI 实践。

概述

pgvectorscale 是专为 AI 应用场景打造的 PostgreSQL 向量搜索增强扩展,基于微软 DiskANN 算法实现高效近似最近邻(ANN)索引。作为 pgvector 的补充,它为大模型 RAG 检索语义搜索智能推荐多模态 AI 应用等场景提供更低内存占用和更高检索效率的向量索引方案,帮助您在 PostgreSQL 中一站式构建 AI 智能应用的向量存储与检索能力。
云数据库 PostgreSQL 已支持 pgvectorscale v0.9.0 扩展(依赖 pgvector v0.8.2),您无需额外编译安装,可直接在控制台开启和使用。

适用场景

AI 大模型应用中的语义检索(RAG)。
图片/音频/视频等多模态相似性搜索。
推荐系统的候选集召回。
超大规模向量数据集(百万级以上)的高效检索。

一、环境准备

版本要求

组件
版本要求
云数据库 PostgreSQL
14及以上版本,请升级到最新的内核小版本,升级操作可参见 升级内核小版本
pgvector 扩展
0.8.2及以上
pgvectorscale 扩展
0.9.0及以上

安装扩展

pgvectorscale 依赖 pgvector 扩展,需要按顺序进行安装:
-- 第一步:安装 pgvector 扩展(如已安装可跳过)
CREATE EXTENSION IF NOT EXISTS vector;

-- 第二步:安装 pgvectorscale 扩展
CREATE EXTENSION IF NOT EXISTS vectorscale;
安装完成后可通过以下命令验证:
SELECT extname, extversion FROM pg_extension
WHERE extname IN ('vector', 'vectorscale');

二、快速入门

创建向量表

-- 创建包含128维向量的文档表
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
content TEXT,
embedding vector(128) -- 向量维度根据实际模型调整
);
说明:
向量维度需与您使用的大模型输出维度一致。常见模型维度:OpenAI text-embedding-3-small(1536维)、BGE-M3(1024维)、ChatGLM Embedding(1024维)。

创建 DiskANN 索引

pgvectorscale 提供 diskann 索引类型,支持三种距离度量:
-- 余弦距离(最常用,适合语义搜索)
CREATE INDEX idx_doc_cosine ON documents
USING diskann (embedding vector_cosine_ops);

-- 欧氏距离(L2)
CREATE INDEX idx_doc_l2 ON documents
USING diskann (embedding vector_l2_ops);

-- 内积距离
CREATE INDEX idx_doc_ip ON documents
USING diskann (embedding vector_ip_ops);

插入向量数据

-- 插入单条数据
INSERT INTO documents (title, content, embedding)
VALUES (
'云数据库 PostgreSQL 简介',
'PostgreSQL 是功能强大的开源关系数据库...',
'[0.1, 0.2, -0.3, ...]'::vector
);

-- 批量插入(推荐使用 COPY 或多行 INSERT)
INSERT INTO documents (title, content, embedding) VALUES
('文档1', '内容1', '[0.1, 0.2, ...]'::vector),
('文档2', '内容2', '[0.3, 0.4, ...]'::vector);

向量近邻查询

-- 余弦距离查询 Top 5最相似文档
SELECT id, title, embedding <=> '[0.1, 0.2, ...]'::vector AS distance
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
LIMIT 5;

-- L2距离查询
SELECT id, title, embedding <-> '[0.1, 0.2, ...]'::vector AS distance
FROM documents
ORDER BY embedding <-> '[0.1, 0.2, ...]'::vector
LIMIT 5;

-- 内积查询
SELECT id, title, embedding <#> '[0.1, 0.2, ...]'::vector AS distance
FROM documents
ORDER BY embedding <#> '[0.1, 0.2, ...]'::vector
LIMIT 5;
距离操作符说明:
操作符
距离类型
适用场景
<=>
余弦距离
语义相似度搜索(推荐)
<->
欧氏距离(L2)
坐标空间中的距离计算
<#>
负内积
点积相似度

三、索引参数调优

DiskANN 索引支持以下可配置参数,用于在查询精度和性能之间取得平衡:

核心参数

参数
默认值
说明
num_neighbors
32
图中每个节点的邻居数量。增大可提高 Recall,但会增加索引大小和构建时间。
search_list_size
100
搜索时的候选列表大小。增大可提高 Recall,但会增加查询延迟。

参数配置示例

-- 高 Recall 配置(适合对准确率要求高的场景)
CREATE INDEX idx_high_recall ON documents
USING diskann (embedding vector_cosine_ops)
WITH (num_neighbors = 64, search_list_size = 200);

-- 高吞吐配置(适合对延迟要求高的场景)
CREATE INDEX idx_low_latency ON documents
USING diskann (embedding vector_cosine_ops)
WITH (num_neighbors = 32, search_list_size = 80);

-- 大数据集配置(百万级以上)
CREATE INDEX idx_large_scale ON documents
USING diskann (embedding vector_cosine_ops)
WITH (num_neighbors = 50, search_list_size = 150);

调优建议

数据规模
num_neighbors
search_list_size
预期 Recall
< 10万
32
100
≥ 95%
10万 - 100万
50
150
≥ 90%
> 100万
64
200
≥ 85%
说明:
以上参数为推荐起始值,实际效果因数据分布而异,建议结合业务场景实测调整。

四、DiskANN vs HNSW 索引对比

云数据库 PostgreSQL 同时支持 pgvector 的 HNSW 索引和 pgvectorscale 的 DiskANN 索引。以下为实测对比(128维向量,2000条数据):

选型建议

场景
推荐索引
理由
数据量 < 100万,对延迟敏感
HNSW
构建快,查询延迟低
数据量 > 100万
DiskANN
内存占用低,磁盘友好
内存资源受限
DiskANN
存储占用约为 HNSW 的60%
数据频繁更新
DiskANN
支持并发插入和混合读写
对 Recall 要求极高(>99%)
HNSW
精确度略优

五、典型应用场景

RAG 知识库检索

适用于大模型应用中的检索增强生成(RAG):
-- 创建知识库表
CREATE TABLE knowledge_base (
id SERIAL PRIMARY KEY,
doc_title TEXT,
chunk_text TEXT,
embedding vector(1024), -- 以 BGE-M3模型为例
metadata JSONB
);

-- 创建 DiskANN 索引
CREATE INDEX idx_kb_diskann ON knowledge_base
USING diskann (embedding vector_cosine_ops)
WITH (num_neighbors = 50, search_list_size = 150);

-- 检索与问题最相关的5个文档片段
SELECT chunk_text, metadata,
embedding <=> $1::vector AS distance
FROM knowledge_base
ORDER BY embedding <=> $1::vector
LIMIT 5;

商品推荐系统

-- 商品向量表
CREATE TABLE product_embeddings (
product_id BIGINT PRIMARY KEY,
product_name TEXT,
category TEXT,
embedding vector(256)
);

-- 按类别过滤的相似商品搜索
SELECT product_id, product_name,
embedding <=> $1::vector AS distance
FROM product_embeddings
WHERE category = '电子产品'
ORDER BY embedding <=> $1::vector
LIMIT 20;

多模态搜索(以图搜图)

-- 图片向量表
CREATE TABLE image_vectors (
image_id BIGINT PRIMARY KEY,
image_url TEXT,
description TEXT,
embedding vector(512) -- CLIP 模型输出
);

CREATE INDEX idx_img_diskann ON image_vectors
USING diskann (embedding vector_cosine_ops);

-- 以图搜图
SELECT image_id, image_url, description,
embedding <=> $1::vector AS distance
FROM image_vectors
ORDER BY embedding <=> $1::vector
LIMIT 10;

六、索引维护

索引重建

当数据发生大量变更后,建议定期重建索引以保持最佳性能:
-- 重建索引
REINDEX INDEX idx_doc_cosine;

-- 或并发重建(不阻塞查询)
REINDEX INDEX CONCURRENTLY idx_doc_cosine;

监控索引状态

-- 查看索引大小
SELECT pg_size_pretty(pg_relation_size('idx_doc_cosine')) AS index_size;

-- 查看索引使用情况
SELECT indexrelname, idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes
WHERE indexrelname LIKE '%diskann%';

七、注意事项

扩展依赖关系: pgvectorscale 依赖 pgvector,卸载 pgvector 前需先卸载 pgvectorscale。
数据类型: DiskANN 索引仅支持浮点型向量数据。
维度限制: 向量维度需与大模型输出维度一致,创建后不可更改。
并发安全: DiskANN 索引支持并发插入和混合读写,无需额外加锁。
索引构建: 大数据量下索引构建需要较长时间,建议在业务低峰期执行。
Embedding:Embedding 字段需要您使用大模型生成。

附录:距离函数

距离类型
操作符
索引操作类
适用函数
余弦距离
<=>
vector_cosine_ops
cosine_distance()
欧氏距离
<->
vector_l2_ops
l2_distance()
负内积
<#>
vector_ip_ops
inner_product()

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈