Chapter 14 · 多轮对话保真度
单轮 prompt 工程已被研究透了,但多轮对话还有大量未解问题:上下文爆炸、指令漂移、记忆遗忘。这一章给出现役方案。
Item 39:每 N 轮重注入关键约束
系统约束会随轮数被冲淡。
核心
Lost in Conversation(arXiv:2505.06120)发现 8 轮以后模型对 system prompt 的依从性显著下降。修复方案:每 5-10 轮在用户消息前自动重注入关键约束("你是客服助手,禁止承诺退款")。
Things to Remember
- 长对话每 N 轮重注入 system prompt 的关键约束。
- 关键约束 ≠ 完整 system prompt——只重注入业务红线。
- 监控指标:跨轮约束违反率。
Item 40:用 summary-then-continue 防上下文爆炸
200k 窗口也撑不住一周对话。
引子
随对话进行,上下文要么变长(成本爆炸 + Lost in Middle)要么被截断(关键事实遗忘)。MemGPT(arXiv:2310.08560)提出把 LLM 当 OS:上下文是 RAM,分页换入换出长期记忆。当对话历史超过阈值,用 LLM 总结历史 → 把摘要替换原文 → 长期记忆存入向量库供检索。
Sidebar:MemGPT 的内存分层
MemGPT 把内存分为 main context(高频访问、占 token 预算)和 external context(低频、按需检索)。这是 1970 年代 OS 虚拟内存对 LLM Agent 的直接复刻——模型自己执行 page_in / page_out 函数调用,把"哪些事实重要到该常驻上下文"的决策交给模型。
反例 vs 正例
python
# Bad — 上下文无限增长
messages = [system] + history + [user] # history 超 100 轮直接爆
# Good — 摘要换入
if total_tokens(history) > 8000:
summary = llm.summarize(history[:-10]) # 老的部分摘要
history = [{"role": "system", "content": f"摘要:{summary}"}] + history[-10:]Things to Remember
- 对话历史超阈值时摘要替换,关键事实存入向量记忆。
- 摘要必须保留实体名 / 数字 / 用户偏好等具体事实。
- 长期记忆按 user_id 分桶——多租户应用必须隔离。
延伸阅读
- MemGPT(arXiv:2310.08560)—— 把 LLM 当 OS 来用:上下文是 RAM、向量库是磁盘,模型自己调用
page_in/page_out函数管理记忆,突破上下文窗口的硬限制。 - LongMemEval(arXiv:2410.10813)—— 长期记忆能力评测基准:覆盖信息抽取、多跳推理、时序更新、知识冲突、拒答五类任务,专门检验跨会话场景下的真实记忆表现。