最近在搞一个AI Agent项目,需要做长对话记忆和知识库检索,用到了RAG。现在工程上有个纠结的点:向量数据库到底选Qdrant还是Milvus?我们团队对性能要求比较高,数据量大概在千万级,但服务器资源有限,不想上太重的分布式。看文档感觉Qdrant部署轻量,但Milvus的生态和过滤查询功能又很成熟。有没有大佬在实际生产环境中踩过坑?或者有其他更合适的开源方案推荐?另外,如果后续要支持混合检索(向量+关键词),这两个哪个改造起来更顺手?希望有真实经验的人来聊聊,谢谢。
RAG项目向量数据库选型,Qdrant和Milvus怎么权衡?
全部回复
共 101 条千万级数据量如果单机部署,Milvus的写入和索引构建内存占用真的挺吃紧的,Qdrant在轻量场景下反而更省心。不过混合检索这块,Milvus的Sparse向量和BM25结合确实比Qdrant要成熟,但需要额外熟悉它的分片逻辑。我们最后选了Qdrant,主要因为先跑通业务再说,后续真要上关键词检索,可以外挂个Elasticsearch做路由,比强行改造向量库灵活一些。
千万级数据其实两个都能扛,但你这服务器资源有限还挺关键的。Milvus现在虽然出了单机版,但配置起来还是有点重,而且内存占用挺吓人的,我们之前压测时16G内存直接吃满,Qdrant在同等配置下能多跑几个collection。不过要说混合检索,Milvus的filter加sparse vector组合拳确实比Qdrant顺手,毕竟它从2.3开始就把BM25集成进核心了,Qdrant还得自己拼ES或者用它的稀疏向量插件,调试起来多一层功夫。
但说实话,你们如果主要做长对话记忆,Qdrant的payload过滤加动态schema反而更实用,比如按时间戳或会话ID切片查询,它那个jsonb式的过滤性能比Milvus的标量索引更灵活。我之前在社区看到有人把Qdrant和tantivy搭在一起做混合检索,效果不比Milvus原生差,就是维护成本上去了。
还有一点,Qdrant的WAL机制对写入频繁的场景更稳,Milvus在批量导入时偶尔会卡segment合并,你们要是Agent对话日志持续写入,这点值得注意。要是实在纠结,可以看看Elasticsearch 8.11以后的向量检索,千万级也够用,而且你本来就要考虑关键词搜索,它天然就支持BM25和向量混合打分,少维护一个系统。不过ES的存储膨胀率比Qdrant高不少,得算算磁盘够不够。
千万级这个量级其实两个都能扛住,主要看你服务器到底多紧张。我们之前也纠结过,最后选了Qdrant,单机跑起来确实省心,内存控制比Milvus好不少,但你要有心理准备,混合检索这块它得自己拼BM25或者上ES做双路召回,没有Milvus那种开箱即用的感觉。Milvus的过滤查询是真的强,尤其在metadata复杂嵌套的时候,Qdrant有时候会写得想骂人。不过如果你们后续大概率要上分布式,建议直接Milvus,迁移成本比你想的高很多。顺便问下,你们对延迟的硬性要求是多少?这个对选型影响挺大的。
写得挺好,建议补充一些性能数据。
千万级数据量其实两个都能扛,但你们资源有限的话我建议直接Qdrant,单机性能很强,Milvus那个分布式架构小团队运维起来真挺头疼的。混合检索的话Qdrant现在内置了稀疏向量,跟BM25结合很顺,Milvus得自己拼Elasticsearch,麻烦不少。不过Milvus的filter确实做得细,如果你们查询条件特别复杂那另说,但纯RAG场景我个人觉得Qdrant省心太多。
千万级数据量但不想上分布式的话,Qdrant单机确实更省心,内存和CPU占用比Milvus低不少。不过Milvus的标量过滤和稀疏向量支持确实更成熟,如果后续要玩混合检索,它的原生方案比Qdrant自己拼Elasticsearch省事。我们之前试过在Qdrant里做BM25+向量融合,得自己写逻辑,有点折腾。建议先按你们Agent场景的查询模式压测下,特别是并发和延迟,别光看文档。
另外提一句,如果数据增长预期没那么快,也可以看看Elasticsearch 8.x的向量插件,毕竟很多团队本来就有ES运维经验,省一套系统。你们现在预估的QPS和响应时间要求大概是多少?这个对选型影响挺大的。
千万级数据量但服务器资源有限,这个条件其实挺关键的。我们之前做过一轮压测,Milvus在过滤查询和标量索引上的确强,但单机部署内存占用上来后,GC和写入瓶颈会很明显,尤其是你还要做长对话记忆这种高频写入的场景。Qdrant的Rust底层在单机性能上真的能打,我们实测同样数据量下,Qdrant的QPS和延迟都比Milvus稳,不过它的过滤查询语法比Milvus要手动不少,写复杂条件时得自己拼filter,这点挺烦。混合检索的话,两个都得外接ES或者用稀疏向量模型,Qdrant有个好处是它的payload天然支持存储原文,配合BM25这种稀疏向量做融合反而更顺手。我建议你如果团队愿意折腾,可以试试Qdrant+ES的轻量组合,千万级数据完全够用,Milvus那套分布式组件在有限资源下反而容易变成运维负担。另外,如果你还没定,可以看一眼Weaviate,它的混合检索是开箱即用的,但性能上限比Qdrant差一些,看你们对极致性能的追求有多高。
千万级数据量但资源有限的话,我建议先别急着上Milvus,那玩意儿集群起来运维成本真不低。我们当初在Qdrant和它之间选了Qdrant,单机跑千万向量加量化索引,内存控制得还不错,而且它自带的混合检索(稠密+稀疏)其实已经能覆盖你关键词需求了,不用额外接ES。不过说实话,Milvus的filter性能确实更强,如果你业务里元数据过滤特别复杂频繁,那Qdrant的标量过滤会有点吃CPU。你可以先用Qdrant的binary量化压测一下,看延迟能不能接受,再决定要不要为了生态上重武器。
千万级数据量,如果不想上分布式,Milvus单机版其实也挺吃内存的,Qdrant这边我倒是跑过差不多的量级,资源占用确实友好不少。不过Milvus的filtered search在复杂条件组合下效率确实高,Qdrant的filter更多靠payload索引,字段多了会有性能回退。混合检索的话,两边都有内置方案,但Qdrant的BM25融合感觉更顺手,Milvus现在主要靠sparse vector,调起来略绕。建议你们先拿真实对话数据跑个benchmark,别光看文档,尤其注意看下Qdrant的HNSW在千万级下的索引构建时间。
正好两个都在生产环境折腾过,说点实在的。Milvus的过滤查询确实强,但千万级数据配有限服务器,它的依赖组件(etcd、MinIO那些)光维护就够喝一壶的,我们当时单机部署经常OOM,后来拆成集群才稳。Qdrant的binary quantization和分段索引在千万级上内存控制得明显更好,而且它那个Rust写的底层,单机并发扛个几千QPS问题不大。但你要真上混合检索,得注意Qdrant的稀疏向量(BM25)还不太成熟,我们是自己加了ES做关键词召回再合并结果,反而Milvus的sparse vector直接用起来更省事。如果团队没有专门的运维人力,我建议Qdrant起步,数据量真涨到亿级再考虑迁移;如果后续业务重过滤查询,Milvus的partition和标量索引优势会越来越明显。另外可以看看Elasticsearch的kNN,虽然召回率差点,但你们如果已经有ES,改造混合检索的成本反而最低。
我们团队去年从Milvus迁到Qdrant的,主要就是受不了Milvus那套依赖etcd和对象存储的部署,单机模式内存一紧张就各种抖动。千万级数据Qdrant单机其实完全扛得住,我们压测过,16核32G跑500万向量加metadata过滤还能稳定在30ms内,Milvus除非上集群否则优势真不明显。混合检索这块我倒是觉得Qdrant的稀疏向量方案比Milvus的还省心,不需要额外维护Elasticsearch,一个collection里直接配两个字段就行,不过要是你们非要用BM25那套传统关键词召回,Milvus和ES的集成确实更成熟。另外提醒个坑,Qdrant的过滤查询在复杂嵌套条件上没Milvus灵活,比如多级文档权限控制就得自己拼条件,但Agent记忆场景一般用不上那么复杂的过滤。还有个方案你们可以看看Weaviate,混合检索开箱即用,但性能上限不如Qdrant,数据量到千万级之后分片管理比较麻烦。反正我们现在的经验是,资源有限就果断Qdrant,别纠结生态,真要上生产了没人天天折腾那堆扩展组件。
千万级数据其实两个都能扛,但你这资源有限的话我建议先试试Qdrant,单机部署太香了,Milvus虽然功能全但光起个集群就够折腾的。混合检索这俩目前都得自己拼BM25,不过Qdrant的payload索引做关键词过滤挺顺手,Milvus那个filter表达式写起来有点绕。另外可以看看Elasticsearch+向量插件,如果你们已经有用ES的话,少维护一套系统。
千万级数据其实两个都能扛,但你这资源有限的情况我建议先看Qdrant。我们之前是Milvus用户,后来换到Qdrant的,主要就是受不了Milvus那套依赖etcd和对象存储的运维,单机模式虽然能跑但总感觉为了一个小需求背了个大包袱。Qdrant的二进制启动确实香,内存控制也做得细,千万级向量在单机上用HNSW加量化完全能跑出不错的效果,而且它的过滤查询其实不弱,尤其针对标量字段的索引优化做得挺到位。
但说到混合检索,这俩都原生支持不多。Milvus现在有那个Sparse-BM25的集成,但得配合他们自己的Pipeline,感觉有点绕;Qdrant这边有Query API能直接拼稠密和稀疏向量,但稀疏向量得自己生成,比如用SPLADE或者BM25转成稀疏表示,改造思路更透明。我个人觉得如果你们团队有精力做点工程封装,Qdrant的灵活性反而更大,因为它的API设计更干净,不像Milvus有时候感觉是给大厂做全家桶用的。
另外好奇问下,你们关键词检索的延迟要求是多少?如果只是辅助RAG的粗排,其实用ES挂个旁路也行,不一定非得让向量库全包。不然你们后续还得考虑索引同步的坑,这俩在数据一致性上都有点各自的小毛病。
千万级数据但服务器资源有限的话,建议先排除Milvus,那玩意儿单机模式也吃内存,分布式更是运维黑洞。Qdrant单机跑千万级完全够用,而且二进制量化加HNSW的召回率在同等配置下比Milvus稳。混合检索的话,Qdrant自带稀疏向量支持,关键词这块能省不少事,Milvus要自己拼ES或者搞双写,改造成本高不少。另外提醒下,如果后续要上RAG,Qdrant的filter和payload设计在动态元数据过滤上比Milvus顺手得多,我们之前从Milvus迁过来就是受不了它那个schema的刚性。
千万级数据量其实两边都能扛,但服务器资源有限这点上Qdrant确实省心不少,单机就能跑得很稳,Milvus虽然功能全但一上分布式就是资源无底洞。不过我提醒你注意下Qdrant的过滤查询在复杂条件组合时性能会明显下滑,尤其带范围过滤加排序的场景,我们当时调了好久才勉强达标。混合检索这块我觉得Milvus的底子更好,毕竟它有原生的sparse向量支持,跟BM25结合比较顺,Qdrant得自己搭个ES或者用它的稀疏向量功能,但成熟度差点意思。你们要是主要做对话记忆这种时序性强的数据,其实也可以看看lancedb,列式存储对过滤和增量写入更友好,只是生态相对小众。另外千万级数据如果查询模式比较固定,也可以考虑pgvector加索引优化,省掉一个运维组件。最后建议你们拿真实业务数据做个POC,重点测过滤率高的长尾查询,别只看召回率指标。
千万级数据但服务器资源有限的话,我建议直接排除Milvus,它的etcd和pulsar那套依赖在单机或小集群上运维成本真不低,我们当时就是被这个拖惨了。Qdrant单机版用起来省心太多,而且它自带payload索引,你后续要做的混合检索其实可以靠filter加BM25插件硬刚,不用一上来就上es那套。不过如果你们对过滤查询的复杂度和并发吞吐有极度苛刻的要求,那Milvus确实是上限更高,但前提是你得有人专门伺候它。另外可以看一眼我们后来转用的Elasticsearch,如果你已经用ES做日志,那复用它的kNN能力反而省去一个组件。
千万级数据量其实两个都能扛,但你们服务器资源有限的话,我建议先拿Qdrant做压测,它的单机写入和召回延迟在同等配置下往往比Milvus更省心,Milvus要玩爽了基本得上K8s那套。混合检索的话,Qdrant内置的稀疏向量配合BM25其实挺顺手,Milvus那边得靠插件或者自己拼ES,改造复杂度高一些。另外提醒下,如果后续要上亿级且需要复杂标量过滤,Milvus的索引优势才会真正体现,现阶段别被生态绑架。
千万级数据但不想上分布式的话,其实Qdrant单机加SSD完全够用,我们之前压测过1600万向量在16G内存下还能跑出个位数毫秒召回。Milvus的过滤查询确实强,但你要先确认自己是不是真需要那么复杂的标量过滤,很多场景其实Qdrant的Payload索引就够用了。混合检索这块,Milvus的hybrid search和Sparse向量是现成的,Qdrant得自己拼BM25或者用外部ES,这点看你团队愿不愿意多维护一个组件。建议先拿你们真实数据跑个benchmark,光看文档选型容易踩坑。
千万级数据量的话其实Qdrant单机就能扛住,我们之前从Milvus迁过来主要就是嫌它部署太重,但Milvus的filter和标量索引确实更强,如果你查询里复杂条件过滤多可能得再想想。混合检索这俩都得自己拼ES或者用插件,Qdrant的BM25支持还在完善,Milvus那边好像有现成方案但配置麻烦。另外可以看看Elasticsearch新版的原生向量,如果你们本来就用ES的话省一套运维。
我们团队正好两个都试过,最后留了Qdrant,主要看中它内存索引效率高,千万级数据在32G内存机器上跑得挺稳,Milvus那套依赖etcd和对象存储的架构小团队维护起来真头疼。不过你提到混合检索,Milvus的hybrid search现在更成熟,Qdrant要自己搞rank fusion,如果这是刚需建议先做个POC验证下延迟。
千万级数据其实不算大,Qdrant单机部署完全够用,我们生产环境跑过5000万向量,查询延迟在20ms左右,Milvus除非你后面要上亿数据或者需要分布式扩展,否则没必要背那么重的运维包袱。混合检索的话Qdrant有内置的稀疏向量支持,改造成本比Milvus低,但Milvus的filter能力确实更强,看你
千万级数据量如果单机扛得住的话,Qdrant的Rust性能优势还是很明显的,我们之前压测过过滤+向量混合查询,延迟比Milvus稳不少。不过Milvus的布尔过滤确实更灵活,尤其嵌套条件多的时候写起来省心。混合检索这块,两个都得自己拼Elasticsearch或者别的倒排索引,但Qdrant那个稀疏向量功能能省掉额外组件。你们服务器资源紧张的话,建议先拿Qdrant的二进制版跑个POC,注意下分片和内存的平衡点,Milvus单机版其实也不轻。