最近在搭一个企业知识库问答系统,数据量大概几百万条文档切片。目前卡在检索层选型上:FAISS+向量检索是主流方案,但看到很多帖子说纯向量召回在精确关键词匹配(比如工单编号、设备型号)上会翻车,需要上混合检索。纠结要不要直接用Elasticsearch的KNN插件,既能做BM25关键词召回又能向量检索,省得维护两套系统。但身边朋友说ES在高并发向量检索上性能不如专门的向量库(Milvus/Qdrant),而且他们公司最后是两套都部署了。想请教下实际生产环境里,各位是怎么权衡的?尤其是数据量上来之后,ES的KNN会不会成为瓶颈?另外,有没有必要一开始就上Rerank重排模型?预算有限,怕折腾半天最后架构搞太重。求真实踩坑经验,谢谢!
RAG检索用向量数据库还是ES?生产环境怎么选才不后悔?
全部回复
共 6 条我们团队去年做过类似的选型,最后是ES+FAISS双轨跑的。ES扛精确查询和过滤,FAISS管语义召回,前期省事后期也不至于被单点卡死。不过你说的高并发这块,ES的KNN确实在几百万级后延迟会飘,我们压测过,QPS过千就得调参调得头疼。Rerank建议别一上来就上,先用BM25+向量召回的分数融合顶着,等bad case积累多了再针对性加,不然预算和运维都容易崩。
我们团队之前也纠结过这个问题,最后是ES和向量库都上了,ES专门扛精确匹配和过滤条件,向量库管语义召回,两边各干各的。你提到几百万量级,其实ES的KNN在初期完全够用,但真要冲到千万级以上并且并发高,确实会明显感觉吃力。Rerank我建议别一上来就上,先看纯向量+BM25的fusion结果能不能满足业务,不然排错和调参成本会吃掉你大部分时间。另外可以留意下Qdrant这类带payload过滤的库,有些场景能省掉ES那一层。
我们团队去年也踩过这个坑,最后是ES和向量库都留着了,但分工很明确。ES扛精确匹配和过滤条件,比如工单号、时间范围这些,向量库只管语义召回,中间加一层路由判断。你如果预算有限,先别急着上Rerank,把检索结果top50拉出来,用规则或者轻量模型粗排一下,效果能提升不少,成本还低。ES的KNN在小数据量时确实省事,但到了几百万条以上,你得特别注意segment合并和内存消耗,我们压测时发现并发一高,查询延迟会抖得很厉害,反而Milvus那边稳定得多。另外别忽略一个事,你文档切片本身含不含结构化字段?如果含,那ES的filter能力几乎是刚需,纯向量库做不了复杂条件过滤。我建议你参考的做法是:先拿一周时间,用ES做混合检索原型,把BM25和向量分数调权重,看看bad case能不能接受;如果接受不了,再引入独立向量库,但别一开始就双写,太耗维护精力。最后提醒下,Rerank模型真不是必须的,很多场景靠调权重和过滤就能解决,别被技术潮流带跑了。
说实话我们团队也是两套都上了,但出发点不是性能,而是运维省心。ES的KNN在百万级还行,你到几百万切片且并发一高,延迟和内存占用确实容易让人头疼。我们最后是FAISS管向量召回,ES只做BTM25精确匹配,中间用个轻量路由规则,效果比单吊一套稳得多。Rerank的话,初期真没必要,先把召回调好,等bad case集中爆发再上也不迟。
我们团队之前也纠结过这个问题,最后是ES和向量库都留着了。ES的KNN在五百万级数据上延迟还能接受,但到了两千万量级确实明显吃力,尤其并发一上来CPU直接拉满。混合检索这块,建议别一开始就自己拼逻辑,先用ES的RRF插件顶一阵子,省心不少。Rerank我倒觉得可以缓一缓,先把召回做扎实,如果后续发现准确率卡在70%上不去再上也不迟,不然预算真容易打水漂。
几百万切片这个量级,ES的KNN其实没想象中那么脆,前提是你别用暴力扫描,老老实实上HNSW索引,再把段合并和堆外内存调好。真正会翻车的往往是过滤条件多的场景,比如先按租户或时间过滤再向量召回,ES的filter和KNN结合有时候执行计划不太理想,延迟会抖。纯向量在工单号、设备型号这种精确匹配上确实容易丢,我自己的做法是ES里BM25和KNN各召一批,用RRF融合,省事效果也稳。至于要不要两套都上,得看你的QPS和延迟要求,如果就几十并发,ES完全扛得住,别被"专用向量库"四个字唬住。Rerank我建议一开始就留接口但先别上,等召回质量真的卡住了再加,bge-reranker-base这种小模型成本还好,但会直接拉高响应时间。预算有限的话,先把混合检索和ES调优吃透,比堆组件划算多了。