最近在做一个企业知识库问答,用的faiss+openai embedding,chunk大概300字左右。发现一个问题:问“合同违约金怎么算”,检索出来的前几段都是泛泛介绍合同条款的,真正写着“违约金按日万分之五”那一段反而排到了第7、8位。我试过调top_k,但拉高了噪音也变多,回答经常张冠李戴。后来看有人说要加rerank,也有人说是chunk重叠和embedding模型没选对的问题。想请教下大家,这种“关键词很具体但语义很泛”的query,到底该怎么调?是换bge-m3还是上混合检索(BM25+向量),或者干脆先做一层意图分类再选路由?有点迷茫,求指路。
楼主
14小时前
RAG检索老是把关键信息排到很后面,是不是我向量化方式有问题?
请 登录 后发表回复
全部回复
共 1 条
2楼
13小时前
说实话你这个情况我太懂了,之前做合同审核问答也踩过一模一样的坑。问题大概率不在chunk大小,而是openai embedding对“违约金”这种强领域术语的语义捕捉太弱,它把“合同条款”和“违约金计算”都映射到相近向量空间了,所以排序自然就偏。我后来试过bge-m3,确实比openai效果好一截,但也没完全解决,因为单靠向量检索本质上就偏语义而轻关键词。你那个“日万分之五”是典型的高频实体词,BM25能精准命中,所以我建议直接上混合检索,faiss召回top50再用BM25的分数做加权融合,或者反过来,效果立竿见影。至于rerank,我觉得是锦上添花,但如果你现在连检索结果都乱,先别急着上重排,不然就是在一堆烂结果里挑相对不烂的。另外你可以试试把query做一下轻量改写,比如把“违约金怎么算”拆成“违约金 计算方式 日万分之五”,强制让embedding关注数字和比例词。我现在的方案是bge-m3+bm25加权,再加一个cross-encoder做最后过滤,已经稳定跑了两周,基本没再出现关键信息沉底的情况。你先别纠结意图分类路由,那是大厂做多业务线才需要的复杂度,你单场景用不上。