一、概述
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 distanceFROM documentsORDER BY embedding <=> '[0.1, 0.2, …]'::vectorLIMIT 5;– L2距离查询SELECT id, title, embedding <-> '[0.1, 0.2, …]'::vector AS distanceFROM documentsORDER BY embedding <-> '[0.1, 0.2, …]'::vectorLIMIT 5;– 内积查询SELECT id, title, embedding <#> '[0.1, 0.2, …]'::vector AS distanceFROM documentsORDER BY embedding <#> '[0.1, 0.2, …]'::vectorLIMIT 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 distanceFROM knowledge_baseORDER BY embedding <=> $1::vectorLIMIT 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 distanceFROM product_embeddingsWHERE category = '电子产品'ORDER BY embedding <=> $1::vectorLIMIT 20;
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 distanceFROM image_vectorsORDER BY embedding <=> $1::vectorLIMIT 10;
22、索引重建
当数据发生大量变更后,建议定期重建索引以保持最佳性能:
— 重建索引REINDEX INDEX idx_doc_cosine;– 或并发重建(不阻塞查询)REINDEX INDEX CONCURRENTLY idx_doc_cosine;
23、监控索引状态
— 查看索引大小SELECT pg_size_pretty(pg_relation_size('idx_doc_cosine')) AS index_size;– 查看索引使用情况SELECT indexrelname, idx_scan, idx_tup_read, idx_tup_fetchFROM pg_stat_user_indexesWHERE indexrelname LIKE '%diskann%';
24、七、注意事项
·扩展依赖关系: pgvectorscale 依赖 pgvector,卸载 pgvector 前需先卸载 pgvectorscale。
·数据类型: DiskANN 索引仅支持浮点型向量数据。
·维度限制: 向量维度需与大模型输出维度一致,创建后不可更改。
·并发安全: DiskANN 索引支持并发插入和混合读写,无需额外加锁。
·索引构建: 大数据量下索引构建需要较长时间,建议在业务低峰期执行。
·Embedding:Embedding 字段需要你使用大模型生成。
25、附录:距离函数
| 距离类型 | 操作符 | 索引操作类 | 适用函数 |
| 余弦距离 | <=> | vector_cosine_ops | cosine_distance() |
| 欧氏距离 | <-> | vector_l2_ops | l2_distance() |
| 负内积 | <#> | vector_ip_ops | inner_product() |