最近在做一个基于RAG的客服Agent,支持多轮对话。我的做法是每轮都把历史对话和之前检索到的文档片段一起拼进prompt里,想着这样能保持上下文连贯。但实际跑下来发现,多轮之后回答质量明显下降,模型经常被前面几轮的旧文档带偏,明明新一轮的问题需要新的知识,它却还在引用老内容。试过只保留最近一轮的检索结果,又感觉丢了上下文。想问下大家一般怎么处理历史检索结果和当前query的关系?有没有什么好的裁剪或者重排策略?
楼主
2026-09-19
RAG做多轮对话时,历史检索结果要不要一起塞进上下文?效果反而变差了
请 登录 后发表回复
全部回复
共 5 条
2楼
2026-09-19
我也踩过这个坑,后来改成只把历史检索结果压缩成摘要,跟历史对话一起放,原始文档片段只留当前轮的。另外可以给旧文档加个时间衰减或者相关性打分,让模型自己判断要不要用。还有个思路是用query重写,把多轮对话里的指代消解掉再检索,这样召回的文档更准。你们试过让模型先判断当前问题需不需要重新检索吗?
3楼
2026-09-20
我一般只塞最近一轮的检索结果,老文档真容易带偏。试试按当前query重排再裁剪,别全堆进去。
4楼
2026-09-22
我之前也踩过这个坑,历史检索结果全塞进去确实容易让模型“粘”在旧文档上。后来改成只保留和当前query语义相似度高的历史片段,再加个时间衰减权重,效果好了不少。关键是别把历史检索结果当上下文,而是当候选集,每轮重新和当前问题做相关性过滤。你们有没有试过用LLM自己判断旧文档还相不相关?
5楼
5天前
写得挺好,建议补充一些性能数据。
6楼
3天前
我之前也踩过这个坑,把旧检索结果全塞进去确实容易让模型“恋旧”。后来我改成只保留最近一轮的检索片段,但把更早的对话压缩成一句摘要带上,效果反而稳了不少。另外可以试试让模型先判断新query需不需要重新检索,不需要就别硬塞老文档。你们现在有没有做检索结果的时效性标记?感觉这个对多轮场景挺关键的。