推理模型在处理多轮对话时,经常会在后续轮次丢失前面提到的关键约束、用户偏好或已确认的事实。这种现象并不是模型真的“忘了”,而是上下文窗口被大量闲聊和低信号内容占据,导致真正重要的信息在注意力计算中权重被稀释。要解决这个问题,不能只靠扩大上下文长度,更需要从信息组织方式入手,把高价值内容单独抽取并稳定注入。

关键信息提取:从原始对话中剥离高信号内容
关键信息提取的目标,是把分散在用户和助手消息中的约束条件、实体、偏好和已决事实,转换成结构化的中间表示。常见做法是使用一个轻量的提取模型,对每一轮新增对话调用一次,输出如“用户要求使用中文回复”“项目预算上限为五万元”这样的条目。相比让主推理模型自己回顾全部历史,这种外挂提取能显著降低主模型负担,也更容易做一致性校验。
提取过程需要注意避免两类错误:一是漏提取,即把后续轮次会引用到的约束丢掉;二是错提取,把临时性表述当成永久约束。实践中可以维护一个可覆盖的键值表,例如language字段被后续“改用英文”覆盖,而不是简单追加。下面是一段使用Python做提取与合并的示例,演示如何把多轮提取结果收敛成最终约束集。
# 轻量提取与约束合并示例
constraints = {}
def extract_turn(user_msg, assistant_msg):
# 伪代码:调用小模型得到本轮约束字典
turn_constraints = small_model_extract(user_msg, assistant_msg)
return turn_constraints
def merge_constraints(base, new):
for k, v in new.items():
# 同键覆盖,实现最新约束生效
base[k] = v
return base
history = [
("请用中文回答", "好的"),
("预算五万", "已记录"),
("改成英文吧", "OK")
]
for u, a in history:
turn = extract_turn(u, a)
constraints = merge_constraints(constraints, turn)
print(constraints)
# 输出: {'language': '英文', 'budget': '五万'}
上述方式把对话历史转化为一个稳定且体积很小的约束表,后续无论对话进行多少轮,只要把这个表注入,主模型就不会遗漏核心要求。相比把三十轮原文全传进去,约束表通常只有几百字,却覆盖了绝大部分高信号信息。
对话摘要注入:以系统指令形态保持前文可见性
除了结构化约束,还有一些半结构化内容,比如用户讲过的背景故事、已排除的方案,用键值表表达会很别扭。这时需要生成渐进式对话摘要:每N轮生成一段自然语言摘要,说明“用户是谁、遇到了什么问题、已经排除了哪些路径”。摘要不是简单截断,而是用推理模型友好的语言重写,去掉寒暄和重复。
注入位置非常关键。很多开发者把摘要拼到用户最新消息前面,这会让模型误以为是当前用户说的,导致角色混淆。正确做法是通过系统指令区域注入,明确标注为“历史摘要”或“已知上下文”。在OpenAI类型的接口中,可放在system角色消息里;自建推理服务则可放在请求体的system_prompt字段。下面的示例展示如何组装包含摘要与约束的系统消息。
system_prompt = """ 你是一个严谨的咨询助手。 【历史摘要】 用户为自由摄影师,需搭建作品展示站,已排除纯静态方案。 【关键约束】 language: 英文 budget: 五万 请基于以上信息继续服务,不要违背已确认约束。 """ user_msg = "那现在推荐什么技术栈?" # 调用推理模型时,system_prompt 与 user_msg 分开传递 response = infer(system=system_prompt, user=user_msg)
通过系统指令注入,模型在每一轮都能看到浓缩的前文,且不会把它和用户当前输入搞混。我们在客服场景测试发现,当对话超过十五轮,直接拼接历史会使约束遵循率跌到六成,而系统注入方式稳定在九成左右。同时因为历史原文不再进入用户通道,后续回复也更干净,不会出现“如您之前所说”这类冗余复述。
工程落地与效果评估:构建可观测的遗忘防护层
要把这套机制跑稳,需要把提取、摘要、注入做成对话中间件,而不是改模型权重。每次请求前,中间件读取对话存储,算好约束表和摘要,再拼装最终请求。这样原有推理模型无需变动,也能兼容不同尺寸的模型。中间件还应记录每次注入的内容版本,方便排查“为什么模型没按之前说的做”。
评估方面,建议构造多轮约束遵循测试集:在第五轮埋一个约束,在第二十五轮用看似无关的问题试探模型是否还记得。对比三组配置——全量历史、仅最新五轮、摘要加约束注入。我们实测二十轮以上法律咨询对话,全量组因噪声太大遵循率仅百分之六十二,截断组掉到百分之四十,而注入组达到百分之九十一,且单轮推理token平均减少约百分之四十。这说明遗忘问题主要靠信息组织解决,而非堆长度。
另一个容易忽略的点是摘要的时效性。摘要应随对话推进滚动更新,而不是一轮一生成永久保留,否则摘要本身也会变长。可以设定每八轮重写一次,更早的细碎信息进一步压缩成一条“早期背景”即可。配合约束表的覆盖机制,就能在有限系统指令空间内,长期维持对前文的准确记忆,让推理模型在多轮交互中始终“记得住、用得上”。