6.1 何时压缩、丢什么


6.1 何时压缩、丢什么

本节摘要:本节兑现 2.1 节留下的那行抛错——"驱逐后仍超预算:该触发压缩了"。先划分工:驱逐丢的是可重取的内容,日常超支的止血带;压缩把历史重构成摘要,结构性不够用时的重构手术——触发条件四条:水位达上限八成、驱逐后仍超、轮次阈值、任务阶段切换(均为示意)。不可丢清单继承 2.1 节:pinned 四项 + 最近 K 轮 + 输出预留,压缩再狠也不碰。可丢的是历史主体,产出形态是五栏结构化任务简报:任务目标 / 已确认事实 / 已做决策 / 未决问题 / 关键引用——替代旧历史占据窗口前部(2.2 节高熵内容靠前)。但摘要必有损失:过程怎么试错的、否定信息("X 方案不行")、语气与情绪线索常被摘掉,代价是重走弯路与丢失用户情绪;缓解三招:分级压缩、原文外存可回查(offloading,Deep Agents 已将其与 summarization 做成内置原语,官方)、压缩后自检。实现上自摘要与模板抽取互补。

学习目标

阅读完本节,你应当能够:

  1. 说出压缩与驱逐的分工边界,列出压缩的四条触发条件。
  2. 默写压缩的不可丢清单,写出五栏任务简报模板。
  3. 列举摘要的三类信息损失,并为每一类配一个缓解手段。
  4. 在自摘要与模板抽取之间为自己的数据结构做选择。

一、压缩与驱逐的分工

2.1 节的驱逐是"丢可重取的内容":旧工具结果、已完成子任务的历史、环境快照——丢的东西世界还在,需要时能拿回来。压缩是另一回事:把不可重取的历史本身重构成更小的形态。两者的关系:

驱逐(2.1) 压缩(本节)
对象 可重取的素材与过程 不可重取的历史主体
可逆性 可逆(重新获取即可) 有损(原文搬出窗口)
频率 日常(每轮审计都可触发) 低频(有指征才动刀)
成本 零额外调用 一至多次模型调用(生成摘要)
定位 止血带 手术

触发条件四条(阈值均为示意,应按任务调参):

  1. 水位触发:总用量持续超过可用额度的 80%——留给突发长输出的缓冲开始被吃。
  2. 驱逐后仍超:ce_budget.py 抛错的那一行——驱逐的救济已用尽,说明是结构性超支。
  3. 轮次阈值:历史轮数超过 N(如 40 轮)即预防性压缩——不等撞线,在低峰期主动做。
  4. 阶段切换:任务从检索期转入执行期——探索过程的使命已结束,正是沉淀成简报的时机(2.1 节"早期探索对话的结论并入任务简报"的兑现处)。

⚠️ 最坏的选择是"永远不压缩、靠 API 硬截断":截断从最旧开始切,切掉的恰好是任务原文与红线约束——等于把驱逐顺序交给最不懂优先级的一方。

二、不可丢清单:压缩的禁区

压缩的对象是历史主体,但历史里有几块是禁区,一块都不能进摘要:

  1. pinned 四项(2.1 节):任务原文、当前计划、红线约束、关键引用——它们本来就是"摘要过了的东西",再压就是二次有损。
  2. 最近 K 轮原文(K 取 3~5,示意):近期对话的语气、措辞、未说完的话,摘要必丢;且模型需要原文才能接得上话。
  3. 输出预留(15%~25%,示意):它从来不是压缩的对象,而是压缩要保护的目标。

一个自检动作:压缩完成后,只拿简报问模型"当前任务是什么、红线是什么"——答得出,压缩合格;答不出,禁区被误伤了,回滚。

三、可丢什么与压缩的产出:五栏任务简报

禁区之外的历史主体是压缩的原料。产出不是一段散文摘要,而是结构化任务简报——五栏定式:

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 用轻快语气回复愤怒用户——该触发转人工而没触发

缓解三招:

  1. 分级压缩:近 35 轮保原文;中段(520 轮前)压成五栏简报;远段只保留"已确认事实"栏里的结论。损失按时间梯度分摊,近期对话的语气与细节零损失。
  2. 原文外存可回查(offloading):压缩不是删除——原文搬到窗口之外(会话存储 / 文件),需要时用一个检索或读取工具取回。Anthropic 生态的 Deep Agents 已把 offloading(卸载到文件系统)与 summarization 做成内置原语(官方,2026-01);本书的对应说法是:压缩改变的是内容的地址,不是内容的存在。
  3. 压缩后自检:生成简报后让模型(或代码断言)核对——任务目标在吗?红线在吗?否定信息("已排除的方案")在吗?缺栏重压。

⚠️ 警惕双重有损:对旧简报再做一次摘要,损失会复利。正确做法是"重生成"而非"摘要的摘要"——每次压缩都从原始历史(offloading 的外存里躺着)重新生成简报,而不是在上一版简报上打折扣。

五、谁来压:自摘要与模板抽取

实现 做法 适用 成本
自摘要 模型读历史生成五栏简报 自然语言对话(客服、探索式任务) 一跳模型调用
模板抽取 代码从结构化字段拼装简报 结构化轨迹(工具调用记录、状态机日志) 近零
混合 结构化部分模板抽取,寒暄与解释性对话自摘要 多数真实 Agent 一跳,仅对非结构化部分

工具调用记录天然是结构化的(谁、调了什么、返回了什么码),模板抽取零成本且无损于关键字段;自然对话只能靠自摘要。两者拼起来,一份简报里"已确认事实"栏常来自模板、"未决问题"栏常来自自摘要。框架侧的对应物——消息裁剪与摘要节点——见 7.1 节的 compress 一行。

本节要点回顾

  1. 分工:驱逐丢可重取的(止血带),压缩重构不可重取的历史(手术);触发四条:水位 80%、驱逐后仍超、轮次阈值、阶段切换(示意)。
  2. 禁区:pinned 四项 + 最近 K 轮 + 输出预留;压缩后自检"答得出任务与红线"。
  3. 产出:五栏任务简报(任务目标 / 已确认事实 / 已做决策 / 未决问题 / 关键引用),落位窗口前部高熵区。
  4. 损失三类:过程、否定信息、语气;缓解三招:分级压缩、offloading 外存回查、压缩后自检;禁止摘要的摘要。
  5. 实现:自摘要(自然对话)、模板抽取(结构化轨迹)、混合最常用;Deep Agents 已内置 summarization 与 offloading(官方)。
  6. 最坏选项:不压缩、靠 API 硬截断——等于把驱逐顺序交给最不懂优先级的一方。

压缩让长会话活了下来。但每一次驱逐与压缩都在改写窗口——出事故的那天,你怎么向团队说清"模型当时到底看见了什么"?下一节给动态层装黑匣子:快照、diff 与版本号。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U