RAG 常用向量数据库怎么选型?Milvus、FAISS、Qdrant、Chroma、pgvector 各自适用什么场景?
一则或许对你有用的小广告
欢迎加入小哈的星球,你将获得:专属的实战项目(4个项目都能学) / 1v1 提问 / 简历修改 / Java 学习路线 / 社群讨论 / 学习打卡 / 每月赠书
《Spring AI 项目实战(问答机器人、RAG 智能客服、联网搜索)》已完结,基于
Spring AI + Spring Boot 3.x + JDK 21...,查看介绍《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...,查看介绍;演示链接:http://116.62.199.48:7070/《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接:http://116.62.199.48/
新开坑项目:《从零手撸:秒杀系统高并发优化实战》 正在更新中...,查看介绍
截止目前,星球内专栏累计输出 150w+ 字,讲解图 5110+ 张,还在持续爆肝中.. 后续还会上新更多项目,已有 4700+ 小伙伴加入学习,欢迎点击围观
面试考察点
-
基础认知的准确性:面试官想先确认你能不能分清楚 "向量数据库" 和 "向量检索库" 的本质区别。FAISS 严格意义上不是数据库,这点答错了后面说啥都白搭。
-
场景化选型能力:面试官问的不是哪个最好,是哪个最适合某个场景。你能不能结合数据规模、运维成本、团队技术栈给出建议,这才是区分 "看过文档" 和 "做过架构" 的关键。
-
生产实践意识:有没有考虑过持久化、分布式扩展、标量过滤、混合检索这些工程化需求?只会说 "Chroma 简单好用" 是过不了关的。
核心答案
先给一张 "一句话选型表",记牢这张表面试基本就稳了:
| 数据库 | 本质定位 | 适用规模 | 典型场景 |
|---|---|---|---|
| FAISS | 向量检索库(Meta 开源) | 百万~千万 | 算法研究、单机快速检索、需要自己造轮子 |
| Chroma | 轻量级向量数据库 | < 100 万 | 快速原型、Demo、学习 RAG |
| pgvector | PostgreSQL 扩展 | 百万级 | 已有 PG 栈、不想引入新组件、业务数据和向量同库 |
| Qdrant | Rust 高性能向量数据库 | 千万级 | 中等规模生产、资源敏感、需要灵活过滤 |
| Milvus | 云原生分布式向量数据库 | 亿级+ | 大规模企业级生产、高可用、水平扩展 |
典型演进路线:Chroma 起步做 Demo → Qdrant 扩到千万 → Milvus 扛亿级流量。
深度解析
一、先搞清一个核心误区:FAISS 不是数据库
很多人一上来就把 FAISS 和 Milvus 并列比较,这其实是概念混淆。FAISS(Facebook AI Similarity Search)是 Meta 开源的向量检索算法库,它只解决一个问题:怎么快速找到最相似的向量。
它本身没有这些数据库的基础能力:
- 没有 CRUD(增删改查,更新基本靠重建索引)
- 没有持久化(宕机数据就没了,得自己加一层)
- 没有分布式(单机为主,多机要自己拼)
- 没有标量过滤(不能像 SQL 那样带条件查询)
- 没有事务、权限、高可用
有意思的是,Milvus 底层正是用 FAISS(以及类似的 DiskANN、HNSWLib)作为索引引擎,再在外面套上分布式、持久化、CRUD 这些数据库能力。所以两者的关系更像 "发动机 vs 整车"。
Reddit 上有个高赞说法很到位:"FAISS is NOT a vector database. It is a lower-level index for dense vectors. You can still use it as one, but it's like using the engine without the car."
翻译一下:FAISS 不是向量数据库,它只是稠密向量的一层底层索引。硬要当数据库用也行,但那就好比你只买了台发动机,却没有整车。
FAISS 适合什么场景?
- 你是算法工程师,要做向量检索的研究和 benchmark
- 你的数据量不算太大(百万级),单机就能扛
- 你需要极致性能,并且愿意自己封装一层持久化和分布式
- 你需要 GPU 加速(FAISS 原生支持 GPU,这是它的杀手锏)
二、五大方案逐一拆解
Chroma —— 起步神器
Chroma 是 Python 生态里很流行的轻量级向量库,API 对开发者友好。它的目标就一个:让你 5 分钟跑起来一个 RAG Demo。
- 优点:开箱即用,嵌入式模式无需独立部署,和 LangChain / LlamaIndex 集成丝滑
- 缺点:不适合生产。没有真正的分布式能力,百万级以上性能下降明显,社区版功能有限
- 适用:Demo、POC、学习项目、个人知识库
pgvector —— 省事之选
pgvector 是 PostgreSQL 的一个扩展,让你直接在 PG 里存向量、做相似度检索。说白了最大的好处就是 "不用引入新组件"。
上图展示了 pgvector 的核心优势:业务数据和向量共库共事务。这意味着你可以写这样的 SQL:
-- 同一条 SQL 里既做向量检索,又做业务过滤
SELECT id, content, embedding <=> $1 AS distance
FROM documents
WHERE department = 'finance'
AND created_at > '2025-01-01'
ORDER BY embedding <=> $1
LIMIT 5;
- 优点:零运维成本(PG 团队顺手就管了)、SQL 生态完整、事务一致性
- 缺点:规模天花板低。千万级以上基本要换方案,HNSW 索引构建慢、内存吃紧
- 适用:中小规模 RAG、内部文档问答、企业已有 PG 栈
Qdrant —— 中量级生产甜点位
Qdrant 用 Rust 写的,性能和资源占用都不错。我个人觉得它是 "性价比之王",在百万到千万这个量级,基本没对手。
- 优点:Rust 带来的高性能低延迟、Payload 过滤强大(可以给向量打标签做复杂过滤)、支持混合检索、单机部署就能扛不少流量
- 缺点:超大规模(亿级)的分布式能力不如 Milvus 成熟
- 适用:中小型生产 RAG、SaaS 产品、对延迟敏感的场景
Milvus —— 企业级重武器
Milvus 是真正的 "为大规模而生" 的云原生分布式向量数据库,国内 Zilliz 团队主导,CNCF 毕业项目。
它的架构特点是存算分离:计算节点无状态,数据落在对象存储和消息队列里,可以独立扩缩容。水平扩展和高可用都是这套架构带来的。
- 优点:亿级向量不在话下、多副本高可用、丰富的索引类型(IVF、HNSW、DiskANN、PQ)、混合检索、成熟生态
- 缺点:运维复杂度高。一套完整的 Milvus 集群要部署 Proxy、Coordinator、Worker、etcd、MinIO、Pulsar 等一堆组件,小团队根本玩不转。生产环境建议直接上 Zilliz Cloud 托管版
- 适用:亿级以上向量、高并发企业场景、对可用性要求极高的核心系统
三、横向对比总表
| 维度 | FAISS | Chroma | pgvector | Qdrant | Milvus |
|---|---|---|---|---|---|
| 类型 | 检索库 | 轻量 DB | PG 扩展 | 专用 DB | 分布式 DB |
| 语言 | C++ | Python | C/SQL | Rust | Go/C++ |
| 规模上限 | 千万 | 百万 | 百万 | 千万 | 亿级+ |
| 持久化 | 无 | 有 | 有 | 有 | 有(存算分离) |
| 分布式 | 无 | 弱 | PG 复制 | 中等 | 强(云原生) |
| 标量过滤 | 无 | 基础 | SQL 强 | Payload 强 | 强 |
| 混合检索 | 无 | 弱 | 有 | 有 | 强 |
| GPU 加速 | 原生支持 | 无 | 无 | 无 | 有 |
| 运维复杂度 | 低 | 极低 | 低 | 中 | 高 |
| 适用阶段 | 研究 | Demo | 中小生产 | 中型生产 | 大型生产 |
四、Java 生态怎么接?Spring AI 的统一抽象
面试官如果追问 "你 Java 项目里怎么用这些向量库?",Spring AI 给的答案是 VectorStore 统一抽象:换底层向量库基本只改依赖和配置,业务代码不动。这是个很加分的回答点。
// 业务代码完全一致,底层可无缝切换
@Autowired
private VectorStore vectorStore; // 接口,具体实现由配置决定
public void ingestDocuments(List<Document> docs) {
// 切分 + 入库,底层是 Milvus 还是 pgvector 对业务透明
vectorStore.add(docs);
}
public List<Document> search(String query) {
// 通用相似度检索 + 元数据过滤
SearchRequest request = SearchRequest.builder()
.query(query)
.topK(5)
.similarityThreshold(0.7)
.filterExpression("department == 'finance'")
.build();
return vectorStore.similaritySearch(request);
}
配置切换只需改 application.yml 和 Maven 依赖:
<!-- pgvector 方案 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId>
</dependency>
<!-- Milvus 方案 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-milvus-store-spring-boot-starter</artifactId>
</dependency>
<!-- Qdrant 方案 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-qdrant-store-spring-boot-starter</artifactId>
</dependency>
这种 "面向接口编程 + 配置化切换" 的能力,是 Java 工程师做 RAG 架构的一大优势。LangChain4j 也有类似的
EmbeddingStore抽象,思路一致。
五、选型决策流程
上图是完整的选型决策路径,沿着 "数据规模 → 技术栈约束 → 运维能力" 三个维度走。重点说几个关键决策点:
- 数据规模是第一道分水岭:100 万是一条线,亿级是另一条线,中间地带 Qdrant 最稳
- 已有 PG 栈是个强信号:能用 pgvector 就别折腾新组件,很多企业内部问答系统的数据量根本到不了 pgvector 的天花板
- Milvus 自建 vs 托管:如果没有专职运维团队,强烈建议直接上 Zilliz Cloud,自建 Milvus 的运维成本会吃掉你大半精力
- FAISS 只在特殊场景:除非是做算法研究或者必须用 GPU 加速,否则工程上没必要从 FAISS 开始造轮子
面试高频追问
-
向量数据库的索引原理是什么?HNSW、IVF、PQ 有什么区别?
- HNSW 是基于图的近似最近邻算法,查询快、内存占用高;IVF 是基于聚类的倒排方法,可调精度/速度;PQ 是乘积量化,用压缩换内存。生产环境 HNSW 用得最多,Milvus 大规模场景会用 DiskANN。
-
RAG 系统的混合检索怎么实现?
- 稠密向量检索(语义)+ 稀疏向量检索(关键词,如 BM25)融合结果。Milvus 2.4+ 原生支持稀疏向量,Qdrant 也支持,Spring AI 在 1.0 之后也加强了这方面的抽象。
-
pgvector 性能到多少会撑不住?
- 一般百万级还能扛,千万级要看硬件和索引(HNSW + IVFFlat 的选择很关键)。超过千万、并且有并发检索需求时,基本就该考虑 Qdrant 或 Milvus 了。
-
为什么 Milvus 要做存算分离?
- 计算节点无状态可以随时扩缩容,数据持久化在对象存储上不怕丢。这是云原生数据库的常见设计,好处就是扩缩容灵活,又不容易丢数据。
常见面试变体
- "为什么不用 Elasticsearch 做向量检索?kNN 搜索不行吗?"(答:ES 也能做,但大规模场景性能不如专用向量库,且成本高)
- "Pinecone 和 Milvus 怎么选?"(答:Pinecone 是纯云托管 SaaS,开箱即用但要付费且数据出境;Milvus 可自建也可托管,国内项目优先 Milvus)
- "向量数据库和传统数据库的本质区别是什么?"(答:在索引结构。向量库用 ANN 算法索引高维向量,传统 DB 用 B+ 树索引标量)
记忆口诀
选型五字诀:"小 Chro、中 Qdr、大 Milvus,有 PG 用 pgvector,搞研究上 FAISS"。
记住一条线:规模决定下限,技术栈决定上限,剩下的就看运维能不能扛得住。
总结
这道题的高分答法是 "先纠正概念(FAISS 不是数据库)→ 再给场景化建议(按规模分层)→ 最后秀工程实践(Spring AI 抽象、运维成本意识)"。千万别上来就背一串优缺点,面试官想听的是你 "在什么场景下、基于什么理由、选了什么方案" 的决策过程。
