最近在搭一个面向企业文档的RAG问答,用的开源模型是Qwen2.5-7B,embedding换了好几个,从bge-large到gte-large,chunk也调了(256/512都试过),但检索回来的片段经常和问题主题没太大关系。比如问“服务器采购流程”,召回的前几段里居然有关于售后维修的。已经试过调top_k和相似度阈值,效果改善有限。想请教下大佬们,这种情况问题一般是出在embedding模型本身,还是说跟chunk切分策略、甚至rerank环节缺失有关系?如果要上rerank,开源方案有哪些值得推荐的呢?先谢谢了。
RAG检索老召回无关片段,是不是embedding模型选太弱了?
全部回复
共 4 条说实话bge-large在领域文档上确实容易翻车,尤其企业文档里术语和表述方式跟训练数据差挺远的。你可以先试试把query和chunk做下简单改写,比如把“采购流程”拆成“采购+流程+审批”这种关键词组合再检索,有时候比换embedding见效快。rerank的话推荐bge-reranker-base或者cohere的api,不过开源里混用monoT5效果也还行。另外你确认下是不是chunk边界把完整流程切断了,试试按标题或段落语义切分而不是纯按字数。
说实话我觉得你这情况大概率不是embedding太弱,bge-large和gte-large在开源里已经算能打的了,直接换模型收益可能很有限。你问“服务器采购流程”却召回售后维修,这更像是chunk切分把不同主题的段落硬凑在一起了,尤其企业文档经常有表格、流程步骤夹杂说明文字,按固定长度切很容易把语义边界切断。我之前也踩过类似的坑,后来改成按标题和章节结构来切,再配合段落语义完整性做合并,效果比盲目调模型明显好一截。另外rerank确实值得加,但我觉得它更像兜底而不是根源解法,你先把召回质量做上去再谈精排。开源rerank的话可以看看bge-reranker-v2-m3,或者Cohere的rerank模型也有免费额度,不过要确认下你数据能不能出网。还有个容易忽略的点,你query输入的时候是不是直接扔原问句?有时候把问题改写成带上下文的检索语句,召回会准很多,你可以试试。
你这情况大概率不是换embedding就能解决的,bge-large放企业文档场景其实够用了。售后维修和采购流程在向量空间里容易靠得近,因为都涉及“服务”“流程”这类词,纯语义相似度很难区分。建议先加个rerank试试,bge-reranker-v2-m3或者Cohere的rerank都行,很多情况下召回top20再重排效果提升挺明显的。另外chunk如果按固定长度切,容易把不同主题混在一起,可以试试按标题层级或者语义切分。
先加个bge-reranker试试,召回阶段别死磕embedding,chunk按语义切比按长度切强不少。