最近在做一个客服场景的RAG Agent,单轮问答效果还行,但一到多轮就崩。比如用户先问“你们的退款政策是什么”,接着问“那超过7天还能退吗”,第二句检索出来的文档完全跑偏。我试过把历史对话拼成query再去检索,但发现长对话时噪声太大,检索质量反而下降。也试过只保留最近两轮,但遇到指代消解又不够用。想问问大家在实际项目里是怎么处理多轮RAG的上下文注入的?有没有比较稳的工程方案,还是说得上query改写模型?
最近在做一个客服场景的RAG Agent,单轮问答效果还行,但一到多轮就崩。比如用户先问“你们的退款政策是什么”,接着问“那超过7天还能退吗”,第二句检索出来的文档完全跑偏。我试过把历史对话拼成query再去检索,但发现长对话时噪声太大,检索质量反而下降。也试过只保留最近两轮,但遇到指代消解又不够用。想问问大家在实际项目里是怎么处理多轮RAG的上下文注入的?有没有比较稳的工程方案,还是说得上query改写模型?
我之前也踩过这个坑,后来发现关键不在塞多少历史,而在于先做指代消解再检索。比如“那超过7天还能退吗”这种,得先把“那”还原成“退款政策”,再拼query,不然检索词根本对不上。我现在的做法是轻量query改写模型加最近一轮对话,改写只负责补全指代和省略,不把整段历史灌进去,噪声小很多。长对话可以再加个滑动窗口摘要,但别直接拼原文,不然向量空间会被稀释。