pgvector 入门:用 PostgreSQL 搭你的第一个 RAG 检索层

发布:2026-10-02 · pgvectorAIRAG


RAG 应用的检索层未必需要独立向量数据库——如果你的主库已经是 PostgreSQL, pgvector 让你「一个库干完」。本文是从零到可用的最短路径。

参数与维度上限随版本演进,以 pgvector 官方 README 为准。

1. 安装与建列

CREATE EXTENSION IF NOT EXISTS vector;

-- 1536 对齐 OpenAI text-embedding-3-small;换模型就换成对应维度
CREATE TABLE docs (
  id      bigint PRIMARY KEY,
  content text NOT NULL,
  embedding vector(1536)
);

2. 三种距离,三个操作符

距离操作符典型场景
L2 欧氏距离<->图像特征等量纲明确的向量
内积<#>已归一化向量的等价相似度(注意取负)
余弦距离<=>文本 embedding 最常用
-- 建议入库存单位向量,检索一律用余弦
SELECT id, content
FROM docs
ORDER BY embedding <=> $1   -- $1 为查询文本的 embedding
LIMIT 5;

3. 索引:ivfflat 与 hnsw 怎么选

不建索引 = 每次全表扫描比对(准确但慢)。两种近似索引:

ivfflathnsw
构建快慢(写入友好度也一般)
查询召回依赖 probes 调参通常更高更稳
内存较低较高
建议数据量小/内存紧大多数新项目默认选它
-- hnsw:余弦距离索引
CREATE INDEX ON docs
  USING hnsw (embedding vector_cosine_ops);

4. 召回不够?先调查询参数再换库

SET hnsw.ef_search = 100;  -- 默认 40,越大召回越高、越慢
SET ivfflat.probes = 10;   -- ivfflat 的对应参数

一个实用判断:99% 的「向量检索不准」是 ef_search/probes 太低或数据没归一化, 不是 PG 不行。

5. 和普通 SQL 混用才是杀手锏

向量库做不了的「先过滤再检索」,在 PG 里是一条 SQL:

-- 只在租户自己的文档里做语义检索
SELECT id, content
FROM docs
WHERE tenant_id = 42            -- 结构化过滤
ORDER BY embedding <=> $1
LIMIT 5;

配合 pgvectorscale(Timescale 开源的向量扩展,StreamingDiskANN 索引更省内存) 或分区表,千万级向量的场景也有可用的路径。

落地清单

  1. embedding 列统一存归一化向量;
  2. 检索一律走索引操作符(ORDER BY embedding <=> $1),别用函数包装;
  3. 批量写入后再建索引,比边写边建快得多;
  4. 上线前用真实分布的查询测召回率,再定 ef_search。

更多生态选型见生态目录。


本文为 pgcn.cc 原创内容,转载需授权并保留链接。勘误/投稿: 联系方式。