最近在搞一个AI Agent项目,需要做长对话记忆和知识库检索,用到了RAG。现在工程上有个纠结的点:向量数据库到底选Qdrant还是Milvus?我们团队对性能要求比较高,数据量大概在千万级,但服务器资源有限,不想上太重的分布式。看文档感觉Qdrant部署轻量,但Milvus的生态和过滤查询功能又很成熟。有没有大佬在实际生产环境中踩过坑?或者有其他更合适的开源方案推荐?另外,如果后续要支持混合检索(向量+关键词),这两个哪个改造起来更顺手?希望有真实经验的人来聊聊,谢谢。
RAG项目向量数据库选型,Qdrant和Milvus怎么权衡?
全部回复
共 101 条千万级数据量其实两个都能扛,但关键看你说的“资源有限”到什么程度。Milvus如果是单机版,内存和CPU压力比Qdrant大不少,而且它的分布式版本对运维要求真不是闹着玩的,我们之前试过光调参数就折腾了两周。Qdrant胜在原生支持payload过滤,配合Rust写的底层,单机千万级向量召回延迟能做到个位数毫秒,这点在长对话记忆这种高并发场景挺香的。不过Milvus的混合检索是原生集成的,比如BM25和向量加权,Qdrant得自己拼倒排索引或者用外部es,改造工程量看你们技术栈熟不熟。要是你们团队没专门运维,我建议先Qdrant顶着,毕竟部署就一个二进制文件,真要上亿数据再考虑迁移。另外可以考虑下Elasticsearch的kNN插件,如果你们本来就有ES,其实混合检索直接复用现有集群,少维护一套系统。最后提醒下,千万级数据量记得测一下带过滤条件的召回率,别光看纯向量性能,这两个在过滤场景下差异挺大的。
千万级数据但不想上分布式的话,我建议你先压测下Qdrant的单机性能,其实它单节点扛个几千万向量问题不大,而且Rust写的资源占用确实友好。Milvus的过滤查询确实强,但你要算上etcd那些组件,运维成本直接翻倍。混合检索这块,Qdrant最近把BM25也原生支持了,改造起来反而更顺。我们之前是从Milvus迁到Qdrant的,主要就是受不了它动不动就要扩节点。
千万级数据量如果单机部署,Qdrant的性价比其实挺高的,Milvus在分布式下才真正发挥优势,资源有限的话运维成本差距会很明显。混合检索这俩都得自己拼ES或者搞双写,Qdrant的BM25是内置的但效果一般,Milvus那边生态成熟点可以接pisa。我们之前从Milvus迁到Qdrant就是受不了它那套coordinator组件,内存吃紧的时候调度经常抽风。建议先拿你们真实数据跑个benchmark,重点看过滤+向量组合查询的延迟,这俩在千万级非均匀分布数据上的表现差异会放大。
千万级数据量但资源有限,这个条件其实挺关键的。我们当时在选型时也在这俩之间纠结过,最后因为部署成本选了Qdrant,单机跑起来确实舒服,内存占用比Milvus小不少,而且千万级向量在单机上用IVF索引完全扛得住。不过你说的过滤查询功能,Qdrant的payload过滤确实没Milvus那么灵活,尤其是复杂组合条件的时候,得自己多写点逻辑。混合检索的话,两个都得配ES或者布隆过滤器之类的辅助,但Qdrant的稀疏向量支持是原生内置的,做late interaction或者BM25融合反而更容易调。倒是想问问你们对写入延迟和查询延迟的敏感度如何?如果并发不高,Qdrant单机其实很稳,但要是后续要上多副本或者升级分布式,Milvus的平滑扩展性会好很多。另外,最近也在看LanceDB和Chroma,前者对混合检索的优化挺有意思的,但生态还没那么成熟,你们有试过吗?
我们团队去年做过类似选型,最后留了Qdrant,主要就是吃不住Milvus那套依赖etcd和pulsar的资源开销,千万级数据单机Qdrant其实完全扛得住,而且它的HNSW参数调优空间挺大的。不过你说的过滤查询我倒觉得Milvus确实更强,Qdrant的filter在复杂嵌套条件上会有点力不从心,尤其是和布尔逻辑混用的时候,性能掉得比较明显。混合检索这块两个都得自己拼ES或tantivy,但Qdrant的sparse vector接口写起来更顺手,Milvus那个还得走独立collection再合并,挺绕的。顺嘴提一句,如果你们不是非要用Java栈,也可以看看Weaviate,它的hybrid search是原生支持的,就是中文分词做得一般。另外提醒一句,千万别只看benchmark,实际跑一下你们的查询模式,尤其是并发高的时候,Qdrant的锁机制有时候会给你“惊喜”。
千万级单机Qdrant扛得住,Milvus不分布式反而更折腾。混合检索Qdrant加个BM25插件也够用。
我们团队之前也是这俩纠结,最后选了Qdrant,部署省心太多。千万级数据量单机性能完全没问题,混合检索用内置的稀疏向量就行。
千万级数据Qdrant单机完全够用,别迷信Milvus,我们就是被分布式坑过才换的。混合检索建议直接看Qdrant的BM25集成,改起来省事。
Qdrant轻量部署是真香,但Milvus的filter查询确实强,你这数据量不大,先想清楚要不要上k8s,不然运维就够喝一壶。
千万级数据还得看你的内存预算和查询延迟要求。Qdrant单机部署确实省事,但Milvus在不启用分布式时也能跑,只是索引构建和查询性能调优需要花时间。我们之前做过压测,同样千万级、128维向量,Qdrant在过滤查询上会明显掉速,Milvus的标量过滤+向量检索配合得更好,尤其你提到混合检索,Milvus的Sparse向量支持是原生集成的,Qdrant那边得自己拼倒排索引,工程复杂度高不少。不过要是数据量再翻几倍,Milvus单机也会吃力,那时候得考虑分片,而Qdrant的集群模式反而更轻量。另一个坑是Milvus的依赖组件多(etcd、MinIO这些),运维起来比Qdrant重,但如果你们有K8s经验,问题不大。我建议先拿各自的Docker镜像跑一遍你们的真实查询模式,重点看带filter的召回率和P99延迟,别光看文档。另外可以看看Weaviate,它混合检索也做得好,但千万级性能不如这两个稳定。
千万级单机Qdrant完全扛得住,别被Milvus运维拖垮,混合检索直接上ES配个向量插件更省心。
我们团队之前做类似项目时也卡在这两个上,最后选了Qdrant。主要原因是Milvus的集群模式确实重,单机版性能又容易遇到瓶颈,尤其千万级数据量下索引构建和查询延迟的平衡不好调。Qdrant的Rust底层在单机高并发场景表现很稳,内存占用也友好,你们资源有限的话能省不少事。
不过你说的过滤查询,Milvus确实更强。Qdrant的filter虽然能用,但复杂嵌套条件多了性能下降明显,我们后来是用冗余字段加简单过滤绕过去的。混合检索方面,Qdrant原生支持稀疏向量,跟BM25结合很顺,Milvus得自己拼ES或者搞双路召回,改造成本反而高。
有个坑得提醒你,Qdrant的千万级数据要做好分片策略,不然单节点写入会有瓶颈。我们后来是两节点,每个节点分片加副本,效果还行。另外你们长对话记忆的场景,我建议重点看下Qdrant的增量更新机制,它不需要重建整个索引,这比Milvus省心很多。
至于其他方案,如果你不想碰分布式,可以看看Weaviate,但它的混合搜索性能一般。其实还有个偏门思路,用pgvector配个索引优化,但千万级数据量下查询延迟会比较飘,不太建议。反正如果你们短期内不上分布式,我倾向Qdrant。
千万级数据其实真不用一上来就上分布式,我们当时在Qdrant单机跑过类似规模,内存控制好问题不大,而且部署运维省心太多。Milvus的filter确实强,但你要考虑团队有没有精力养这套集群,尤其是资源有限的情况下。混合检索的话,Qdrant内置的稀疏向量配合BM25也挺方便,Milvus那边得自己拼ES或者别的检索组件,改造成本反而更高。建议你先拿各自官方benchmark跑一下真实业务query,别只看文档结论。
千万级数据量这俩其实都能扛,但资源有限的话我建议你先看Qdrant,单机部署确实省心,我们当时在8C32G机器上跑800万向量没出过幺蛾子。Milvus的过滤查询确实强,但真要上分布式那运维成本直接起飞。混合检索这块Qdrant自带稀疏向量支持,改起来比Milvus的还简单点,不过你要是有复杂标量过滤需求还是得掂量下。
千万级数据其实两个都能扛,但你的瓶颈大概率不在向量检索本身,而在过滤条件和写入吞吐的平衡上。Milvus的标量过滤确实强,尤其那种带时间戳、用户ID的复杂组合查询,Qdrant的payload索引在这种场景下会有点吃力,但如果你主要就是纯向量相似度召回,Qdrant的单机性能反而更稳,内存控制也更好。部署这块别光看文档,Milvus虽然支持单机模式,但生产环境真跑起来内存和CPU开销比Qdrant明显高一个档,特别是segment合并和索引构建的时候。混合检索的话,Qdrant的BM25是原生集成的,改起来基本就是配个参数,Milvus现在还得靠外部ES或者自己拼结果集,麻烦不少。我建议你先压测一下带过滤条件的召回延迟,如果过滤场景占比高,Milvus值得吃下这个资源成本,反之Qdrant能让你省心很多。还有个思路是看看Elasticsearch的kNN向量检索,现在8.x版本性能也上来了,如果你本来就要用ES做关键词,那直接一套系统搞定可能更划算。
Qdrant单机性能够用,混合检索直接上ES配插件,别折腾Milvus那套重型架构。
千万级数据Qdrant扛得住,过滤查询自己写代码补,milvus部署运维能烦死你。
千万级数据量其实两个都能扛,但如果你不想折腾分布式,Qdrant单机部署确实省心很多,Milvus在资源受限下容易陷入调参泥潭。混合检索的话,Milvus的Sparse向量支持是现成的,Qdrant得自己拼ES或BM25,改造工作量不小。建议先拿真实数据跑个压测,重点看内存占用和过滤查询的延迟,别光看文档。另外可以看看Elasticsearch新版的原生向量,如果你们原本就有ES,少维护一套系统可能更划算。
千万级数据其实还在单机能扛的范围内,Qdrant单节点加SSD基本能跑,资源占用确实比Milvus小一大截,我们之前测试过同样数据量,Qdrant内存峰值低不少。但Milvus的过滤查询是真的强,尤其是带标量字段组合过滤的场景,Qdrant的filter语法有时候会写出很长的嵌套,性能也容易波动。混合检索这块,两个都得自己接BM25或者用插件,Qdrant有内置的稀疏向量支持,改造起来少一步,Milvus虽然也有,但配置起来更绕。如果你团队没专门运维,我倾向Qdrant,毕竟升级、备份都省心,出问题也好排查。不过千万级如果后续涨到亿级,Qdrant单机就吃力了,Milvus分布式扩展还是稳一点。你们对延迟的硬指标是多少?如果p99要求50ms内,两个都得做缓存和分片策略,别指望裸查询。
千万级数据的话其实Qdrant单机就能扛住,我们之前压测过,资源占用比Milvus小很多,尤其你服务器有限这点很重要。但Milvus的标量过滤确实更细,如果业务里复杂条件查询多,Qdrant得自己拼filter,稍微绕一点。混合检索的话,Qdrant内置的BM25是开箱即用,Milvus得自己接ES或者搞双写,这点上我更推荐前者。不过Milvus社区活跃,出问题好搜答案,Qdrant文档相对精简,得自己多翻源码。最后提个醒,千万级如果QPS不高,单机Qdrant加SSD真的够,没必要一上来就上分布式。
千万级数据其实两个都能扛,但你这服务器有限的话我建议直接上Qdrant,单机部署真的省心,Milvus光是etcd那些依赖就够折腾的。混合检索的话Qdrant现在内置了BM25,改造起来基本不用动架构,Milvus那边得自己拼ES或者上sparse向量,工程量不小。不过Milvus的filter性能确实强,如果你经常要按标签过滤数据,那还是得考虑下。
千万级单机Qdrant扛得住,Milvus不分布式反而难搞,混合检索建议直接上ES配向量插件。
我们生产环境就是Qdrant单机跑的,过滤查询用表达式也够用,Milvus那套运维成本真不是小团队能消化的。
千万级数据量其实Qdrant单机就能扛住,我们之前从Milvus迁过来主要就是受不了它那套依赖etcd和对象存储的运维,部署轻量这点在资源有限时太重要了。混合检索的话Qdrant的Sparse Vector功能直接支持BM25,不用自己搭ES做双路召回,改造省心很多。不过如果你特别依赖Milvus那种标量过滤和分区能力,比如按用户ID硬过滤千万级数据,那它的性能确实更稳,得看你们具体过滤场景多不多。另外可以看看Elasticsearch的kNN插件,如果你们本来就有ES,别重复造轮子。