最近在搭一个企业级RAG系统,用的langchain框架,知识库主要是PDF和word文档。现在卡在embedding模型选型上,试了bge-large-zh和text2vec-base-chinese,感觉bge检索准确率稍高但推理速度慢,text2vec快一点但中文长文本分块后召回率有点拉胯。目前服务器是单卡T4,16G显存,想兼顾速度和效果,有没有老哥实际部署过?另外,如果混合使用不同embedding模型做多路召回,对后续rerank的延迟影响大吗?求分享踩坑经验,感谢!
RAG部署中embedding模型选型纠结,有实战经验的老哥来聊聊?
全部回复
共 188 条T4 16G这个配置我太熟了,之前公司内部知识库就是这么搭的。bge-large-zh其实有量化版本,用onnx或者tensorrt跑推理速度能提不少,精度掉得不多,你可以试试看,别死磕pytorch原生推理。text2vec长文本召回拉胯大概率是max_length设太短了,它默认才128,你改到512看看效果会不会好点。多路召回这事我踩过坑,不同embedding模型出来的向量空间根本不兼容,你没法直接拼在一起算相似度,得各自检索完再合并候选集,然后统一丢给rerank。延迟影响主要看rerank模型大小和候选数量,bge-reranker-base在T4上跑50个候选大概200ms左右,能接受。不过多路召回最大的问题不是延迟,是维护成本,两个模型都得部署、都得更新,后面换模型更头疼。建议先把单模型调优做到位,真不够用了再上多路,别一上来就搞复杂。
T4 16G的话bge-large其实能跑,但batch size得压到8以下,不然显存直接爆。我们线上最后选了bge-small-zh,效果比base掉得不多,速度翻倍,性价比高很多。多路召回混embedding模型这个思路可以,但rerank延迟主要看候选集大小,两路各top20拼一起再rerank,T4上大概多100ms左右,能接受。text2vec长文本确实拉,分块策略得调,试试按语义切别按字数切。
T4上bge-large确实慢,我后来换bge-small-zh-v1.5,速度翻倍效果掉得不多,你可以试试。
T4 16G这个配置其实挺尴尬的,bge-large-zh跑起来确实吃力,尤其你知识库文档一多,批量推理的时候显存和延迟都容易顶到天花板。我之前也用过text2vec-base-chinese,短文本还行,但PDF切出来的块经常五六百token,它那个max length撑不住,后面召回确实会掉。后来换成bge-small-zh-v1.5试了试,速度比large快不少,效果在中文场景下也没差太多,你可以拿一批badcase对比下。另外单卡T4上可以考虑用onnx或者tensorrt加速,bge-large的推理耗时会降一截,不一定非得换模型。多路召回混embedding这个事我踩过坑,主要是不同模型向量空间不一致,没法直接合并算相似度,得各自检索再融合,rerank阶段候选集翻倍延迟肯定涨,尤其cross-encoder本身就不快。建议先别急着上多路,把单路embedding加个好点的rerank模型调明白,收益可能更直接。
单卡T4跑bge-large-zh确实有点吃力,可以试试bge-small-zh或者m3e-base,中文短文本效果够用,速度能快不少。多路召回做rerank的话,延迟主要看你召回了多少条,两路各top20再合并去重,用bge-reranker-base在T4上大概多花一两百毫秒,能接受。我踩过的坑是别用不同维度模型混着来,向量库得分开建,不然管理起来很乱。
写得挺好,建议补充一些性能数据。
T4上跑bge-large确实吃力,我之前也是单卡T4,最后换成了bge-small-zh,速度提上来不少,召回率掉得不算明显,可以试试。多路召回这块,混两个embedding模型的话,向量维度不一样得分两套索引,检索阶段多一次查询还好,但rerank输入翻倍延迟确实会涨,T4上得掂量下。要是知识库文档量不大,其实可以先单模型跑通再考虑多路,别一上来就铺太大。
学到了,感谢分享!