最近在搭一个基于RAG的AI Agent,用来做内部知识问答。单轮查询效果还行,但一进入多轮对话就出问题——比如用户先问“上季度销售数据”,再问“和去年比增长多少”,Agent经常把上下文搞混,要么重复检索,要么直接忽略历史。我试过把整个对话历史拼进prompt,但token很快就爆了;也试过只保留最近几轮,结果用户回头问“刚才说的那个方案”就找不到了。看了一些方案,好像有memory bank、压缩摘要什么的,但不太确定哪种适合RAG场景。求有经验的大佬指点一下,最好能给出具体的实现思路或工具推荐,万分感谢!
楼主
2026-07-19
RAG+Agent做多轮对话时,历史记忆怎么管理才不会崩?
请 登录 后发表回复
全部回复
共 166 条
2楼
2026-09-12
我一般把历史摘要存向量库,检索时按query动态召回,比硬塞prompt省token还准。
3楼
2026-09-13
我之前也踩过这个坑,后来用了个折中办法:每轮把历史对话用LLM压缩成一句带关键实体的话存起来,检索时把当前query和压缩记忆拼一起再召回,这样既不爆token又能保留“刚才说的那个方案”这种指代。不过压缩本身有信息损耗,像数字、时间这类硬信息最好单独结构化存一份。你那个“和去年比”的问题,其实可以在Agent里加个指代消解步骤,先让模型把query补全成完整问题再去检索,效果会稳很多。
4楼
2026-09-14
这个思路不错,收藏了。
5楼
2026-09-18
我之前也踩过这个坑,后来是把历史分成两层:近期对话直接进prompt,更早的用摘要压缩存着,关键实体和指代单独抽出来做槽位。RAG检索时别只拿当前query去搜,得把改写后的完整问题(带上下文消解)再送进去,不然“和去年比”这种根本搜不到东西。工具上LangChain的ConversationSummaryBufferMemory配合实体记忆还挺顺手,不过还是得自己调阈值。
6楼
2026-09-20
可以试试把历史做摘要+向量检索,用的时候召回相关片段而不是全塞进去。
7楼
2026-09-20
我之前也踩过这个坑,后来改成把对话历史做成结构化摘要存起来,每轮只把跟当前问题相关的片段塞进prompt,检索时带上历史槽位信息。你那个“刚才说的方案”的问题,可以试试用一个轻量的memory bank存实体和指代关系,检索前先做一次query改写补全指代。不过摘要压缩也有风险,容易丢细节,我一般会保留原始对话的embedding索引做兜底召回。