向量数据库解决的不是「存向量」这种小事——任何能存数组的库都能存向量,它解决的是「在百万、千万级向量里按相似度毫秒级召回」。当知识库问答从 Demo 走向生产,检索的召回率和延迟就是天花板,这时候继续用 MySQL 的 LIKE 或全文索引硬扛,本质是拿关系型引擎做它不擅长的事。
先给结论:绝大多数团队缺的不是更贵的向量库,而是先换掉 embedding 模型和检索策略——召回率的天花板由 embedding 质量决定,不是向量库。库只是把该召回的东西找回来,找不回来说明向量本身没学出语义。
能力边界
专用向量库和通用库加向量扩展,是两条路线,边界在规模、混合检索和运维三处。
专用库(Milvus、Qdrant、Weaviate、Chroma)的性能天花板高,代价是多维护一套存储和一套部署。通用库的向量扩展(pgvector、ES/OpenSearch kNN、Redis Vector)运维成本几乎为零,代价是极限性能不如专用库。
混合检索是个分水岭。生产级 RAG 几乎没有纯向量就能做好的,都要「向量 + 关键词(BM25)」双路召回再融合,因为精确名词、编号、型号这类查询,向量召回经常抓瞎,关键词反而稳。所以选型时要看这个方案有没有原生、好用的混合检索,而不是只比单路向量的 QPS。
一张对比表
| 方案 | 规模上限 | 混合检索 | 运维成本 | 适配场景 |
|---|---|---|---|---|
| pgvector | 千万级 | SQL + 全文检索 | 极低,复用现有 PG | 已有 PostgreSQL、要事务和 JOIN |
| Qdrant | 千万~亿级 | 原生强 | 低,单二进制 | 自托管生产的稳妥默认值 |
| Milvus | 十亿级 | 需搭配 | 中高,etcd+MinIO+K8s | 亿级向量、高 QPS、有专职运维 |
| Weaviate | 亿级 | 原生 | 中 | 需要图关系与多模态的对象型 |
| ES/OpenSearch | 亿级(成本高) | 原生强 | 中 | 已有搜索栈,BM25+kNN 一体 |
| Redis Vector | 百万级 | 有限 | 低 | 内存友好、低延迟小规模 |
| Pinecone/云托管 | 无硬上限 | 支持 | 零 | 预算充足、不想碰运维 |
这张表的「规模上限」是量级参考,不是硬边界;实际能扛多少取决于硬件和索引参数。别拿它当承诺,拿它当排序依据。
选型建议
给 Java 工程师一句能直接用的口诀:有 PostgreSQL 就用 pgvector,没有 PG 就用 Qdrant,真到亿级向量、高 QPS 再上 Milvus。背后的逻辑是——先用几乎零运维的方案把 RAG 跑起来、把数据链路和评估跑顺,等量真的上去了,再为性能买单。过早引入 Milvus 这种重组件,是把运维成本前置到一个你还没验证的需求上。
选定方向之前,先回答五个问题:数据量能不能全放内存、标量过滤占比多少、召回率底线多少、P99 延迟要多少、Top-K 取多大。这五个问题答完,选型方向定了八成。
一条能跑的基线
下面两条语句给一个 pgvector 的起步基线,跑在现有 PostgreSQL 上,不加任何新服务:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE doc_chunks (
id bigserial PRIMARY KEY,
doc_id bigint NOT NULL,
content text,
embedding vector(1024)
);
CREATE INDEX ON doc_chunks USING hnsw (embedding vector_cosine_ops);
SELECT id, content
FROM doc_chunks
ORDER BY embedding $1
LIMIT 5;
` 是 pgvector 的余弦距离算子,vector_cosine_ops让它走 HNSW 索引。1024 这个维度要跟你的 embedding 模型输出对齐,换模型就改这里。想加关键词路,PostgreSQL 的tsvector` 加 GIN 索引是现成的,双路召回再用 RRF 融合即可。
不适合谁
如果你的数据量在百万级以内、查询量不大,向量库都不是刚需,一个进程内方案或直接 pgvector 就够,上 Milvus 纯属给自己加负担。反过来说,如果你已经有 Elasticsearch 团队和搜索栈,别为了「专用向量库」再引入一个新组件,ES 的 kNN 加 BM25 天生一体,复用比新建划算。选型的原则是「离你现有栈最近的那条路,往往是对的」,不是「性能最猛的那个」。