这道题其实是在问多轮对话里,模型怎么保持记忆和状态的一致性。说白了,就是怎么让模型不忘了前面说过啥,还能准确理解用户指代的东西,并且回答的语气和立场不飘。我理解这三个问题是连在一起的,核心都在于模型缺乏显式的记忆和状态管理机制。
先说上下文遗忘。这个的技术成因其实很直接:标准Transformer的注意力机制,位置编码啊[[RoPE]]这些,距离越远衰减越厉害,所以早期信息天然就容易模糊。再加上推理时[[KV Cache]]长度受限,显存压力会逼你截断历史,导致最早的几轮直接丢了。还有一个问题是注意力稀释,序列太长,关键信息被噪声淹没,softmax输出趋近均匀分布。
那怎么解决呢?我倾向的做法是加显式记忆模块。你可以这么理解:把对话分成短期上下文和长期记忆,短期就是最近几轮,长期用摘要模型压缩成记忆向量,每轮显式去查询。这个思路其实跟[[检索增强]]有点像,但更聚焦在历史压缩上。举个例子,客服场景里用户先说“我上周买了个手机,订单号是123”,过了十轮又说“那个手机的退款流程怎么走”,这时候模型需要从长期记忆里准确召回“订单123”这个实体。用显式记忆,就能把订单号、状态这些关键信息存成结构化槽位,而不是让模型在原始文本里盲猜。
再一个是指代不清。这个问题本质是模型缺乏显式共指链接,全靠隐式注意力去猜。比如用户说“这个方案不行”,但前文提了好几个方案,模型就懵了。这里有个坑:如果只靠注意力,跨句指代很容易出错。所以我更倾向引入对话状态编码,类似DST的做法,用结构化槽位来追踪实体、意图和约束条件,把这些作为附加输入喂给模型。这样“这个方案”就能明确映射到最近被讨论的那个方案,而不是靠概率猜。
一致性缺失其实和指代不清一脉相承。模型没有持久化的角色或风格表示,每轮独立生成,语气和立场就容易漂移。比如客服一开始说“我们很抱歉”,过了几轮变成“这很正常”,用户就会觉得分裂。我推荐的做法是持久化角色[[嵌入]],学一个不随轮次更新的角色向量,和每轮输入拼接。这样模型每轮都知道自己是谁、在什么场景下说话。
最后说落地组合。我自己的判断是,显式记忆模块加分层注意力是性价比最高的组合。记忆模块解决“记什么”,分层注意力解决“怎么高效记”,先对话语做粗粒度交互,再对token细粒度计算,能有效降低长序列的复杂度。但这里有个前提:记忆模块的压缩质量必须高,否则摘要丢了关键信息,反而帮倒忙。常见失败场景是压缩太狠,把实体关系弄丢了,或者压缩太松,记忆向量变成噪声。上线我会特别关注压缩率和Recall之间的平衡,用一批标注好的历史对话做离线验证。
还有一个有意思的延伸点:最近有工作把记忆模块和[[Agent]]结合,让模型自己决定什么时候存、什么时候忘,而不是固定压缩策略。这个方向我觉得挺有潜力的,但复杂度也上来了。
所以整体上,我更倾向于把多轮对话的问题看成记忆和状态的管理问题,而不是单纯堆长上下文。架构上记忆模块和分层注意力打底,再根据场景需求叠对话状态追踪或角色嵌入,这样既稳又能灵活扩展。