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