Milvus / Chroma / pgvector / Elasticsearch 怎么选?
谁在问:工程向一二面;技术负责人尤其关注运维成本这条
口语化问法
- 你们向量库用的什么?为什么选它不选别的?
- pgvector 够用吗?什么时候必须上专用的向量库?
- 如果让你重新选一次,你会怎么选?
考察意图
选型题的通用考点:能不能先问约束再给结论。上来就报一个库名的候选人,等于告诉面试官「我只用过这一个」。真正的观察点是:① 你知不知道该问数据规模、团队运维能力、是否已有 PG/ES 技术栈;② 你有没有意识到运维成本常常比性能更决定选型;③ 迁移成本你估得准不准。
参考答案
60 分答案(及格线)
要看几个维度:数据规模、是否需要分布式、团队运维能力、是否已有相关技术栈、要不要混合检索。粗略地说:pgvector 适合已有 PostgreSQL 且百万级以内,装个扩展就能用,零额外运维;Qdrant 单二进制部署,性能好、元数据过滤强,适合中等规模;Milvus 适合亿级和真正需要分布式的场景,但依赖组件多、运维重;Chroma 适合原型验证,不建议上生产;Elasticsearch 适合团队已有 ES 栈、BM25 底子厚的情况。
90 分答案(有生产经验的回答)
补四层:
先讲两个真实反面案例(这比罗列参数有说服力):一种是「重装上阵」——项目刚立项就上 Milvus 集群,知识库才两万条,团队一半精力耗在维护依赖组件上;另一种是「轻装冒进」——Chroma 跑了半年原型,数据涨到三百万条,某天延迟从 80ms 飙到 2 秒,单机索引内存放不下,扩容只能整库重建。两种坑的根子一样:选型时只看「能不能跑起来」,没看「这条路能走多远」。
把运维成本摆到台面:「部署复杂度」最容易被低估——它不是「装起来几步」,而是长期运维负担。Chroma 是进程内嵌库,坏了重启即可;Qdrant 一个 docker run 就能起;Milvus 通常要拉起元数据存储、对象存储、消息队列等多个依赖,任何一个挂了整个集群受影响,排障链路长一个量级。所以选型前先问自己:团队里有没有人愿意长期盯这套分布式系统的告警?
迁移成本没想象中高(重要的反直觉点):embedding 结果是确定性的,换库不需要重新计算向量,导出向量和元数据重新写入即可,百万级通常半小时内完成。所以「先用简单的,顶不住再迁」是合理策略——前提是别拖到三百万条才想起来。
混合检索能力是 2026 年的关键筛选项:Qdrant、Milvus、Weaviate、Elasticsearch 都原生支持;pgvector 要手动组合向量与全文检索;Chroma 不支持——这也是不建议它上生产的重要原因之一。Milvus 2.5+ 内置 BM25 全文检索,一个库就能做完混合检索,省掉维护两套系统。
追问链
在给出结论前,你会先问我什么问题?
期望数据量级与增长曲线、QPS 与延迟要求、要不要混合检索、有没有现成 PG/ES 技术栈、团队运维能力、数据能否出内网、预算 —— 这问本身就是在测「先澄清再方案」的习惯信号一上来就报库名、答不出要问什么 → 平时是拿到需求直接动手pgvector 和专用向量库的差距具体在哪?
期望专用库在百万级向量的 QPS 通常是 pgvector 数倍,索引类型也全(HNSW/IVF/DiskANN),pgvector 支持有限;但 pgvector 换来零额外运维 + 事务一致性 + 同库 JOIN —— 向量与权限、时间字段在一个事务里更新,很多场景比性能更重要信号说得出「同库 JOIN + 事务一致性」这条优势 → 真权衡过,不是人云亦云什么是预过滤和后过滤?为什么这个很关键?
期望带元数据条件的查询有两种执行顺序。后过滤致命:先取 Top-100 再过滤,可能只剩 3 条甚至为空;预过滤先缩小候选范围再做向量搜索。Qdrant、Milvus 默认预过滤,pgvector 要留意查询计划 —— 权限隔离场景下这直接决定可用性信号说得清「后过滤先取 Top-100 再滤会返空」→ 被这个坑过;说不清 → 没做过带过滤的生产系统现在让你从 Chroma 迁到 Qdrant,怎么做?停机吗?
期望向量不用重算 —— 导出向量 + payload 重新 upsert,百万级作业通常半小时内。平滑做法是双写 + 灰度读切换:先双写保证新库数据完整 → 按比例切读流量 → 对比两边结果一致后全量切 → 观察期后下线旧库信号只会说「导出导入」、想不到双写灰度 → 没做过线上迁移你们在 Chroma 上跑了半年,数据涨到三百万延迟爆了,明天要给方案,怎么办?
期望先止血再搬家。短期:降ef_search/top-k 换延迟 → 加缓存 → 冷数据分区剔除;中期:按双写灰度迁到 Qdrant 或 Milvus。必须同时给量化的验收标准(P95 延迟目标、召回率不得低于当前值)和回滚方案信号只给「迁库」一个答案、没有短期止血和回滚计划 → 缺乏线上事故处理经验
评分要点
- 先问约束再给结论(或至少明确列出决策维度)
- 能对至少三个库给出甜点区和代价
- 把运维复杂度作为独立维度而非附带提一句
- 知道 Chroma 不适合生产及具体原因
- 知道混合检索支持度是关键筛选项
- 加分:知道迁移不需要重算向量、成本可控
- 加分:知道预过滤 vs 后过滤的差别及其影响
- 加分:pgvector 的事务一致性/同库 JOIN 优势