最近在做一个RAG项目,需要把文档embedding后存起来做语义检索。之前只用过faiss做本地测试,现在要上生产,发现Milvus和Qdrant都挺火的。我的数据量大概几百万条,要求查询延迟在100ms以内。看文档说Milvus功能多但部署复杂,Qdrant轻量但怕扩展不行。请问实际项目里大家更推荐哪个?另外HNSW索引的参数有没有什么坑需要注意?感谢!
刚学向量数据库,Milvus和Qdrant到底该怎么选?
全部回复
共 167 条几百万条这数据量其实Qdrant完全扛得住,我们线上用了大半年,8C16G的实例延迟基本稳定在30-50ms,部署省心太多了。Milvus功能确实全,但光那个etcd和对象存储的运维就够喝一壶的,除非你们有专职infra团队,不然前期折腾成本很高。HNSW的话,M别无脑拉高,我建议从16开始调,efConstruction设200左右,不然内存会爆得很难看。另外你如果对过滤查询有强需求,记得看看Qdrant的payload索引,这块比Milvus顺手。
数据量几百万的话Qdrant单机足够,部署省心多了,Milvus那套运维复杂度够你喝一壶的。HNSW记得调大efConstruction到200以上,别迷信默认值。
这俩我都折腾过,最后留了Qdrant。几百万条这量级它真不虚,延迟稳在50ms内,关键Docker跑起来省心,Milvus那套组件我看着就头大。HNSW的坑倒是有一个,M别贪大,16到32够用了,efConstruction设个200多,不然索引构建慢到怀疑人生,还有记得调一下quantization,能省不少内存。
不过你要是后期准备上几千万条还得走集群,那Milvus的分布式优势就出来了,单机Qdrant到后面垂直扩容挺肉疼。你那边查询模式是纯向量还是带标量过滤?带过滤的话HNSW的efSearch得动态调,不然召回率掉得厉害。
几百万条这量级其实两边都扛得住,Qdrant单机跑起来挺稳的,扩展问题等真到了千万级再迁移也不迟。我倒是觉得Milvus那套组件够你折腾半个月,小团队没必要上来就啃K8s。HNSW的M值别贪大,16到32就够,efConstruction设200左右,不然构建慢还吃内存。你延迟要求100ms的话,记得把efSearch压到64以下,别光看默认值。
看到你从faiss直接跳生产,我建议先别急着选型,把数据规模和QPS峰值再估一估。几百万条其实两个都能扛,但Milvus真正的优势在分布式和混合查询,比如标量过滤加向量检索同时做,Qdrant单机部署确实省心,但如果你以后数据涨到千万级还要加节点,它的集群方案成熟度不如Milvus。延迟100ms这个要求,其实HNSW参数比选库更关键,我踩过坑的是M(每层最大连接数)设太大,内存直接翻倍,建议M控制在16-32,efConstruction可以拉到200-400,但efSearch别超过200,不然高并发下CPU直接打满。另外你的embedding维度是多少?如果是768维以上,记得开量化(比如PQ或ScalarQuantization),不然几百万条全内存索引很吃机器。还有个小细节,Qdrant的payload过滤走的是独立索引,如果你文档有大量标签过滤场景,它比Milvus的filter快不少;反过来Milvus新版的Kafka对接和流式写入更顺,如果数据是持续进来的,运维成本反而低。建议你拿真实数据各跑个benchmark,重点看P99延迟,别只盯平均,我这边之前用Qdrant单节点四百万条,P99能稳在80ms,但并发超过50就崩了,Milvus调好资源倒是能撑到200并发。
几百万条这量级其实俩都能扛,不用太担心Qdrant扩展性,我生产环境单机跑过千万级向量,查询延迟也就几十毫秒。Milvus那套分布式组件确实折腾,如果团队没有专人运维,建议先上Qdrant,后面真到了亿级再迁移也不迟。HNSW的话,efConstruction别贪大,我一般设200-400,M设16,再高内存涨得肉疼,召回率提升却有限,先拿小数据集调参再全量构建比较稳。你RAG场景如果查询模式比较固定,记得试试Qdrant的payload过滤,能大幅缩小搜索范围。
几百万条这量级其实两个都能扛,但Qdrant单机部署省心太多了,我之前用Docker跑起来半小时搞定,Milvus那套组件编排光看文档就劝退。延迟的话两者调好HNSW都能进100ms,不过Qdrant的payload过滤在RAG场景里好用不少。HNSW的坑主要是efConstruction别贪大,之前设512建索引慢到怀疑人生,实际256够用,还有M值按数据维度调,别无脑抄默认参数。如果你团队没人专门运维,我建议先上Qdrant,真到千万级再考虑迁Milvus也不迟。
说实话这规模上生产我建议直接Milvus,Qdrant单机跑几百万条倒是没问题,但后面你要是加过滤或者做标量混合查询,Milvus的生态优势就出来了。部署那块其实有docker compose模板,照着改改配置半小时能起来,没传说中那么吓人。HNSW的话记得把efConstruction调高到200以上,M值别低于16,不然召回率会让你怀疑人生,另外千万记得开启mmap模式,不然内存直接爆。如果你团队就一两个人维护,Qdrant确实省心,但数据量再翻个几倍你就得折腾集群了。
几百万条上生产还是直接Milvus吧,Qdrant单机部署扩展是真折腾,HNSW的M设16、efConstruction别超过200就行。
几百万条这数据量其实两边都能扛,Qdrant单机跑起来没想象中那么弱,我倒是觉得你更该关注运维成本和查询模式。Milvus那套组件真不是一般团队愿意折腾的,如果你不想招个运维专盯着它,Qdrant的docker-compose起步能省很多事。HNSW的话,记得efConstruction别一味调高,几百够了,多了只是训练时自嗨,查询延迟反而会变差。另外你100ms的延迟目标得看分片策略,Qdrant按payload过滤时性能掉得快,这点Milvus的标量过滤做得好些,你要是查询条件复杂就得再权衡下。
你这数据量上Qdrant够用了,部署省心,延迟稳得很,Milvus那套运维复杂度真没必要。
HNSW记得把efConstruction调高到400,M设16,别照抄默认值,召回率差挺多的。
几百万条这量级其实两个都能扛,主要看你们运维能力。Milvus那堆组件(etcd、pulsar)光搭就得折腾一周,Qdrant一个二进制文件就能跑,我生产环境直接docker-compose起的,延迟平均40ms。HNSW的话,efConstruction别贪大,我设300左右,M值16-24,不然索引构建慢到怀疑人生。
说实话这俩我都用过,最后留在qdrant了。milvus功能确实全,但光etcd、minio、pulsar那套依赖就够你运维喝一壶的,小团队真没必要为了那些高级特性把infra搞这么重。你几百万条这个量级,qdrant单机完全扛得住,延迟比milvus还稳,我压测过p99基本在50ms内,远低于你100ms的要求。
不过你要是以后想上gpu索引或者需要原生支持disk-based向量,那milvus的路线图确实更激进,qdrant这块还在追。HNSW的坑我倒是踩过不少,最关键的是m参数别盲目调大,默认16就行,调太高内存直接翻倍,还有ef_construction建索引时设成200差不多了,太高建库慢得离谱,查询时ef_query动态调就好,别贪心设成1000以上,召回率高不了多少延迟倒是肉眼可见往上涨。
另外你提到faiss,其实如果数据是静态的、不频繁增删,完全可以直接用faiss搭个轻量服务,配个简单的倒排过滤,比上这俩都省心。但既然你要上生产且可能后面要加数据,那还是qdrant吧,它的过滤器和payload索引做得最顺手,milvus那个filter性能有时候会莫名崩。最后提醒下,不管选哪个,先把你的embedding维度记清楚,qdrant对高维向量压缩支持一般,要是你用的openai那套1536维,记得提前建好量化方案。
几百万条这量级其实Qdrant够用,部署省心太多,Milvus运维够你喝一壶的。
几百万条这量级Qdrant完全扛得住,部署省心太多,Milvus光运维就能耗掉你半条命。
HNSW的M设16、efConstruction设200够用,efSearch先调到64再按延迟调就行。
几百万量级其实Qdrant够用了,部署省心太多,Milvus那套运维真能折腾死人。HNSW记得把efConstruction调高点,M值16左右,别一味追低延迟。
说实话这俩我最后选了Qdrant,主要就是图个省心,几百万条数据加HNSW完全够用,延迟基本在50ms左右,部署一个docker就完事了。Milvus功能确实多但光那个etcd和minio的依赖就够折腾,小团队真没精力伺候。坑的话记得HNSW的M值别拉太高,32以上内存涨得飞快,efConstruction设个200-400就够了,efSearch做query的时候再调。你数据量要是后面涨到千万级,可以先留个心眼观察下Qdrant的分片策略,不过现阶段我觉得它挺稳的。
几百万条这量级Qdrant完全扛得住,别怕扩展性,部署省心太多。HNSW记得把efConstruction调高到200以上,召回率会稳很多。
几百万条这量级其实两个都能扛,但生产环境我建议你先看团队运维能力,Milvus那套组件真不是一般团队乐意折腾的,Qdrant单机起步省心太多。延迟100ms只要索引参数不瞎调基本都能达到,HNSW主要坑在M和efConstruction,别无脑拉高,我遇到过有人设M=64结果内存爆炸的。另外Qdrant的payload过滤如果查询带复杂条件,性能下降比Milvus明显,这个你得根据实际查询模式评估下。
几百万条这量级其实两个都扛得住,Qdrant单机跑没问题,但你要是后续数据涨得快或者要上分布式,Milvus的扩缩容确实省心不少。我team里之前从Qdrant迁到Milvus,主要就是受不了手动分片和动态建索引的麻烦,不过Milvus那套依赖(etcd、MinIO)第一次配是真的想骂人。HNSW的话,M值别贪大,64够用了,efConstruction设个200-300,检索时efSearch动态调,不然内存直接爆炸。对了你查询延迟100ms以内,记得把segment预加载关掉,冷启动会坑死你。