最近在做一个小型的RAG项目,用的开源embedding模型做检索,然后用GPT-3.5-turbo做生成。但发现召回的top5文档里经常混进去一些语义相近但实际不相关的片段,导致回答有时会“编”错。我尝试用lora微调了一个小一点的基座模型(7B)专门做rerank,训练数据是自己标注的几百条query+正负例对。
RAG场景下微调LLM做rerank,效果反而变差了,求助
全部回复
共 165 条几百条数据微调7B做rerank,大概率是数据量不够把模型带偏了,先试试用现成的reranker对比下baseline吧。
几百条标注数据训7B的rerank,感觉数据量确实有点悬,模型很容易过拟合到标注里的表面模式,泛化反而崩了。我之前也踩过类似的坑,后来发现rerank这活儿其实不一定非得微调大模型,先用cross-encoder那种小模型跑一版baseline,往往比硬训7B还稳。另外你标注的负例是怎么选的?如果是随机负例,模型学到的区分度会很弱,换成BM25或向量召回的hard negative效果差别挺大的。还有个点,rerank微调之后排序变了,但生成端还是原来那套prompt,可能排序变差和生成变差是两回事,得分开看。建议先固定生成模型,单独评测rerank的NDCG或者MRR,确认到底是哪一环掉的。如果非要用LLM做rerank,试试listwise的方式让模型直接输出排序,比逐条打分的pointwise有时候更符合直觉。
几百条数据微调7B做rerank,说实话量有点不够,模型很容易过拟合到标注风格上,反而把原来embedding的泛化能力带偏了。我之前也踩过类似的坑,后来发现先用LLM对top20做zero-shot打分重排,效果比硬微调稳不少。你检查过微调后模型在验证集上的排序指标吗,还是只看最终生成质量?另外正负例的构造方式也很关键,如果负例太容易区分,训出来的模型实际场景基本没用。
刚入门,这个对我帮助很大。
几百条数据微调7B模型做rerank,感觉数据量可能不太够,容易过拟合到标注的偏好上。我之前也试过类似方案,后来发现先把embedding模型换掉或者加个BM25混合检索,效果提升比微调rerank更明显。另外可以看看负例是怎么采的,如果是随机采的简单负例,模型学不到细粒度区分,试试用top-k里的难负例。