Reducing Cost of LLM Agents with Trajectory Reduction

论文阅读:Reducing Cost of LLM Agents with Trajectory Reduction

论文标题:Reducing Cost of LLM Agents with Trajectory Reduction
作者:Yuan-An Xiao, Pengfei Gao, Chao Peng, Yingfei Xiong
发表位置:Proc. ACM Softw. Eng. 3, FSE, Article FSE056;accepted for FSE 2026
arXiv 编号:arXiv:2509.23586
主题:LLM Agent、软件工程智能体、轨迹压缩、推理时成本优化
核心问题:多轮 LLM Agent 在执行任务时会不断累积完整轨迹,导致输入 token 成本快速增长;论文研究是否可以在推理时自动删减轨迹中的无用、冗余和过期信息,从而降低成本而不损害任务完成率。


1. 引言:为什么 Agent 的成本问题会越来越明显?

近几年,基于大语言模型的 Agent 被广泛用于软件工程任务,例如代码生成、测试、调试和程序修复。和单轮问答不同,Agent 会在一个循环中不断调用工具:读文件、编辑代码、运行命令、查看测试结果,然后把每一步的操作和结果继续放回上下文中,作为下一次模型调用的输入。

这种范式让 Agent 能够处理更复杂的软件工程任务,但也带来了一个直接的问题:轨迹会不断变长

在典型 Agent 系统中,一旦模型调用了工具,对应的 assistant message 和 tool message 通常会一直保留到任务结束。比如模型打开了一个很长的文件,或者运行了一个输出很长的测试命令,这些内容会在后续每一步中反复作为输入 token 传给模型。论文指出,在他们收集的 SWE-bench Verified 轨迹中,解决一个 GitHub issue 的平均轨迹包含 48.4K token、40 个步骤;由于每个 token 会在后续多次调用中重复出现,累计 token 使用量达到约 1.0M。

这篇论文关注的问题就是:在 Agent 执行过程中,能不能把轨迹里的“浪费信息”自动减掉,从而降低推理成本?

论文提出的方法叫 AgentDiet。它不是修改底层模型,也不是训练新的压缩模型,而是在 Agent 执行时加入一个独立的 reflection module,用较便宜的 LLM 来识别并压缩轨迹中已经不再重要的内容。


2. 问题分析:Agent 轨迹中有哪些“浪费”?

论文首先分析 LLM Agent 的基本工作流。

image

【论文 Figure 1(Typical workflow of an LLM agent)。该图展示 Agent 如何从 system/user 初始提示开始,不断生成 assistant 工具调用,再接收 tool 返回结果,并把这些步骤持续拼接到 trajectory 中。】

在这个工作流中,trajectory 是 Agent 的核心上下文。它记录 system message、user message、assistant message、tool message,以及所有历史操作。Agent 每执行一步,新的 assistant/tool message 都会被追加到轨迹后面。

这种设计简单有效,但问题是:历史内容默认永久保留。论文认为,轨迹中存在大量可以从人类角度删除或压缩的信息,并把它们分成三类。

类型 含义 论文中的例子
Useless information(无用信息) 与当前任务无关,删除后几乎不损失关键信息 列目录时包含 __pycache__.egg-info 等无关文件;构建或测试日志中大量重复的 Entering/Leaving directory 输出
Redundant information(冗余信息) 同一信息在轨迹中出现多次,保留一份即可 str_replace_editor 的参数里有旧代码 P 和新代码 Q,工具返回结果又重复包含 Q;旧代码 P 也可能已经在之前查看文件时出现过
Expired information(过期信息) 曾经对局部搜索有用,但后续已经不再需要 Agent 用 grep 搜索多个文件,逐个打开排查;一旦找到真正相关文件,其他候选文件内容就不再重要

这三类浪费说明,Agent 轨迹不是越完整越好。完整轨迹中既有任务所需信息,也混杂了大量对后续推理贡献很小的信息。论文的核心判断是:如果能够在不破坏关键上下文的前提下移除这些信息,就可能同时降低成本并保持性能。


3. 原型方法:让 LLM 帮忙识别并压缩轨迹

论文首先讨论了一个直接问题:如何自动识别这些浪费?

一种可能做法是写规则,比如用正则表达式删除日志中的固定模式。但论文认为这种方式覆盖面有限,因为不同项目的输出格式不同,不同工具调用产生的冗余也不一样。于是作者选择用 LLM 来做轨迹压缩。

