| 论文标题 | ACON: Optimizing Context Compression for Long-horizon LLM Agents |
|---|---|
| 作者 | Minki Kang, Wei-Ning Chen, Dongge Han, Huseyin A. Inan, Lukas Wutschitz, Yanzhi Chen, Robert Sim, Saravan Rajmohan |
| 机构 | KAIST, Microsoft, University of Cambridge |
| 发表信息 | arXiv preprint, arXiv:2510.00615v2, 17 Oct 2025。PDF 中未看到正式期刊/会议录信息。 |
| 代码 | https://github.com/microsoft/acon |
Optimizing Context Compression for Long-horizon LLM Agents
这篇论文提出 ACON(Agent Context Optimization),目标是在长程 LLM Agent 中压缩不断增长的上下文,同时尽量保持任务成功率。
基本信息
先确定论文来源、作者和汇报定位。
提纲 / 背景
长程 Agent 的上下文会自然增长,压缩问题来自多轮交互结构本身。
论文的背景很明确:LLM Agent 在多步任务中会持续积累工具调用、环境返回、历史动作、失败尝试和中间状态,context 会随着交互轮次不断变长。
长上下文带来的问题不只是成本升高。对 Agent 来说,history 和 observation 往往承担“工作记忆”的作用,里面可能包含账号状态、API 参数、文件路径、已完成步骤、错误反馈等关键信息。直接截断会丢状态,普通摘要又可能保留了流畅文本却删掉了后续动作真正需要的变量。
上图对应论文的动机示意:普通 Agent 的历史会持续累积,导致 peak tokens 不断上升。
- 一次 Agent 任务是多轮交互:用户指令 → 模型思考 → 调用工具 / API → 接收此轮结果 → 继续下一轮思考生成/输出结果……
- 每一轮,上下文都在变长(新输入 + 新输出都要算进去)。
- Peak Tokens = 整个过程中,上下文最长那一刻的总 Token 数。
ACON 试图把历史压缩成较短但仍含关键信息的 summary,从而让后续步骤在更小上下文中继续执行。这个图证明的是问题存在的结构性原因:长程任务天然会产生“越做越长”的上下文,而不是某个单一 prompt 写得太长。
长程 Agent 为什么会越跑越长
研究问题与目标
不是把 token 压到最短,而是在任务成功率和上下文成本之间做权衡。
论文解决的具体问题是:在长程 Agent 中,如何压缩 history 和 observation,使输入上下文变短,同时不破坏完成任务所需的状态信息。
作者把目标写成一个带成本惩罚的优化问题:既要最大化任务成功带来的 reward,也要降低上下文成本。这个设定比“把 token 压得越少越好”更合理,因为对 Agent 来说,压缩如果导致任务失败,节省的 token 没有实际价值。
因此 ACON 的工作目标可以概括为三点:第一,找出 Agent 上下文中可以压缩的部分;第二,学习一种不会轻易丢关键状态的压缩规则;第三,降低 compressor 本身的调用成本,使它有机会用于实际系统。
三个目标分别解决什么问题
把 Agent context 拆成 history 和 observation,而不是把所有文本一锅端处理。
压缩规则必须保留后续动作需要复用的信息,而不是生成流畅摘要。
通过 distillation 让小 compressor 接手压缩,避免强模型压缩器过贵。
核心方法 / 模型
用失败轨迹来反向改进压缩规则,把压缩错误具体化。
ACON 的核心思想是:把“上下文压缩”从普通摘要问题,改造成一个围绕任务成功率优化的 Agent 状态保留问题。它不是一次性写一个“请总结历史”的 prompt,而是比较“完整上下文成功”和“压缩上下文失败”的轨迹,让强 LLM 分析压缩到底漏掉了什么,再把这些失败原因转化为新的 compression guideline。
从建模上看,Agent 在第 t 步并不是只看当前用户问题,而是根据历史 h_{t-1} 和当前环境返回 o_t 生成动作 a_t:
随着工具调用和环境反馈不断加入,h_t 会越来越长。ACON 优化的目标可以理解为:
这个公式背后的意思很关键:压缩不是越短越好,而是要在“还能完成任务”和“上下文更短”之间找平衡。对长程 Agent 来说,一个短但丢失状态的 summary 可能比完整历史更危险,因为它会让模型基于错误或不完整的世界状态继续行动。
ACON guideline optimization 流程
这张图说明 ACON 不是一次性总结,而是通过 contrastive trajectories 不断修正压缩规则。
Figure 3 展示了 ACON guideline optimization 的三层机制。第一层是“对比轨迹”:同一个训练任务分别用无压缩 Agent 和压缩 Agent 跑一遍,真正有价值的样本不是所有失败任务,而是无压缩能成功、压缩后失败的任务。因为这说明任务本身可完成,问题更可能出在压缩丢失了关键上下文。第二层是“自然语言反馈”:强 LLM 不只是给一个成功/失败分数,而是阅读两条轨迹,指出压缩版本少了什么、错了什么、在哪一步开始偏离。第三层是“guideline 更新”:这些失败诊断会变成新的压缩规则,再用于下一轮 compressor。也就是说,Figure 3 展示的是一个把压缩失败转化为 prompt 规则的闭环。
方法上,ACON 先区分两个压缩对象:history compression 和 observation compression。history 是跨步骤记忆,里面包含已经做过的动作、工具返回、错误反馈、变量值、文件或对象 ID、用户目标、待完成子任务等;它的问题是越积越长,但风险是压缩后丢掉状态。observation 是当前环境或工具刚返回的大段内容,例如搜索结果、API 返回、表格、文档片段;它的问题是信息过载,但风险是删掉后来才会用到的细节。因此论文没有把所有 context 当作一整块文本处理,而是分别设置 history threshold 和 observation threshold,在超过阈值时触发对应 compressor。
两个压缩对象的区别
History compression
保留跨步骤状态:任务目标、已完成步骤、关键变量、API 参数、失败原因和后续待办。它更像记忆维护。
Observation compression
筛选当前工具返回中真正和任务相关的候选项、字段值、约束条件和异常信息。它更像信息过滤。
| 对照维度 | History compression | Observation compression |
|---|---|---|
| 要保留什么 | 保留的是后续动作还需要继承的状态,例如任务目标、已完成步骤、当前关键变量、已确认 API 参数、失败尝试和不能重复犯的错误。 | 保留的是当前决策真正需要的信息,例如工具返回里和任务目标相关的候选项、字段值、约束条件和异常信息。 |
| 主要风险 | 风险是压缩后丢掉状态,使 Agent 基于不完整历史继续行动。 | 风险是删掉后来才会用到的细节,导致当前 observation 无法支撑下一步决策。 |
| 本质区别 | 更像记忆维护。 | 更像信息筛选。 |
| 为什么重要 | 这个区分是 ACON 比普通 prompt compression 更贴近 Agent 的地方:它没有把所有 context 当作一整块文本处理,而是分别设置 history threshold 和 observation threshold,在超过阈值时触发对应 compressor。 | |
guideline optimization 如何从失败中迭代
ACON 先用一个初始 guideline 运行压缩版 Agent,同时也运行无压缩 Agent。
最有价值的训练样本是:无压缩版本成功,但压缩版本失败。这个样本直接暴露压缩器的问题,因为任务本身是可完成的,失败大概率来自压缩过程中丢了关键上下文。
诊断不是泛泛地说“摘要不够好”,而是指出具体丢失了什么:删掉变量、误写工具返回、遗漏文件版本、没记录上一步失败原因,或者把后续还需要的约束当作无关信息删掉。
这些诊断会被汇总成新的自然语言 guideline,用来指导下一轮 compressor。也就是说,ACON 的压缩规则不是人工一次性写死的,而是从任务失败中迭代出来的。
UT 与 CO 的目标差异
UT: utility maximization
目标是先把任务成功率救回来:只要压缩导致失败,就分析失败轨迹并修正 guideline,让 compressor 更愿意保留关键状态。它解决的是别压坏。
CO: compression maximization
目标是在已经成功的压缩轨迹上进一步找冗余:如果某些信息虽然被保留了,但后续没有真正用到,就从 guideline 中弱化或删除。它解决的是还能不能更短。
需要保留的判断
CO 不是总是正收益,压得更狠时确实可能重新损害 accuracy。这一点后面的实验也给出了证据。
4.1 Algorithm 1:ACON 到底怎样优化 guideline
原论文 Appendix B 的 Algorithm 1 是 Figure 3 的细化版本。它说明 ACON 不是简单“跑一次失败分析”,而是一个交替优化过程:先用 UT 修复任务成功率,再用 CO 尝试减少冗余上下文。
| 阶段 | 算法动作 | 方法含义 |
|---|---|---|
| 0. 收集无压缩基线 | 对训练任务先跑无压缩 Agent,记录完整上下文轨迹和是否成功。 | 只有无压缩能成功的任务,才适合用来判断“压缩是否破坏了任务”。 |
| 1. UT 运行压缩 Agent | 用当前 guideline 跑压缩版 Agent,记录压缩轨迹、成功率和上下文成本。 | 此时目标不是最短,而是先看压缩有没有把任务压坏。 |
| 2. 构造 contrastive subset | 筛选“无压缩成功、压缩失败”的任务。 | 这是最有价值的训练信号,因为失败很可能来自丢上下文。 |
| 3. 生成失败反馈 | 让 optimizer LLM 比较完整轨迹和压缩轨迹,指出丢失事实、错误摘要、状态变量缺失、API 误用等原因。 | 这里的反馈相当于自然语言梯度,不是数值梯度。 |
| 4. 更新 UT guideline | 聚合多条失败反馈,生成多个候选 guideline,再在验证任务上选择成功率最高的。 | UT 的选择标准主要是 reward,也就是任务成功率。 |
| 5. CO 分析成功压缩轨迹 | 只看压缩后仍然成功的轨迹,分析哪些内容其实没被后续使用。 | CO 的目标不是修复失败,而是找冗余。 |
| 6. 更新 CO guideline | 生成更短的候选 guideline,并用“成功率 - 成本惩罚”选择。 | CO 同时看成功率和成本,所以可能更省 token,也可能伤害 accuracy。 |
| 7. 停止或继续 | 如果成功率、成本或预算达到条件,就停止。 | 这说明 ACON 是离线优化 guideline,不是每个任务现场从零学。 |
这个算法也解释了为什么作者没有直接用 RL 训练 compressor。论文指出这里没有标准压缩答案,任务 reward 只有执行结束后才知道,环境 rollout 又很贵,而且 token cost 是离散量,不容易直接做梯度优化。所以 ACON 选择优化自然语言 guideline,而不是直接更新大模型参数。
4.2 Appendix E:prompt 示例说明 ACON 学到了什么
Appendix E 通过 prompt 模板和压缩样例展示了 guideline optimization 的具体形式,说明优化前后 compressor 的行为差异。
把 optimizer LLM 设定成 trajectory auditor,比较 baseline full history 和 optimized history,找出压缩版第一次偏离成功轨迹的位置,并把原因归类为缺失关键信息、summary 写错、状态变量丢失、API 误用、重复探索、过早结束等。
让 LLM 扮演 prompt engineer,根据多条失败分析重写 history summarization prompt。更新必须来自具体样本中的失败信号,同时保留原 prompt 的变量占位符和结构,避免把某个任务里的具体值硬编码进通用 guideline。
优化前更像普通摘要;优化后的 UT prompt 变成 Agent 状态表,明确输出 REASONING、VARS、TODO、COMPLETED、GUARDRAILS。UTCO 再把仍然需要的变量合并成 key=value,删除无用日志、重复步骤和过期信息。
优化后的 UT prompt 明确要求保留可能调用的 API endpoint、完整参数列表、默认值、后续可能需要的 schema 字段和原始数据行,并禁止把机器可读数据替换成模糊文字。UTCO 则进一步变短,但仍保留 access token、page index/page limit、endpoint 和必要参数。
原论文的 Splitwise 例子展示了 history compression 的状态保留方式:普通 prompting baseline 能说清楚“已经登录、查找了 Splitwise 消息、下一步要检查联系人”,但它偏叙述;ACON-UT 会显式保留 access token、page index/page limit、目标日期、邀请消息 ID、发送者手机号等可执行状态;ACON-UTCO 则把这些状态进一步压缩成更短的变量列表。这个例子证明 ACON 压缩出来的不是“更漂亮的摘要”,而是“下一轮 Agent 可以继续执行的状态包”。
原论文的 Spotify API 例子能很好地解释 observation compression 的风险:任务是播放一个已下载歌曲足够多的专辑,普通压缩只保留了查询专辑库、下载歌曲和专辑详情相关 API,却漏掉了真正执行播放需要的 play_music。ACON 优化后会把 play_music 也保留下来,因为后续动作最终必须调用它。这个例子说明 observation compression 不能只判断“当前看起来相关的信息”,还要判断“完成任务最终必需的行动接口”。
4.3 具体案例:压缩到底帮 Agent 保留了什么
Appendix E 给出了多个具体示例,其中两个案例分别展示了 history compression 如何把失败任务救回来,以及 observation compression 为什么不能漏掉最终动作接口。
案例一:history compression 如何让失败轨迹变成功
论文的 Example E.2 / E.3 使用同一个 AppWorld 任务:
无 history compression 时,gpt-4.1-mini 的失败过程很有代表性。Agent 先调用 file_system API,发现访问 ~/downloads 需要认证;随后从 supervisor 里拿到 file_system 密码,用用户名和密码登录,并成功得到 access_token。问题出在后续:它没有意识到 show_directory 和 delete_file 这类 API 调用需要显式传入 access_token 参数,而是反复尝试重新登录、重新调用目录接口,持续遇到 401 unauthorized,最后把任务判为失败。
压缩后成功的关键不是“历史变短”本身,而是 <HISTORY_SUMMARY> 把真正影响后续动作的状态整理出来了:用户目标是删除 ~/downloads 下所有 PDF;已经确认 file system 需要认证;已经拿到了用户名、密码和 file_system_token;下一步应该确定如何把 token 传给文件系统 API;guardrail 则提醒不要继续重复登录,而要显式处理 access token。后续 Agent 看到这个 summary 后,就能把 access_token 作为参数传入 show_directory,列出 PDF 文件,再调用 delete_file 删除。
| 对比点 | 无压缩失败轨迹 | ACON 压缩后成功轨迹 |
|---|---|---|
| 关键状态 | 登录成功拿到 token,但后续没有稳定保留“如何使用 token”这个问题。 | summary 明确保留 file_system_token、downloads_path 和 token 使用 TODO。 |
| 主要错误 | 重复登录和重复调用目录接口,却没有把 access token 传给受保护 API。 | 把认证失败原因变成下一步行动线索。 |
| 对 Agent 的帮助 | 长历史里信息很多,但关键状态没有被组织成可执行计划。 | 压缩结果像任务恢复检查点,让小模型知道下一步该修什么。 |
| 证明的结论 | 长上下文本身不一定帮助小模型,反而可能造成循环和遗忘。 | 任务感知压缩可以提高可执行状态的显著性,从而提升成功率。 |
这个案例说明,ACON 的 history compression 不是把历史“概括得更短”,而是把长程任务中必须继承的状态转成一个可恢复执行的 checkpoint。对小模型来说,这种结构化状态可能比完整混乱历史更有用。
案例二:observation compression 为什么必须保留最终动作接口
论文的 Compression E.4 是一个 Spotify 任务:
当前 observation 是 Spotify app 的一长串 API 描述,里面包括查询专辑库、查询已下载歌曲、查看专辑详情、播放音乐、队列控制、下载、评论、会员等大量接口。普通 prompting baseline 把它压缩成三个看起来相关的 API:show_album_library、show_downloaded_songs 和 show_album。这个压缩结果乍看合理,因为任务确实需要知道用户有哪些专辑、哪些歌曲已下载、某个专辑有哪些歌。
但 baseline 漏掉了真正完成任务所需的最终动作接口 play_music。如果后续 Agent 只看到这三个 API,它可能能找到合适专辑,却不知道应该调用哪个接口播放该专辑。ACON-UT 的压缩结果保留了 play_music,并保留它的关键行为:可以通过 album_id 播放专辑。UTCO 版本进一步把 API 描述压短,但仍保留 play_music 和 album_id allowed 这类决定后续动作能否执行的信息。
| 对比点 | 普通 observation compression | ACON observation compression |
|---|---|---|
| 保留的信息 | 只保留查询相关 API:专辑库、已下载歌曲、专辑详情。 | 同时保留查询 API 和最终动作 API:play_music。 |
| 丢失风险 | 能分析候选专辑,但可能不知道如何真正播放。 | 后续 Agent 既能筛选专辑,也能执行播放。 |
| 核心差别 | 只判断“当前检索相关”。 | 判断“完成任务最终需要什么接口”。 |
| 证明的结论 | observation 压缩不能只做语义相关筛选。 | 压缩器必须理解任务链条中的后续动作需求。 |
这个案例补充了 history compression 之外的另一种风险:工具返回通常很长,删掉无关 API 是必要的,但如果删掉最终动作接口,Agent 仍然会失败。因此 ACON 的 observation compressor 要保留的不只是当前一步最像答案的信息,还包括后续执行任务不可缺少的接口、参数和默认值。
最后是 compressor distillation。直接让 gpt-4.1 这类强模型在每一步都做压缩,会引入新的推理开销,所以 ACON 把优化后的强模型 compressor 当成 teacher,让它生成大量“原始上下文 -> 压缩上下文”的训练样本,再用 LoRA 微调较小的 student compressor。推理时可以用小模型负责压缩,强模型主要负责 Agent 决策。这个环节解决的是部署可行性问题:如果 compressor 自身太贵,那么 peak tokens 虽然降了,系统总成本仍可能不划算。
实验结果与分析
核心证据来自任务成功率、peak tokens、dependency、蒸馏和消融分析。
论文在 AppWorld、OfficeBench 和 8-objective QA 三类长程 Agent benchmark 上实验。指标包括任务表现(accuracy、EM、F1)、交互步数、peak tokens 和 dependency。对比方法包括无压缩、FIFO、retrieval、LLMLingua、普通 LLM prompting,以及 ACON 的 UT / UTCO 版本。
这张图展示了最核心的 trade-off:在 AppWorld 上,ACON 相比无压缩可以减少约 24%-31% 的 peak tokens;相比朴素 LLM 压缩,准确率明显更高。尤其在 gpt-4.1-mini 和 Qwen3-14B 上,ACON 不只是省 token,还提高了准确率。这证明压缩有时不是单纯“少给信息”,而是把上下文整理成更适合小模型使用的状态表示。
AppWorld 结果说明,FIFO、retrieval、LLMLingua 和普通 prompting 都会明显损害任务表现,原因是这些方法没有真正理解 Agent 历史里的状态依赖。ACON-UTCO 在 gpt-4.1 上把 peak tokens 从 9.93k 降到 7.33k,同时 accuracy 从 56.0 提到 56.5。这个结果支撑了论文的主要主张:经过失败反馈优化的压缩规则,比通用压缩更适合长程 Agent。
跨任务结果更能看出方法边界。OfficeBench 中,ACON-UT 把 peak tokens 从 7.27k 降到 4.93k,accuracy 从 76.84 降到 74.74,属于用较小性能损失换明显上下文缩短;但 ACON-UTCO 进一步压缩到 4.54k 后,accuracy 降到 72.63。8-objective QA 中,ACON-UT 把 peak tokens 从 10.35k 降到 4.71k,同时 EM/F1 还略高于无压缩;但 UTCO 又出现性能回落。这里证明 CO 不是无风险增强项,压缩强度过高会重新伤害任务。
这张图回答“压缩器本身会不会太贵”的问题。论文把 gpt-4.1 compressor 的行为蒸馏到 Qwen3-14B、Qwen3-8B、Phi-4 和 gpt-4.1-mini 等较小模型上,结果大多能保留 teacher compressor 超过 95% 的性能。它证明了 ACON 不一定必须在推理时持续调用最强模型做压缩,小 compressor 有可能承担这部分工作。
这张图说明 ACON 对小模型 Agent 尤其有价值。Qwen3-14B 在 AppWorld 上从 26.8% 提升到 33.9%,在 8-objective QA 上 EM 从 0.158 提升到 0.197。合理解释是,小模型处理长上下文的能力更弱,压缩后的结构化上下文反而降低了干扰。
消融实验显示,压缩阈值不能太小也不能太大。阈值过小会频繁压缩,容易丢信息;阈值过大则省不了多少 peak tokens。更重要的是 Figure 7 的成本分析:peak tokens 降低不等于总 API 成本必然降低,history compression 可能因为 compressor 调用和 KV-cache 机制带来额外成本;observation compression 更容易直接减少输入成本。这个结果提醒我们,ACON 更准确地说是降低 memory pressure 和 peak context,而不是在所有部署条件下都保证降低账单。
总结
ACON 的贡献在于任务感知压缩,而不是普通 prompt summary。
ACON 的核心贡献有三点。第一,它把长程 Agent 的上下文压缩对象明确分成 history 和 observation,比只做通用 prompt compression 更贴近 Agent 工作流。第二,它提出用“完整上下文成功、压缩上下文失败”的对比轨迹来优化自然语言压缩规则,使压缩器学会保留任务关键状态。第三,它通过 distillation 降低 compressor 成本,并展示了小模型 Agent 可以从结构化压缩上下文中受益。
把长程 Agent 的上下文明确分为 history 和 observation,并分别设计触发和压缩逻辑。
用完整成功、压缩失败的对比轨迹来优化自然语言 guideline,让压缩器保留任务关键状态。
通过 compressor distillation 减少额外模块成本,并展示小模型 Agent 也能从压缩上下文中受益。
个人思考与展望
它很适合作为 Agent token 优化研究的起点,但还不是完整的成本优化答案。
我认为这篇论文的优点是问题定义比较务实,实验也不只报告 token 变短,而是同时看任务成功率、peak tokens、dependency 和 compressor distillation。它对我们研究 Agent token 消耗优化有直接参考价值,尤其是“失败驱动的压缩规则优化”这一点,可以迁移到代码 Agent、科研 Agent、多工具办公 Agent 等场景。
但它的局限也比较明显。第一,论文主要优化 history 和 observation,还没有建立完整的 token accounting 框架;system prompt、tool schema、RAG 文档、reasoning trace、retry loop、多 Agent 通信等来源没有被细分。第二,peak tokens 和实际 API 成本之间不是等价关系,尤其 history compression 在真实服务端缓存机制下未必总是省钱。第三,ACON 需要收集失败轨迹来优化 guideline,迁移到新领域时仍然有冷启动成本。第四,UTCO 的结果表明“更短”不一定更好,实际系统需要动态阈值、失败回退和成本-成功率联合评估。
优点与局限
优点
问题定义务实,实验同时看任务成功率、peak tokens、dependency 和 compressor distillation。“失败驱动的压缩规则优化”可以迁移到代码 Agent、科研 Agent 和多工具办公 Agent。
局限
论文主要优化 history 和 observation,还没有建立完整 token accounting;peak tokens 与真实 API 成本不是等价关系;ACON 依赖失败轨迹,迁移新领域有冷启动成本。