pg_embedding
PostgreSQL HNSW 向量索引扩展,在关系数据库内实现 O(log N) 的近似最近邻搜索
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
PostgreSQL HNSW 向量索引扩展,在关系数据库内实现 O(log N) 的近似最近邻搜索
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
在 RAG(检索增强生成)场景中,"在海量文档中找到最相关的几段"是一个核心问题。传统的关系型查询(WHERE id = ?)无法回答"哪些段落和用户问题最相似"——这需要向量相似度搜索(Vector Similarity Search)。当你的知识库有百万条文档时,逐条比对 embedding 向量的计算成本是不可接受的,需要专门的索引加速结构。
pg_embedding 正是为解决这个问题而生——它在 PostgreSQL 内部实现了 HNSW(Hierarchical Navigable Small World)图索引,让你在熟悉的 SQL 环境中享受接近最优的向量查询性能,无需引入 Pinecone、Milvus 等独立的向量数据库。
pg_embedding 由云原生 PostgreSQL 平台 Neon 开发并开源(Apache-2.0),于 2023 年 7 月发布。项目基于学术界认可的 ivf-hnsw 实现,核心算法来自 2018 年 ECCV 论文 Revisiting the Inverted Index for Billion-Scale Approximate Nearest Neighbor Search(Malkov & Yashunin)。
2023 年 9 月,PostgreSQL 生态中最流行的向量扩展 pgvector 也正式引入了 HNSW 索引支持,Neon 随即宣布暂停 pg_embedding 的独立开发,将资源转向 pgvector 的 HNSW 实现。这意味着 pg_embedding 的核心价值已被 pgvector 吸收,但 pg_embedding 仍是研究 HNSW 算法在 PostgreSQL 落地方式的最佳参考实现。
HNSW 是一种基于图的近似最近邻搜索算法,核心思想是构建多层缩略图:
pg_embedding 提供了三种距离度量,通过 SQL 操作符直接使用:
<-> 欧几里得距离(L2)<=> 余弦距离(Cosine)<~> 曼哈顿距离(L1)创建 HNSW 索引只需一条 SQL,参数直观可调:
CREATE INDEX ON documents USING hnsw(embedding)
WITH (dims=3, m=16, efconstruction=32, efsearch=32);
部署方式是 pg_embedding 与 pgvector 最大的不同点——它不是 pip install 的 Python 包,而是需要从源码编译的 PostgreSQL C 扩展。这意味着:
PG_CFLAGS += -Ofast 启用 GCC 自动向量化)CREATE EXTENSION embedding 启用与 LangChain 的集成是 pg_embedding 的亮点。Neon 为 LangChain 提供专门的 PGEmbedding 封装,支持一键将文档切分、向量化并存储到 PostgreSQL:
from langchain.vectorstores import PGEmbedding
db = PGEmbedding.from_documents(
embedding=embeddings, documents=docs, collection_name="my_kb"
)
db.create_hnsw_index(max_elements=10000, dims=1536, m=8, ef_construction=16)
调参指南:
| 参数 | 含义 | 建议值 |
|---|---|---|
dims | 向量维度 | 必须指定,1536(OpenAI)/768(BERT)/1024(LLaMA) |
m | 每层最大连接数 | 8-32,越大越精确、越占内存 |
efConstruction | 建索引质量 | 32-200,越大建索引越慢、查询越准 |
efSearch | 搜索质量 | ≥ k(返回近邻数量),越大越慢越准 |
Neon 官方基准测试(GIST-960 数据集,960 维,100 万向量,k=100)在相同召回率下:
这背后的原因是:IVFFlat 基于聚类分区,查询需要扫描多个倒排列表;HNSW 基于图的贪婪搜索,O(log N) 的层间跳转比聚类扫描更高效。
但 pg_embedding 也有限制——早期版本 HNSW 索引完全存储在内存中(这也是速度快的部分原因)。Neon 后续版本已支持磁盘持久化 HNSW 索引,以适应 Neon 的无服务器架构(计算存储分离、无本地磁盘),代价是性能略有下降(~2x 差距)。
pg_embedding 最大的风险是项目已停止维护(2023年9月),作者建议所有用户迁移到 pgvector。虽然代码仍可使用,但:
pg_embedding 和 pgvector 的竞争揭示了一个重要趋势:向量搜索不需要独立基础设施。当 PostgreSQL 本身能以接近专用向量数据库的性能处理嵌入向量时,"要不要引入新的技术栈"这个问题就变得值得重新审视。向量数据和业务数据共存于同一个事务中,备份、复制、权限管理都可以复用现有 PostgreSQL 生态,这是 pg_embedding/pgvector 这类扩展的核心价值所在。
579 个 GitHub stars 虽不算高,但作为 Neon 技术实力的展示和 HNSW 在 PostgreSQL 落地的参考实现,这个项目对理解向量搜索基础设施具有较高的技术参考价值。