他们设计了一个用于轨迹压缩的 prompt,主要包含四部分:

  1. 高层任务描述:告诉模型要分析并压缩 Agent 轨迹中的某一步。
  2. 输入输出格式:轨迹中的每一步用 XML 风格的 <step id="..."></step> 包起来,要求模型保持结构。
  3. 三类浪费信息的说明和例子:无用、冗余、过期。
  4. 防止信息损失的约束:删除内容时要用简短 takeaway 替换,保留原有结构,不要破坏 XML 标签等。

论文用一个 pytest 任务展示了压缩效果。

在这个例子中,Agent 运行测试命令后得到一大段输出,其中绝大部分是通过的测试项列表,真正有用的是最终的测试总结和失败信息。原始 step 有 1995 token,其中大量 passed test 列表属于无用信息。AgentDiet 将这些测试行替换为类似“individual test lines omitted; mostly PASSED”的短占位描述,同时保留关键测试总结,最终压缩到 259 token。

image

【论文 Figure 2(A case study of reducing information waste in the trajectory)。该图对比了原始测试输出和 AgentDiet 压缩后的输出,重点展示长测试日志如何被短 takeaway 替换。】

这个例子说明,LLM 可以在一定程度上理解轨迹中哪些内容是冗余或无用的,并把它们变成更短但仍保留语义的表示。


4. 为什么不能让 Agent 自己压缩自己的轨迹?

接下来论文讨论一个看似自然的方案:既然 Agent 本身就是 LLM,能不能给它一个 erase 工具,让它自己决定什么时候删除历史轨迹?

作者做了初步实验。他们给 Agent 加了一个 erase 工具,允许它用类似下面的参数覆盖已有轨迹片段:

{"id": 17, "takeaway": "unrelated content"}

但实验发现,即使使用 Claude 4 Sonnet 和 Gemini 2.5 Pro,并在 prompt 中明确要求模型进入 reflection 模式、只能调用 erase 工具,模型仍经常继续执行原始任务,而不是主动整理轨迹。

论文据此认为:让 Agent 自己负责轨迹压缩并不可靠。如果要做到这一点,可能需要专门的微调,而这既昂贵又容易出错,对于无法访问内部参数的闭源模型也不现实。

因此,AgentDiet 采用了一个外部控制的设计:把轨迹压缩放到一个独立的 reflection module 中,由外层系统决定何时调用它。这样,执行任务的主 Agent 不需要知道轨迹正在被压缩,也不会被额外的压缩决策干扰。


5. AgentDiet:用滑动窗口控制压缩开销

直接把完整轨迹交给 reflection module 压缩并不可行,因为这会引入巨大的额外成本。论文指出,额外调用 LLM 本身会消耗 token,而且 reflection module 和主 Agent 的 system prompt、工具集合不同,KV Cache 不能共享。如果频繁修改轨迹,还会使后续 token 的缓存失效。

AgentDiet 的核心设计是:只压缩一个较早的 step,并且只给 reflection module 一个局部窗口上下文。

image
【论文 Figure 3(Design of the reflection module in AgentDiet)。该图展示滑动窗口设计:当 Agent 执行到第 s 步时,reflection module 只尝试压缩第 s-a 步,并查看从 s-a-b 到 s 的有限上下文。】

具体来说,当 Agent 执行到第 s 步时,AgentDiet 只尝试压缩第 s-a 步。reflection module 的输入不是完整轨迹,而是一个窗口:

  • 目标 step:s-a
  • 目标 step 之前的 b 个 step
  • 目标 step 之后直到当前的 a 个 step

这里有三个关键超参数:

超参数 含义 作用
a 目标 step 距离当前 step 的延迟步数 避免压缩太新的信息,让 Agent 先用完局部上下文
b 给 reflection module 的前文步数 提供压缩判断所需上下文
θ 长度阈值 如果目标 step 不够长,就跳过压缩,避免压缩收益小于调用开销

论文给出的算法流程可以概括为:

  1. Agent 正常执行一步,得到 assistant message 和 tool message。
  2. 把这一步追加到轨迹中。
  3. 如果当前步数已经超过延迟 a,则考虑压缩第 s-a 步。
  4. 如果该步长度小于等于阈值 θ,跳过。
  5. 否则构造局部上下文,调用便宜的 LLMreflect
  6. 如果压缩后的 token 减少量超过 θ,就用压缩版本替换原 step;否则不替换。

这个设计同时服务于两个目标:

  • 从效率上看,reflection module 每次只处理有限窗口,不会把完整轨迹再读一遍。
  • 从安全性上看,它不能一次删除所有历史,也不能立刻删除最新 step,因此即使 LLMreflect 偶尔出错,也不容易造成灾难性破坏。

6. 实现:集成到 Trae Agent

