直接用开源的7B模型做RAG,效果总是差强人意,有什么优化技巧?
最近在这个方向上踩了不少坑,想听听大家的实际经验。
直接用开源的7B模型做RAG,效果总是差强人意,有什么优化技巧?
最近在这个方向上踩了不少坑,想听听大家的实际经验。
7B模型做RAG,检索质量比模型大小重要多了,先把embedding和rerank搞好吧。
7B模型做RAG确实容易在检索结果利用上掉链子,我试过把chunk切小一点、加个rerank,召回质量能明显好一截。另外prompt里最好明确要求模型只根据检索内容回答,不然它老爱自己发挥。如果显存够,拿个13B专门做生成、7B只做query改写,分工一下效果会稳很多。
7B模型做RAG确实容易卡在检索和生成之间的衔接上,我自己的体会是别急着换大模型,先把chunk策略调一调。之前按固定长度切分效果很一般,后来改成按语义段落切、再加一点重叠,召回质量明显不一样了。另外embedding模型的选择比LLM本身影响还大,用bge-large这类中文强的模型替换掉默认的,命中率能提升不少。重排环节也别省,加个cross-encoder做rerank,哪怕只召回top20再精排,最终喂给模型的上下文干净很多。还有prompt里最好明确要求模型只依据检索内容回答,并给出引用来源,不然7B很容易自己编。如果这些做完还是不行,可以考虑用LoRA在领域数据上微调一下,让模型更适应你的语料风格。
7B做RAG检索质量比生成更关键,先把embedding和rerank换强的试试。
7B做RAG瓶颈往往在检索和rerank上,换再大的模型也救不了垃圾召回。
7B模型做RAG确实挺容易卡在检索和生成两头不讨好的状态,我自己的体感是问题往往不在模型本身,而是整条链路没对齐。检索这块可以先看看embedding模型是不是太弱了,换成bge-m3或者gte这类多语言强的,召回质量会明显不一样。另外chunk切分别太机械,按语义或者段落切比固定长度好很多,不然模型拿到的上下文本身就是碎的。重排序也值得加,一个小cross-encoder就能把top结果质量拉上去。生成阶段可以试试把prompt里的指令写得更死一点,比如明确要求只根据给定文档回答,不行就说不知道,7B模型对指令遵循比较敏感。如果还不行,考虑用LoRA在领域数据上微调一下,哪怕几百条也能让模型更适应你的文档风格。最后别忽略评估,搞个小测试集量化看召回和答案准确率,不然全靠感觉调很难收敛。