AI 数据库入门:5分钟带你玩转 PostgreSQL 向量检索 (pgvector)
在构建大模型应用(如 RAG 检索增强生成、智能推荐系统)时,我们往往面临一个架构选择:是引入独立的向量数据库(如 Milvus、Pinecone),还是直接在现有关系型数据库中解决?
引入独立向量数据库虽然性能强劲,但会带来额外的运维成本、数据同步难题以及无法进行复杂 JOIN 查询的痛点。
破局之道:pgvector。它让 PostgreSQL 直接具备了向量存储与检索能力,实现业务数据与向量数据的统一管理,完美支持 ACID 事务和传统 SQL 操作。本文将带你用 5 分钟时间,从环境搭建到核心检索,快速上手 pgvector。
环境准备与安装
前置条件
pgvector 需要PostgreSQL 13及以上版本。
安装方式
1. Docker 一键部署(强烈推荐)
这是最快、最干净的方式,无需污染本地环境:
dockerrun--namepgvector-ePOSTGRES_PASSWORD=mysecretpassword-p5432:5432-dpgvector/pgvector:pg162. 源码编译安装(适合本地开发)
如果你已有 PostgreSQL 环境,可以通过源码安装:
cd/tmpgitclone--branchv0.7.0 https://github.com/pgvector/pgvector.gitcdpgvectormakemakeinstall启用扩展
连接到数据库后,执行以下 SQL 启用扩展:
CREATEEXTENSION vector;核心实战:建表、插入与检索
1. 创建向量表
使用vector(dimensions)类型定义向量列。以下以 3 维向量为例(实际业务中如 BGE-M3 模型通常为 768 或 1024 维):
CREATETABLEtblvector(id bigserialPRIMARYKEY,itemtext,embedding vector(3));2. 插入向量数据
将 AI 模型生成的 Embedding 存入数据库:
INSERTINTOtblvector(item,embedding)VALUES('苹果','[1.0, 0.9, 0.2]'),('香蕉','[1.2, 0.8, 0.1]'),('猫','[6.0, 0.4, 5.0]');3. 相似度检索
使用距离操作符<=>进行余弦相似度检索,查找最相似的 Top-K 结果:
SELECTitem,embedding<=>'[1.2, 0.8, 0.1]'AScosine_distanceFROMtblvectorORDERBYcosine_distanceLIMIT2;预期结果:
| item | cosine_distance |
|---|---|
| 香蕉 | 0 |
| 苹果 | 0.02… |
提示:
<=>为余弦距离,值越小越相似;<->为欧氏距离;<#>为负内积距离。
性能进阶:索引策略
当数据量达到百万级时,全表扫描将成为性能瓶颈。pgvector 提供了两种主流索引:
HNSW 索引(推荐)
适合对查询性能要求高、数据更新不频繁的场景。构建速度较慢,但查询极快。
CREATEINDEXONtblvectorUSINGhnsw(embedding vector_cosine_ops)WITH(m=16,ef_construction=64);m: 每个节点的最大连接数,越大索引质量越高,内存占用越大。ef_construction: 构建索引时的搜索宽度,越大构建越慢但索引质量越好。
IVFFlat 索引
适合数据量极大、构建速度要求高的场景。需要先有数据才能创建索引。
CREATEINDEXONtblvectorUSINGivfflat(embedding vector_cosine_ops)WITH(lists=100);lists: 聚类中心数量,通常建议设置为sqrt(行数)到行数/1000之间。
总结与下一步
pgvector 的核心优势在于零额外运维、事务一致性和SQL 生态兼容。对于中小规模向量检索或混合检索场景,它是目前性价比最高的选择。
下一步思考:
如何结合 LangChain 或 LlamaIndex 搭建完整的 RAG 系统?如何在 pgvector 中实现元数据过滤(Metadata Filtering)?
互动话题:在你的项目中,你更倾向于使用 HNSW 还是 IVFFlat 索引?欢迎在评论区分享你的实战经验!