论文将 AgentDiet 集成到 Trae Agent 中。Trae Agent 是一个开源软件工程 Agent,在作者研究时位于 SWE-bench Verified 的较高排名。它包含四类主要工具:

工具 功能
bash 执行 Bash 命令
str_replace_editor 查看或编辑文件
think 分析问题
task_done 结束任务

作者认为,当前许多软件工程 Agent 的结构比较相似,都是“模型 + 工具循环”的范式,因此 AgentDiet 理论上可以迁移到类似系统中。不过论文的实验只实际集成并评估了 Trae Agent。

对于 ensemble agent 或 multi-agent 系统,论文认为可以把 reflection module 加到每个单独 Agent 上,但没有展开针对这些复杂系统的专门优化,相关评估留给未来工作。


7. 超参数选择:反射模型、阈值和窗口大小

在正式评估前,论文用 SWE-bench Verified 中的 100 个实例进行超参数选择。这 100 个实例同时也用于前面的人工轨迹分析;正式评估时会从剩余实例中抽样,降低超参数过拟合风险。

论文考察了四类超参数:

  1. LLMreflect:用于压缩轨迹的模型。
  2. θ:长度阈值。
  3. a:压缩目标距离当前步骤的延迟。
  4. b:压缩时可见的前文步数。

候选 LLMreflect 包括 Claude 3.5 Haiku、Gemini 2.5 Flash、GPT-5 mini、DeepSeek v3 和 Qwen 3。论文还比较了几个 baseline:

Baseline 含义
Original 不做 reflection,也不删除内容
LLMLingua-2 用现有 prompt compression 模型压缩
Random 随机删除被处理 token 的 75%
Delete 删除所有被处理 token

论文使用的效率指标包括:

指标 含义
Keep% reflection module 处理过的 step 中保留下来的 token 比例
I 累计输入 token,用 Original 的输入 token 归一化
O 累计输出 token,用 Original 的输入 token 归一化
$ 主 Agent 调用成本,用 Original 成本归一化
$+ reflection module 额外成本

性能指标包括:

指标 含义
Pass% 成功解决 benchmark 实例的比例
Step 所有实例的平均 Agent 步数
PStep 成功解决实例的平均 Agent 步数

实验结果显示,不同 LLMreflect 都能删除大量被处理 step 中的内容,保留比例在 14.4% 到 29.0% 之间。最终,GPT-5 mini 被选为 AgentDiet 的反射模型,因为它保持了和 Original 相同的 Pass%,同时也是唯一让 Step 和 PStep 下降的模型。

对于其他超参数,论文最终选择:

超参数 最终设置
LLMreflect GPT-5 mini
θ 500
a 2
b 1

论文解释说,θ=500 在 token 节省和 reflection 开销之间取得平衡;a=2,b=1 是对性能影响很小、同时仍能显著节省成本的较小窗口设置。


8. 正式评估设置

论文围绕三个研究问题进行评估:

RQ 问题
RQ1 AgentDiet 能否通过减少 trajectory 长度提升效率?
RQ2 AgentDiet 是否会损害 Agent 的任务解决性能?
RQ3 结果能否泛化到不同 benchmark 和不同 LLM?

实验使用两个 benchmark:

Benchmark 内容
SWE-bench Verified 500 个经过人工验证的软件工程任务,主要来自 Python 项目的真实 GitHub issue;论文正式评估随机选取剩余 400 个中的 200 个
Multi-SWE-bench Flash 300 个 GitHub issue 任务,覆盖 Rust、TypeScript、JavaScript、Java、Go、C、C++ 七种语言

主 Agent 使用两个模型:

LLMagent 用途
Claude 4 Sonnet 作为软件工程 Agent 的主模型之一
Gemini 2.5 Pro 用于测试 AgentDiet 在另一个强模型上的泛化

SWE-bench Verified 的 step limit 设为 50;Multi-SWE-bench Flash 更难,需要更多步骤,因此 step limit 设为 100。


9. RQ1:AgentDiet 能降低多少成本?

论文的主要结果显示,AgentDiet 确实显著降低了输入 token 和总成本。

Benchmark LLMagent 输入 token 比例 I 主 Agent 成本 $ reflection 成本 $+ Pass% 变化
SWE-bench Verified Claude 4 Sonnet 0.601 0.714 0.074 64.5 → 66.5
SWE-bench Verified Gemini 2.5 Pro 0.591 0.623 0.118 50.5 → 52.0
Multi-SWE-bench Flash Claude 4 Sonnet 0.596 0.676 0.055 40.0 → 39.0
Multi-SWE-bench Flash Gemini 2.5 Pro 0.403 0.559 0.082 21.7 → 22.7

