最近在做企业内部文档的RAG问答,用bge-base做embedding,top20召回后想用微调过的LLM做rerank。我拿了几百条人工标注的query-文档对,用LoRA微调了Qwen2-7B,loss是降了,但上线后一看,rerank后的top5准确率比直接用bm25还低。
RAG场景下微调LLM做rerank,效果反而变差了,哪里出问题了?
全部回复
共 186 条几百条样本对7B模型来说太少了,LoRA微调容易过拟合到训练分布,泛化不行。
微调loss降不代表排序效果好,建议直接用交叉编码器或者换个排序损失试试。
几百条数据微调7B做排序,过拟合了吧,排序任务小模型反而更稳。
几百条数据微调7B做rerank,这个量级其实挺悬的。LoRA loss降了不代表排序能力学到了,很可能只是过拟合了标注里的表面模式。你评估的时候是用pointwise打分还是pairwise/listwise?如果只是让模型输出相关性分数,训练目标和rerank的排序目标其实是对不齐的。bge-base的top20召回质量也值得先看一眼,如果召回里压根没多少正例,后面再怎么排也救不回来。
几百条数据微调7B做rerank,这个量级有点悬,模型很容易学到标注里的噪声或者表面模式,loss降了但泛化崩了。而且你是拿pointwise的标注去训生成式LLM吗,那打分尺度和排序目标其实对不齐,输出的分数可能根本不可比。建议先别急着上LLM rerank,用bge-reranker这种专门做cross-encoder的模型在同样数据上跑个baseline,很可能效果就够用了。真要微调LLM的话,至少上千条起步,而且最好用listwise或者pairwise的构造方式。
loss降了不代表排序能力就上去了,很可能你的训练目标是生成式的,模型学的是复述文档而不是打分,输出概率跟相关性根本不是一回事。几百条数据对7B的LoRA来说也太少了点,容易过拟合到标注风格上。建议试试用pointwise或pairwise的排序loss来训,或者干脆先拿个cross-encoder在同样数据上跑个baseline对比下,看是数据问题还是方法问题。
几百条标注微调7B做rerank,这个数据量我感觉是核心问题。pointwise的rerank本质是让模型学一个很精细的相关性打分,几百条样本对7B来说太少了,LoRA也救不了,模型大概率只是学到了你标注数据里的表面模式,比如query和doc有词重叠就打高分,泛化基本没有。你说loss降了但效果差,这太典型了,loss降不代表排序能力提升,尤其如果标注里正负样本比例失衡或者负样本太好区分,模型学到的就是个偷懒的捷径。
还有个容易踩的坑是训练和推理的输入格式不一致。你微调的时候query和doc是怎么拼的?有没有加instruction?推理时用的prompt跟训练时一模一样吗?rerank对prompt格式特别敏感,差一点分数分布就全乱了。另外LLM rerank出来的分数是生成式的,不像cross-encoder那样有稳定的相关性logit,你可能得考虑用yes/no的logit差或者专门训一个打分头,直接让模型生成分数很不靠谱。
我建议先别急着上LLM,拿bge-reranker-base这种专门的cross-encoder跑一遍baseline,大概率比你微调的7B强。真要上LLM,至少得几千到上万条高质量pair,而且负样本要hard negative,从bm25和embedding召回里挖那种看着像但不相关的。