最近在搭一个内部知识库的RAG问答,用的bge-m3做embedding,chunk_size设的512,overlap设了64,检索用的faiss。但测试下来发现很多query召回的前几个chunk跟问题完全无关,比如问“报销流程”结果召回的是“考勤制度”里的内容。我查了相似度分数,Top1和Top5差距也不大,感觉模型根本没区分出来。想问下这种情况一般是分块策略的问题,还是说bge-m3本身就不太适合这种垂直领域的短文本匹配?另外有没有必要上重排模型,还是说先用BM25混一下召回就能改善?
RAG检索老召回不相关内容,是分块问题还是embedding模型选错了?
全部回复
共 106 条先别急着换embedding,你这chunk切法问题更大,512太长语义早散了,试试128加重叠20。
说实话我觉得你这情况更像分块和检索策略的问题,bge-m3本身在短文本上不至于这么拉胯。512的块在垂直领域里可能把多个主题揉一起了,试试调小到200-300,overlap降到32,让每个块语义更聚焦。另外faiss只用向量召回确实容易漏,BM25混个RRF融合基本是标配,重排倒是可以后面再上,先看混合检索能不能把分数差距拉开。
说实话我觉得这情况大概率不是bge-m3的锅,你试试把chunk_size调小到256甚至128,overlap保持32左右,很多内部知识库的段落本来就短,512切出来一个chunk里可能混了三四个不同主题,语义被稀释了。另外垂直领域术语多,通用embedding确实容易懵,但先别急着换模型,你可以拿几个典型bad case去跑一下bge-m3的句对相似度,看看是不是query和chunk的表述差异太大。重排模型肯定有用,不过你现在的瓶颈更像是在召回源头,建议先做一轮query改写或者加个关键词过滤,BM25混召回也能兜底,但别指望它能解决语义偏差。
bge-m3对垂直领域短文本确实容易飘,先试试把chunk调小到256,overlap降到32,大概率能好不少。
大概率是分块把不同主题揉一起了,试试缩小chunk到256或按章节切,重排模型真没必要先上。
说实话我觉得你这情况分块的可能性更大,512对垂直领域短文本来说太长了,一个chunk里塞了好几个主题,bge-m3再强也分不清该跟谁对齐。你可以先试试把chunk_size降到200左右,overlap保持32,看看召回质量有没有明显变化。另外BM25混合召回确实值得先加上,毕竟关键词匹配在垂直场景里经常比纯向量靠谱,重排模型可以等基线稳定了再考虑,不然调参都分不清是哪个环节的问题。