从这些结果可以看出:

  • AgentDiet 将累计输入 token 降低到 Original 的 40.3% 到 60.1%。
  • 换句话说,输入 token 减少了 39.9% 到 59.7%。
  • 主 Agent 成本降低到 Original 的 55.9% 到 71.4%。
  • 如果再加上 reflection module 的额外成本,最终总成本仍减少 21.1% 到 35.9%。

论文还把归一化成本换算成每个实例的美元成本。例如在四个设置中,Original 的平均成本分别为 0.535、0.385、1.277、0.701 美元;AgentDiet 分别降到 0.422、0.285、0.933、0.449 美元。虽然单个任务节省金额不大,但如果是大规模 Agent 产品,累计节省会非常明显。

image

【论文 Figure 4(Histogram of the number of tokens reduced by AgentDiet in each step)。该图展示每个 step 压缩前后的 token 数分布,以及哪些 step 因低于阈值或收益不足而没有被替换。】


10. RQ2:压缩轨迹会不会损害性能?

论文用 Pass%、Step 和 PStep 来衡量性能影响。

在两个 benchmark 和两个主模型上,AgentDiet 的 Pass% 与 Original 相比变化范围是 -1.0% 到 +2.0%。这说明,在论文实验范围内,轨迹压缩没有明显损害任务解决率。

更进一步,Step 和 PStep 也没有整体增加。也就是说,AgentDiet 并没有让 Agent 因为信息被删掉而不得不多走很多步来找回上下文。

一个有意思的现象出现在 Multi-SWE-bench Flash + Gemini 2.5 Pro 设置中:Original 的平均 Step 是 57.20,而 AgentDiet 降到 43.90。论文通过检查轨迹发现,Gemini 2.5 Pro 在上下文过长时会更容易出现异常行为,例如重复发出无效工具调用直到达到 100 步上限。AgentDiet 缩短轨迹后,触发这种异常的概率下降。在该设置中,到达 100 步上限的实例数从 66 个降到 26 个。

image

【论文 Figure 5(Histogram of the Step metric on Multi-SWE-bench Flash + Gemini 2.5 Pro)。该图比较 Original 和 AgentDiet 的 step 分布,重点展示达到 100 步上限的实例明显减少。】

因此,论文认为 AgentDiet 不仅能降低成本,在某些角落情况中还可能改善 Agent 的鲁棒性。


11. RQ3:能否泛化到不同模型、任务和语言?

论文从三个层面讨论泛化性。

第一,AgentDiet 在两个 benchmark 上都有效:SWE-bench Verified 和 Multi-SWE-bench Flash。

第二,AgentDiet 在两个主模型上都有效:Claude 4 Sonnet 和 Gemini 2.5 Pro。

第三,Multi-SWE-bench Flash 覆盖七种语言,论文进一步按语言拆分结果。总体上,前面 RQ1 和 RQ2 的发现仍然成立:AgentDiet 能减少输入 token 和成本,并且对 Pass% 的影响有限。

语言 实例数
Rust 45
TypeScript 45
JavaScript 45
Java 40
Go 45
C 40
C++ 40

论文因此得出结论:基于少量样例优化 prompt、基于 100 个实例选择超参数的 AgentDiet,可以泛化到两个 benchmark、两个主模型和七种编程语言。


12. 讨论:未来工作和有效性威胁

12.1 延迟问题

AgentDiet 在 Agent 循环中额外加入 reflection step,因此可能增加延迟。论文没有定量比较延迟,因为实验依赖商业 LLM API,而 API 延迟受服务器负载影响较大,不稳定。

论文提出,在延迟敏感场景中,可以让 reflection step 和 Agent step 并行执行。这样可以减少或消除额外延迟,但代价是 reflection module 能看到的后续上下文少一步,相当于改变超参数 a 的有效值。

12.2 更高效的轨迹压缩设计

当前 AgentDiet 使用现成 LLM 作为 LLMreflect,会带来约 5% 到 10% 的额外成本。论文认为,未来可以训练或设计更专门、更便宜的模型来完成轨迹压缩,从而进一步降低开销。

此外,对于会根据任务难度路由到不同 LLM 的 Agent 系统,也可以动态调整 AgentDiet 的超参数,在效率和性能之间自动平衡。

12.3 泛化到更多 Agent 系统

论文的一个外部有效性威胁是:AgentDiet 只实际集成到 Trae Agent 中。虽然作者认为当前软件工程 Agent 大多采用类似的“模型 + 工具循环”结构,工具也较相似,但没有在更多 Agent 框架上实测。

