本节摘要:本节兑现 2.1 节留下的那行抛错——"驱逐后仍超预算:该触发压缩了"。先划分工:驱逐丢的是可重取的内容,日常超支的止血带;压缩把历史重构成摘要,结构性不够用时的重构手术——触发条件四条:水位达上限八成、驱逐后仍超、轮次阈值、任务阶段切换(均为示意)。不可丢清单继承 2.1 节:pinned 四项 + 最近 K 轮 + 输出预留,压缩再狠也不碰。可丢的是历史主体,产出形态是五栏结构化任务简报:任务目标 / 已确认事实 / 已做决策 / 未决问题 / 关键引用——替代旧历史占据窗口前部(2.2 节高熵内容靠前)。但摘要必有损失:过程怎么试错的、否定信息("X 方案不行")、语气与情绪线索常被摘掉,代价是重走弯路与丢失用户情绪;缓解三招:分级压缩、原文外存可回查(offloading,Deep Agents 已将其与 summarization 做成内置原语,官方)、压缩后自检。实现上自摘要与模板抽取互补。
阅读完本节,你应当能够:
2.1 节的驱逐是"丢可重取的内容":旧工具结果、已完成子任务的历史、环境快照——丢的东西世界还在,需要时能拿回来。压缩是另一回事:把不可重取的历史本身重构成更小的形态。两者的关系:
| 驱逐(2.1) | 压缩(本节) | |
|---|---|---|
| 对象 | 可重取的素材与过程 | 不可重取的历史主体 |
| 可逆性 | 可逆(重新获取即可) | 有损(原文搬出窗口) |
| 频率 | 日常(每轮审计都可触发) | 低频(有指征才动刀) |
| 成本 | 零额外调用 | 一至多次模型调用(生成摘要) |
| 定位 | 止血带 | 手术 |
触发条件四条(阈值均为示意,应按任务调参):
ce_budget.py 抛错的那一行——驱逐的救济已用尽,说明是结构性超支。⚠️ 最坏的选择是"永远不压缩、靠 API 硬截断":截断从最旧开始切,切掉的恰好是任务原文与红线约束——等于把驱逐顺序交给最不懂优先级的一方。
压缩的对象是历史主体,但历史里有几块是禁区,一块都不能进摘要:
一个自检动作:压缩完成后,只拿简报问模型"当前任务是什么、红线是什么"——答得出,压缩合格;答不出,禁区被误伤了,回滚。
禁区之外的历史主体是压缩的原料。产出不是一段散文摘要,而是结构化任务简报——五栏定式:
system_prompt.md 追加 —— 任务简报模板(写法示意) [任务简报](由第 1~35 轮压缩,第 36 轮起生效) · 任务目标:用户要求对订单 88880 发起部分退款(金额 320 元),保留会员权益 · 已确认事实:订单为二手商品;用户 09-18 20:47 签收;政策 v8 第 3 条适用 · 已做决策:退款原因归类为"质量报障"(依据第 3 条但书);金额已与用户核对 · 未决问题:等待 get_refund_status 返回工单号;用户询问优惠券是否退回(查第 5 条) · 关键引用:《退款政策》v8 第 3、5 条已注入过(需要时重新检索)
一份 35 轮约 18k token 的历史,压成简报约 1.5k(示意),保留的是五栏里的高熵事实与决策。简报的落位:替代旧历史,放在系统提示与记忆区块之后、当前计划之前——2.2 节的位置模板里,这是窗口前部的高熵区;最近 K 轮原文与素材照旧摆在中后部。
压缩是有损的,而且丢的不只是长度。三类高发损失:
| 损失 | 例子 | 事故形态 |
|---|---|---|
| 过程 | "先用订单号查、查不到再用手机号"的试探过程被摘掉 | 模型在新一轮重复无效路径,浪费轮次与工具调用 |
| 否定信息 | "运费险方案不行(用户已用过一次)"被摘成"讨论过运费险" | 模型兴冲冲重提旧方案,用户体验直接崩塌 |
| 语气与情绪 | 用户三次表达不满的措辞强度被摘要抹平 | 客服 Agent 用轻快语气回复愤怒用户——该触发转人工而没触发 |
缓解三招:
⚠️ 警惕双重有损:对旧简报再做一次摘要,损失会复利。正确做法是"重生成"而非"摘要的摘要"——每次压缩都从原始历史(offloading 的外存里躺着)重新生成简报,而不是在上一版简报上打折扣。
| 实现 | 做法 | 适用 | 成本 |
|---|---|---|---|
| 自摘要 | 模型读历史生成五栏简报 | 自然语言对话(客服、探索式任务) | 一跳模型调用 |
| 模板抽取 | 代码从结构化字段拼装简报 | 结构化轨迹(工具调用记录、状态机日志) | 近零 |
| 混合 | 结构化部分模板抽取,寒暄与解释性对话自摘要 | 多数真实 Agent | 一跳,仅对非结构化部分 |
工具调用记录天然是结构化的(谁、调了什么、返回了什么码),模板抽取零成本且无损于关键字段;自然对话只能靠自摘要。两者拼起来,一份简报里"已确认事实"栏常来自模板、"未决问题"栏常来自自摘要。框架侧的对应物——消息裁剪与摘要节点——见 7.1 节的 compress 一行。
压缩让长会话活了下来。但每一次驱逐与压缩都在改写窗口——出事故的那天,你怎么向团队说清"模型当时到底看见了什么"?下一节给动态层装黑匣子:快照、diff 与版本号。