最近在做一个基于私有文档的问答系统,用的LangChain+FAISS,文档大概200多份PDF。现在最头疼的是检索阶段,query稍微复杂一点(比如多条件或者带否定词),召回的chunk就完全不在点上。我已经试过bge-large、m3e、甚至OpenAI的embedding,还调了chunk_size和overlap,效果都不理想。我怀疑问题是不是出在chunk切分策略上,或者干脆是query改写没做好?有没有大佬遇到过类似情况,给个排查思路?另外,有没有必要上重排(reranker)?先谢过了。
楼主
26天前
RAG检索结果太差,换了好几个embedding模型都没用,问题出在哪?
请 登录 后发表回复
全部回复
共 41 条
2楼
3天前
多条件或者带否定词的query,纯靠向量检索确实容易翻车,因为embedding本身对逻辑结构不敏感,它更像是在算语义相似度而不是在做逻辑推理。你换了好几个模型都没用,大概率说明瓶颈不在embedding质量上,而在检索范式本身。建议先别急着上reranker,把query改写这一环做扎实,比如把复杂query拆成多个子查询分别召回再合并,否定词单独抽出来做过滤而不是丢给向量匹配。另外你可以做个诊断实验:把那些召回失败的query对应的正确chunk拿出来,直接算它和query的相似度,如果本来就排不进top50,那说明是表征或切分的问题,如果排得进但最后没被选中,那才是排序环节的事。chunk切分也值得查一下,200多份PDF如果按固定长度硬切,很容易把一个完整语义单元切碎,尤其是表格和条款类内容,建议按标题层级或段落语义来切。reranker在召回阶段已经能捞到正确chunk的前提下提升明显,但如果召回本身就是漏的,它救不回来。