做简历问答的RAG,用bge-large-zh转向量,chunk按256字切、重叠32。测试集100道题,召回率只有62%,top5里经常混进完全不相关的内容。试过调chunk大小和重叠数,效果不明显。也试过混合检索(BM25+向量),涨了3个点但还是不理想。现在不确定是该换更强的embedding(比如gte或openai的),还是应该上rerank,或者直接改切分逻辑——比如按段落而不是固定长度切。有没有做过的朋友给点方向?另外,重排模型对中文长文档效果到底明不明显?
RAG的召回率一直上不去,是chunk切分问题还是embedding该换了?
全部回复
共 64 条简历这种短文本按256字切其实还行,但固定长度切容易把一段经历拆到两个chunk里,语义直接断了。建议先试试按项目/教育背景这种自然段落切,再在每段前面拼上岗位或技能关键词。重排对中文长文档效果挺明显的,尤其你top5混进不相关内容的场景,bge-reranker-base就能拉不少。不过62%的召回,感觉更可能是query和简历表述差太远,可以试试用LLM把问题改写成简历里常见的说法再检索。
简历问答这个场景,固定长度切分确实容易把一段完整经历切碎,试试按段落或项目条目切,效果可能比调重叠更明显。bge-large-zh其实够用,换gte提升有限,不如先加个bge-reranker,中文长文档上重排一般能涨5到10个点,但前提是召回阶段别漏太多。另外你top5混进不相关内容,可能是query和简历表述差异大,加点关键词扩展或query改写会更有帮助。
简历场景我踩过类似的坑,62%这个数其实不算离谱,但问题大概率不在embedding本身。bge-large-zh对中文短文本已经够用了,换成gte或者openai提升可能也就两三个点,性价比不高。真正卡你的应该是切分逻辑——简历天然是结构化的,按256字硬切很容易把"技能"和"项目经历"切到同一个chunk里,向量自然糊。建议你先按段落或模块切,再针对每段做语义压缩,召回会干净很多。另外你说的top5混进不相关内容,这其实是排序问题不是召回问题,rerank在这时候特别值。中文长文档上bge-reranker效果挺明显,我实测能提十来个点,但前提是召回阶段别把正确内容漏掉。混合检索涨3个点说明关键词那路有帮助,可以再调调BM25的权重。还有个容易忽略的点,你的测试集100道题是怎么构造的?如果query本身跟简历原文措辞差太远,再好的模型也救不了。
简历这种结构化文本还用固定长度切分确实容易把完整信息切碎,建议先改成按语义段落切,每段加个字段标题前缀再embedding,信息密度会高很多。另外62%的召回率top5还混无关内容,八成是embedding对简历里那些专业术语和缩写不敏感,换个gte或bge-m3试试,能涨不少。rerank对中文长文档效果挺明显的,但你这场景chunk本身就不长,优先把检索源头弄干净比后置重排更划算,不然重排也是在垃圾里挑。