最近在搭一个基于RAG的Agent,用来处理企业内部文档问答。用的是LangChain+OpenAI,检索层用的faiss,切片长度设了512。单轮问答效果还行,但一旦对话轮次超过3-4轮,Agent就开始乱引用或者直接编造答案,感觉像是上下文窗口把检索结果给“冲淡”了。尝试过把历史对话也塞进检索query里,但效果不稳定,有时候反而把无关内容拉进来。想问问大家:这种多轮场景下的RAG Agent,怎么设计记忆和检索策略才能不“失忆”又不“跑偏”?有没有现成的实践或者trick可以分享?先谢过各位大佬。
楼主
2026-07-19
RAG+Agent做知识问答,上下文一长就乱答,怎么破?
请 登录 后发表回复
全部回复
共 145 条
2楼
2026-09-18
可以试试把多轮历史做摘要压缩,别原样塞进query里,不然噪声只会越滚越大。检索那块我一般会把当前问题和最近一轮对话拼起来做query,更早的用摘要补充,这样召回准很多。另外faiss切片512可能偏大,换个300左右再加重排,能明显减少乱引用。LangGraph那套state管理配合summary memory挺适合这种场景,值得折腾一下。
3楼
2026-09-19
我之前也踩过这个坑,后来把历史对话用summary压缩成一段短摘要再拼进prompt,比直接塞原始对话稳很多。另外检索这块可以试试多路召回加rerank,别让faiss单独扛,长上下文里噪声一多模型就容易编。还有个思路是把每轮检索结果单独标记来源,让模型回答时强制引用编号,能压住一部分乱引的问题。
4楼
2026-09-21
这个坑我踩过,后来发现根子往往不在检索,而在历史对话怎么进prompt。你直接把整段对话塞进去,检索结果确实会被噪声稀释,模型注意力也跟着散。我的做法是给记忆分层:最近一两轮保留原文,更早的轮次压成一句“已确认事实”或者结构化槽位,别让原始闲聊占token。检索query那块也别硬拼历史,试试用一个小模型先把当前问题改写成独立query,再带上关键实体去搜,比整段拼接稳很多。另外faiss的512切片在多轮里容易丢上下文,可以试试按语义段落切,或者检索后加一层rerank,把真正相关的chunk挑出来再喂给Agent。还有个trick是让Agent在回答前先显式列出“我依据的是哪几条检索结果”,逼它对齐来源,编造会少一些。你们内部文档如果结构比较规整,甚至可以跳过纯向量,走关键词加向量的混合检索,多轮下召回会干净不少。
5楼
2026-09-22
历史对话别全塞进query,改成只带最近一两轮加个摘要,检索用独立query更稳。
6楼
5天前
这个思路不错,收藏了。