游乐游手机版
首页/AI热点日报/热点详情

Agent 感知|语意压缩

类型:热点整理2026-07-13
大家好,我是十三!欢迎来到十三Tech。 上一讲聊了上下文分诊——信息进 Context 之前先排优先级。这一讲接住它的下一阶段:信息进来之后,Agent 只要跑得足够久,上下文一定会膨胀。 对话历史

上回说到上下文分诊——信息进Context之前先排优先级。这一讲要聊的,是信息进来之后的事:Agent只要跑得足够久,上下文几乎必然膨胀。

对话历史、tool返回、错误日志、代码diff、测试输出,这些东西会一轮一轮地堆起来。到了某个阶段,系统必须对历史做点什么,否则不是撞上context limit,就是让模型淹在旧信息里。这个阶段通常被称为"语义压缩",但有一个关键判断需要先明确:压缩不是做摘要,它的本质是工作记忆维护。压缩之后,Agent到底还能不能记得自己为什么走到这一步?

一、坏的压缩比不压更危险

举个例子就很清楚了。

一个ConnectionPoolExhausted的错误堆栈,14行trace,清清楚楚地写着pool_size=20、queue_depth=347、timeout in acquire_connection。如果被压成一句"database error occurred"——好,Agent可以说直接失去了判断力。

它后面接着调pool_size、加retry、改timeout,看起来还在努力,但实际上已经丢了最关键的信息——问题根本不是连接池太小,而是连接没有被及时释放。

不压历史,最多撞窗口限制;乱压历史,Agent会忘记关键证据,甚至会忘记哪些方案已经被证明失败,然后在同一个坑里反复试错。

二、三层压缩链:从轻到重

压缩通常不是一步到位的,而是一层一层往下压。

Level 1清理tool输出——日志全文、API响应,替换成占位符或截断。Level 2做Anchor合并——把旧对话、任务状态抽取成intent / changes / decisions / excluded / next,增量合并进Anchor。Level 3才进入极限压缩阶段。

最稳的策略不是无限压,而是:少压、分层压、保留证据、保留回退路径。

这和特德·姜那个"模糊图像"的类比几乎一模一样:暗房里翻拍照片,第一次翻拍主体还在,第二次边缘就开始模糊,第三次很多细节就永久丢了。多层压缩每多压一次,语义漂移的风险就大一分。

三、Anchor五字段

压缩后的工作记忆,必须稳定回答五个问题。

 复制代码@dataclass
class CompactionAnchor:
    intent: str                         # 用户要什么
    changes_made: list[str]             # 已经改了什么
    decisions_taken: list[str]          # 已经做了哪些判断
    excluded_approaches: list[str]      # 已经排除的方案
    next_steps: list[str]               # 下一步做什么

五个字段里,excluded_approaches 最关键,也最容易被遗漏。 很多长会话Agent反复试错,不是因为它不会推理,而是因为它忘了哪些路已经走不通。

这里值得多说一句。服务端做事故复盘时,incident timeline记录的无非也就是这些:客户是谁、已经做过什么、已经排除了什么原因、下一步该做什么。Anchor其实就是会话级incident timeline的运行时版本。

四、Action与Observation分离

OpenHands有一个非常值得关注的设计,叫ObservationMasking。Agent的历史里其实包含两类信息:Action是Agent自己做了什么,Observation是外部世界返回了什么。

ObservationMasking的做法是:把早期的Observation替换成占位符,但完整保留Action。这相当于告诉Agent——你不需要记住每一屏输出,但必须记住自己走过哪些路。

通用LLM summarization把这两类混在一起压,可以说是最隐蔽的工程错误之一。服务端日志治理早就分了"行为日志"和"状态日志"——前者长期保留,后者采样或截断。Agent历史里的Action和Observation,完全对应这两类。

五、错误堆栈是Agent的测试套件

这一讲最锋利的一个类比,来自Martin Fowler的《Refactoring》。平移过来就是:压缩的安全感,来自关键证据保护。错误堆栈就是Agent的测试套件——它记录了上次为什么失败、失败在哪一行、哪条路已经走不通。把错误堆栈压成一句模糊的"出现了数据库错误",就像重构时顺手把测试删掉。

六、Level 3是退场信号

Level 3极限压缩,不是"再压一次",而是退场信号。

和服务端"重试上限+报警升级"完全是一个道理。从SRE实践来看,最需要警惕的反模式就是无限重试——系统一旦进入需要不断重试的状态,正确的动作不是"再试一次",而是退出当前路径、升级到人工介入。

Agent压缩也是同理。一旦session反复进入Level 3,正确的动作是导出handoff summary、交给二线或人工处理。极限压缩不是工程胜利,而是系统在要求退出。

这个handoff summary的内容,和服务端incident escalation的标准模板几乎一模一样:现象、已尝试方案、已排除原因、下一步建议、SLA剩余。Agent的handoff summary,本质上就是同一份东西。

来源:https://juejin.cn/post/7651610218149494790

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。