pgvector 是什么
pgvector 是 PostgreSQL 的向量扩展:安装后可用向量列存 embedding,配合距离算子与近似索引在 SQL 内完成相似度检索。它最大的优势是与业务表同库同事务——切片、权限、业务数据可以在一条语句里联表与过滤,不需要在数据库与向量库之间做一致性同步。
基本信息
| 载体 | PostgreSQL 扩展,需先在库中创建扩展 |
|---|---|
| 向量类型 | 定长向量列,也可使用半精度类型节省空间 |
| 检索方式 | 距离算子排序,配合近似索引加速 |
| 权限要求 | 创建扩展需要较高权限,普通应用账号通常没有 |
安装扩展与建表
安装扩展与建表
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE kb_chunks (
id bigserial PRIMARY KEY,
doc_id text NOT NULL,
content text NOT NULL,
embedding vector(1024)
);
-- 半精度索引列(可选,节省空间)
-- embedding halfvec(1024)确认扩展
确认扩展
SELECT extname, extversion FROM pg_extension WHERE extname = 'vector';使用要点
- 向量列建议声明固定维度,避免插入时才发现维度不一致
- 近似索引与数据量相关:小表直接精确排序反而更简单
- 带过滤条件的检索要依赖普通索引,字段没索引时会退化为全表扫描
- 写入用批量提交,逐条插入在大批量导入时效率很低
- 把维度与距离算子写进建表脚本注释,交接时不必猜测
距离算子与用途
| 对比项 | 说明 | 注意 |
|---|---|---|
| 余弦距离 | 按方向比较 | 文本检索常用 |
| 内积 | 方向与长度共同参与 | 归一化后与余弦一致 |
| 欧氏距离 | 绝对距离 | 非文本特征更常用 |
| 近似索引 | 加速大规模检索 | 小数据量可不建 |
常见问题
- 创建扩展权限不足:由管理员预装,应用账号只做读写
- 维度写错:插入数据时才报错,批量导入中途失败需要重来
- 带过滤检索慢:过滤字段未建普通索引
- 近似索引参数未调:召回与延迟都不理想,需要按数据量重设
向量维度可固定也可留空:留空便于早期试验,但会限制部分索引类型的可用性,生产表建议写死维度。
与业务表协作
- 切片表按文档标识建外键式关联,删除文档时可级联清理向量
- 权限过滤直接写在查询条件里,与业务表的组织架构字段联表判断
- 批量导入用事务分批提交,避免一次插入过多导致长事务
- 向量列与文本列放在同一行,命中后无需二次查询即可组装上下文
- 把建表语句纳入版本管理,维度与算子变更时能追溯