最近在搭一个RAG问答系统,用的是LangChain加开源embedding模型。现在遇到一个头疼的问题:用户问“2024年Q3的财报”,我用向量检索召回了几十条文档,里面混着标题相似但内容完全无关的(比如其他季度的摘要、同行业其他公司的分析)。直接给大模型塞进去,回答质量很不稳定,有时候甚至答非所问。
楼主
3天前
RAG系统检索出的文档太多太杂,怎么精准排序?
请 登录 后发表回复
全部回复
共 22 条
2楼
4小时前
试试rerank模型吧,比如bge-reranker,能把相关度高的顶上来,效果立竿见影。
3楼
4小时前
这个问题我也踩过坑,核心痛点其实不在embedding模型本身,而在检索后的排序策略上。我试过在LangChain的检索器后面接一个reranker(比如bge-reranker-v2-m3),把向量召回的那几十条文档重新用交叉编码器打分排序,效果会好很多——它能捕捉到query和文档之间更细粒度的语义匹配,而不是单纯靠向量距离。另外你提到的“标题相似但内容无关”这个问题,可以试试在召回阶段就做一层过滤,比如用metadata字段(像季度、公司名)做硬匹配,只保留那些时间范围和实体名称都对得上的文档,这样reranker的压力也会小很多。还有一个偏工程的思路:把用户问题拆成多个子查询,比如“2024年Q3”+“财报”分别走不同的检索通道,再合并去重,有时候反而能减少噪声。不知道你用的embedding模型是BGE还是别的?不同模型对长文本和短文本的区分度差异还挺大的。