作者解释说,实验已经花费约 2000 美元 LLM 成本,因此进一步测试更多 Agent 系统在成本上较困难。

12.4 数据泄漏问题

由于实验使用了闭源商业模型,benchmark 实例可能已经进入模型训练数据,作者无法直接控制这一点。论文通过加入较新的 Multi-SWE-bench Flash 来缓解这一威胁,因为该 benchmark 由第三方收集,并且未出现在被评估模型的技术报告中。

12.5 补丁正确性问题

SWE-bench Verified 和 Multi-SWE-bench Flash 都通过开发者编写的测试来判断补丁是否成功。测试通过的 patch 可能只是 plausible patch,并不一定与开发者真实 patch 语义完全等价。论文指出,这是所有基于测试的程序修复评估都会面临的问题。由于 AgentDiet 和 Original 在同样 benchmark、同样测试机制下比较,因此这一威胁对两者相对比较的影响有限。


13. 相关工作

论文把相关工作分成三类。

13.1 Prompt Reduction

已有 prompt reduction 方法主要面向 RAG 或单轮输入压缩,例如过滤检索文档、按 token 信息量裁剪、用模型生成摘要、训练分类器判断 token 相关性等。

这些方法和 AgentDiet 的区别在于:

  1. 它们通常处理初始输入,而不是 Agent 逐步生成的轨迹。
  2. 它们多面向自然语言,不一定能保留代码、命令输出和工具调用结构。
  3. 它们没有重点讨论“什么时候压缩”这个问题,而 Agent 轨迹的压缩时机对性能和成本都有影响。

论文还指出,LLMLingua-2 在 pytest 例子中会把测试名压缩成难以辨认的碎片,而 AgentDiet 的 reflection module 更强调保持结构并用简短 takeaway 替换无用内容。

13.2 Agent 系统中的上下文管理

一些现有 Agent 产品或系统已经有上下文管理机制。例如 Cursor 和 Claude Code 会在上下文窗口满时用 LLM 压缩上下文;Trae Agent 会把每个工具响应截断到前 16KB;SWE-agent 也有基于正则删除文本等机制。

但这些机制通常是临时性的,主要用于避免上下文爆掉或提升极端情况下的鲁棒性。AgentDiet 的不同点在于,它把 trajectory reduction 作为一个明确的效率优化问题,并进行系统实验评估。

13.3 白盒 LLM 系统的效率优化

还有一类方法通过修改模型结构、训练方式或推理过程来提升效率,例如合并 KV Cache、蒸馏 RAG 文档到 embedding、剪枝 Chain-of-Thought token、增加 Transformer 内部剪枝层等。

这些方法通常需要白盒访问模型,而当前许多强 Agent 模型是闭源商业模型,无法修改训练或推理内部机制。AgentDiet 不依赖模型内部机制,因此更容易应用到闭源 LLM Agent 系统中。


14. 总结

这篇论文研究了一个很实际的问题:LLM Agent 在多轮工具调用过程中会积累越来越长的 trajectory,而这些历史轨迹会带来显著的输入 token 成本。论文通过分析 SWE-bench Verified 中的 Agent 轨迹,发现其中普遍存在三类浪费:无用信息、冗余信息和过期信息。

基于这个观察,论文提出 AgentDiet。它在 Agent 执行过程中加入一个独立 reflection module,用较便宜的 LLM 在滑动窗口内压缩较早的 step。这个设计避免让主 Agent 自己管理轨迹,也避免把完整轨迹反复交给压缩模型,从而在压缩效果、成本开销和性能安全之间取得平衡。

实验结果显示,AgentDiet 在两个 benchmark、两个主模型和七种编程语言上都能降低成本:输入 token 减少 39.9% 到 59.7%,最终计算成本减少 21.1% 到 35.9%,同时 Pass% 与 Original 基本持平,变化范围为 -1.0% 到 +2.0%。

因此,论文的核心结论是:对于软件工程 LLM Agent,推理时轨迹压缩是一条有潜力的成本优化方向;只要压缩时机和压缩范围设计得当,就可以减少大量 token 浪费,而不必牺牲任务完成性能。

参考

  • Yuan-An Xiao, Pengfei Gao, Chao Peng, Yingfei Xiong. Reducing Cost of LLM Agents with Trajectory Reduction. arXiv:2509.23586.
  • 论文 artifact:实现、实验脚本和原始轨迹数据见论文 Data Availability 中给出的 Figshare artifact。
posted @ 2026-06-08 15:22  YourF4u1t  阅读(45)  评论(0)    收藏  举报