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+ 小伙伴加入学习,欢迎点击围观

面试考察点

  1. 基础认知的准确性:面试官想先确认你能不能分清楚 "向量数据库" 和 "向量检索库" 的本质区别。FAISS 严格意义上不是数据库,这点答错了后面说啥都白搭。

  2. 场景化选型能力:面试官问的不是哪个最好,是哪个最适合某个场景。你能不能结合数据规模、运维成本、团队技术栈给出建议,这才是区分 "看过文档" 和 "做过架构" 的关键。

  3. 生产实践意识:有没有考虑过持久化、分布式扩展、标量过滤、混合检索这些工程化需求?只会说 "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 让业务数据与向量共库共事务
pgvector 让业务数据与向量共库共事务

上图展示了 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 毕业项目。

Milvus 存算分离架构
Milvus 存算分离架构

它的架构特点是存算分离:计算节点无状态,数据落在对象存储和消息队列里,可以独立扩缩容。水平扩展和高可用都是这套架构带来的。

  • 优点:亿级向量不在话下、多副本高可用、丰富的索引类型(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 抽象,思路一致。

五、选型决策流程

按数据规模选择 Milvus、Qdrant、pgvector
按数据规模选择 Milvus、Qdrant、pgvector

上图是完整的选型决策路径,沿着 "数据规模 → 技术栈约束 → 运维能力" 三个维度走。重点说几个关键决策点:

  • 数据规模是第一道分水岭:100 万是一条线,亿级是另一条线,中间地带 Qdrant 最稳
  • 已有 PG 栈是个强信号:能用 pgvector 就别折腾新组件,很多企业内部问答系统的数据量根本到不了 pgvector 的天花板
  • Milvus 自建 vs 托管:如果没有专职运维团队,强烈建议直接上 Zilliz Cloud,自建 Milvus 的运维成本会吃掉你大半精力
  • FAISS 只在特殊场景:除非是做算法研究或者必须用 GPU 加速,否则工程上没必要从 FAISS 开始造轮子

面试高频追问

  1. 向量数据库的索引原理是什么?HNSW、IVF、PQ 有什么区别?

    • HNSW 是基于图的近似最近邻算法,查询快、内存占用高;IVF 是基于聚类的倒排方法,可调精度/速度;PQ 是乘积量化,用压缩换内存。生产环境 HNSW 用得最多,Milvus 大规模场景会用 DiskANN。
  2. RAG 系统的混合检索怎么实现?

    • 稠密向量检索(语义)+ 稀疏向量检索(关键词,如 BM25)融合结果。Milvus 2.4+ 原生支持稀疏向量,Qdrant 也支持,Spring AI 在 1.0 之后也加强了这方面的抽象。
  3. pgvector 性能到多少会撑不住?

    • 一般百万级还能扛,千万级要看硬件和索引(HNSW + IVFFlat 的选择很关键)。超过千万、并且有并发检索需求时,基本就该考虑 Qdrant 或 Milvus 了。
  4. 为什么 Milvus 要做存算分离?

    • 计算节点无状态可以随时扩缩容,数据持久化在对象存储上不怕丢。这是云原生数据库的常见设计,好处就是扩缩容灵活,又不容易丢数据。

常见面试变体

  • "为什么不用 Elasticsearch 做向量检索?kNN 搜索不行吗?"(答:ES 也能做,但大规模场景性能不如专用向量库,且成本高)
  • "Pinecone 和 Milvus 怎么选?"(答:Pinecone 是纯云托管 SaaS,开箱即用但要付费且数据出境;Milvus 可自建也可托管,国内项目优先 Milvus)
  • "向量数据库和传统数据库的本质区别是什么?"(答:在索引结构。向量库用 ANN 算法索引高维向量,传统 DB 用 B+ 树索引标量)

记忆口诀

选型五字诀:"小 Chro、中 Qdr、大 Milvus,有 PG 用 pgvector,搞研究上 FAISS"。

记住一条线:规模决定下限,技术栈决定上限,剩下的就看运维能不能扛得住

总结

这道题的高分答法是 "先纠正概念(FAISS 不是数据库)→ 再给场景化建议(按规模分层)→ 最后秀工程实践(Spring AI 抽象、运维成本意识)"。千万别上来就背一串优缺点,面试官想听的是你 "在什么场景下、基于什么理由、选了什么方案" 的决策过程。