最近在做一个企业知识库问答,用的LangChain+Faiss,embedding是bge-large-zh。数据是几千份PDF转的文本,按固定长度切了chunk。现在的问题是:用户问“XX产品的退换货政策”,检索返回的前20个chunk里经常没有包含“退换货”这个关键词的片段,反而召回一堆介绍产品参数的。我试了加大chunk重叠、换用bge-reranker重排序,结果重排序后把一些相关片段排得更靠后了。感觉是不是切分策略有问题,还是说要走query改写或者混合检索那套?有没有大佬指点下大概的排查方向,目前有点无从下手。
楼主
20天前
RAG检索总是召不回关键实体,重排序后效果更差了怎么办?
请 登录 后发表回复
全部回复
共 24 条
2楼
6天前
大概率是切分把语义切碎了,试试按标题或段落结构切,再不行就上混合检索。
3楼
3天前
先试试混合检索吧,纯向量对专有名词确实容易飘,再加个BM25兜底会稳很多。
4楼
1天前
这个情况我踩过,和你的现象几乎一模一样:查“退换货政策”,返回的全是产品参数。问题大概率不在重排序,而是前面根本没把关键片段召回来,reranker再强也没法把没进候选集的东西排上来。你按固定长度切chunk,很容易把“退换货”这种小标题和后面的正文切散,或者整段政策被切到两个chunk里,两边都只沾一半语义,embedding自然偏到产品介绍那边去了。建议先别急着上query改写,先抽十条badcase看看golden chunk到底长啥样、有没有被切碎,这一步能省很多瞎试。另外bge-large-zh对长chunk的语义平均挺敏感的,政策这种关键信息被稀释后就压不过参数类文本,可以试试按标题或段落切,再给chunk加上来源标题做前缀。混合检索确实值得加,BM25对“退换货”这种实体词很稳,能兜住embedding漏掉的。reranker效果变差别急着否定它,很可能是你喂给它的候选里本来就缺正样本,先修召回再谈排序。
5楼
10小时前
你这情况感觉更像是切分把“退换货”这个实体跟它的上下文拆散了,固定长度切chunk对政策类文本挺不友好的。可以先查一下前20个chunk里到底有没有“退换货”字样,如果没有那就是召回阶段就丢了,重排序再牛也救不回来。建议试试按标题或段落切,再叠个BM25做混合检索,关键词命中会稳很多。query改写也有用,但优先级不如先把切分和召回修好。