门户首页
过程分析 · 问题分类 · 第 3 讲

问题 step 分类学:无用 · 冗余 · 低效 · 错误

一条 Agent 轨迹里不是每一步都在创造价值:读了不相关的文件、同一个命令反复执行、改完又改回去、工具调参数调错…… 怎么给这些"问题 step"一个统一的说法?这一页把两篇论文的两套分类—— AgentDiet 的 useless / redundant / expired 与 RedundancyBench 的 abnormal / duplicated / incorrect / exploratory—— 收敛成用户视角的四个大类,配上本仓 5 个分析工具的选择决策树, 并用一条真实轨迹的消融数据回答一个扎心的问题:让 LLM 当裁判判"哪步是浪费",它判得准吗?(步级 F1 只有 24.88%)

生成时间:2026-09-05 · 版本 v0.2 · 生成 Agent:DeepSeek Harness (LLM: glm-5.3) · 素材:wiki/38 step 分类学 · 载体:agentsoft-research-platform

概览

4
问题大类(用户视角)
2
论文分类体系
5
本仓分析工具
24.88%
LLM 判冗余的步级 F1 上限
项目说明
本卡定位「轨迹分析与过程评估」单元第 3 讲 · 学会诊断轨迹(问题视角 + 工具选择)
前置知识八阶段模型与弯路(trajectory-1-reading);PRA 量表(trajectory-2-pra)
读完会什么拿到一条轨迹的"问题 step 清单",能按四分类归位、说清两套论文定义的差异;面对"我想查 X 类问题"能直接选出该跑哪个工具;理解"LLM judge 不能当唯一可信源"的工程含义
真实数据本仓 experiments.db 已有 49 条多方法消融洞察 + 5760 行步骤标注;本页第 4 篇用的消融案例全部可复现

第一篇 · 四大类:用户视角的统一入口

第一篇 · 2 套论文定义 × 1 张对照总表
分类不是目的——目的是让"这条轨迹哪里有问题"变成可讨论、可工具化的问题。
第 1 讲 · 1 张总表

无用 / 冗余 / 低效 / 错误:两套论文定义在四个格子里的对照

大类(用户视角)AgentDiet 定义(FSE 2026)RedundancyBench 定义(2026.05)关键差异
无用 useless:信息根本不相关(读 5000 行文件只用 50 行;读与 bug 无关的文件) exploratory:探索性调用,未直接贡献最终目标 AgentDiet 看"读了不相关";RB 看"探了但没用上"——边界模糊
冗余 redundant:信息重复出现(编辑参数在工具结果里又重复一遍) duplicated:与历史 step 完全一致(同工具 / 同参数 / 同输出) AgentDiet 看"信息出现多次";RB 看"step 整体重复"(范围更窄)
低效 expired:曾有用但已过时(view 后紧跟编辑,view 已过期) (无直接对应;exploratory 部分 + 漫游) "过期"视角是 AgentDiet 独有;项目里用 PRA D5 补漫游维度
错误 (无独立类) abnormal:tool call 失败异常;incorrect:调用与任务无关或参数错 错误类是 RB 独有的研究空白填补——AgentDiet 不覆盖
核心洞察:冗余类覆盖最完整(两篇论文都关注、工具最成熟);错误类是 RB 独有;低效类是边界模糊区(靠 expired + 漫游两个视角拼起来)。 项目策略:不硬合并两套标签(语义边界模糊,硬合并会丢信息)——保持各工具独立输出,在 Web 端做对照展示,冲突本身是信息。

第二篇 · AgentDiet:三类浪费与滑动窗口 LLM 反思

第二篇 · 压缩视角(3 类浪费 + 1 个算法 + 1 组数字)
AgentDiet 关心的是成本:轨迹里的浪费内容能不能删掉,让 Agent 更便宜地跑下去。
第 2 讲 · 3 类 + 1 算法

useless / redundant / expired:从 100 条真实轨迹里提炼的浪费本体

问题背景(为什么"删浪费"值钱)
  • Agent 轨迹单 issue 平均 48.4K token / 40 步,累计约 1M token
  • Claude 4 Sonnet 在 OpenRouter 上 99% 的 token 是输入轨迹——越到后面,历史越长、越贵、越慢
  • KV Cache 消除不了问题:仍然要计算、仍占显存与 I/O
三类浪费的定义与典型场景(论文基于 100 条 Trae Agent × Claude 4 Sonnet 实证)
类别定义典型场景
useless信息根本不相关,可安全删除__pycache__ / .egg-info / make verbose 输出 / 打开 5000 行文件只读 50 行
redundant信息重复出现,删副本不丢信息编辑调用的 new_str 在工具结果里又重复一遍;之前已检索过的内容再检索一次
expired曾有用但已过时grep 找根因时打开多个文件,找到后其余文件作废;view 后紧跟编辑,view 已过期
方法:滑动窗口 LLM Reflection(Algorithm 1)
参数: a=2 延迟步数 · b=1 上下文窗口 · θ=500 token 阈值
for s in range(a, len(steps)):
    target = steps[s - a]                      # 延迟评估的目标步
    ctx    = steps[max(0, s - a - b) : s]      # 它之后的上下文
    waste  = LLM_reflect(target, ctx)          # 4 段式 prompt 判定三类浪费
    if waste.tokens > theta:                   # 浪费量超阈值才计入
        record(target, waste.category, waste.tokens)
# prompt 4 段: 高阶任务 → 输入输出格式(XML) → 三类浪费的例子 → 防信息丢失 guideline
必读论点(论文 §2.3.2):LLM 不知道何时该做轨迹压缩——必须由外部强制反思模块触发,不能依赖 LLM 自决。 这是 AgentDiet 的架构基石:靠 Agent"自己觉得该省了"是靠不住的,省钱必须是 harness 的制度设计。 实测效果:input token ↓39.9%–59.7%,总成本 ↓21.1%–35.9%,agent 性能持平。
素材:wiki/38 §2 工程落地:agent_diet_analyzer

第三篇 · RedundancyBench:检测本身是难题

第三篇 · 检测视角(4 类异常 + 1 个 24.88% 的警示)
AgentDiet 解决"如何压缩";RedundancyBench 追问"如何检测"——并给出了一个泼冷水的答案。
第 3 讲 · 4 类 + 1 警示

abnormal / duplicated / incorrect / exploratory + F1 天花板

类别定义典型场景
abnormaltool call 失败(异常情况)网络错误 / Service unavailable
duplicatedtool call 与历史 step 完全一致同一个 get_reservation_details() 调两次
incorrecttool call 与任务无关或参数错误取消航班却查流量;未拿到 user_id 就调 user-info 工具
exploratory探索性但未直接贡献最终目标用户要 FA-1003,agent 同时查 FA-1002 和 FA-1003——查 FA-1002 算 exploratory
标注有多贵:200 条成功轨迹 × 8000+ 步

论文的标注 pipeline:3 轮标注——3 条启发式规则自动预标注 → 6 位 AI agent 专家人工校验(每条约 1 小时) → 交叉验证 + 共识迭代。真值本身就很贵。

关键发现:3 种判定方法的步级 F1
图 1 · RedundancyBench 步级 F1:最强的 Window-to-One 也只有 24.88%,部分方法差于随机猜测。红条为最佳方法。
24.88% 意味着什么(工程上最重要的一页): 即使最强 LLM + 整条轨迹 + 反事实推理,自动检测冗余 step 的能力也远低于人类。 三条设计结论直接写进了本仓 redundancy_detector:
  • LLM judge 不能作为唯一可信源——必须有启发式兜底(默认 mode=heuristic,0 LLM 成本)
  • 启发式优先 + LLM 兜底 + 双写审计——LLM 判定只入 JSON 落盘(带完整 provenance),不入数据库"可信表"
  • 同轨迹多方法对照——把启发式 / LLM / hybrid 的结果并排呈现,由人判断(下一篇的消融案例就是实例)
素材:wiki/38 §3 工程落地:redundancy_detector

第四篇 · 真实数据:同一条轨迹,五种判定

第四篇 · 消融案例 + 工具选择决策树
分类学学完了,看真实数据长什么样——以及"我想查 X,该跑哪个工具"。
第 4 讲 · 1 消融 + 1 决策树

案例:django__django-11133(144 步)的 5 份判定书

本仓 experiments.db 的实验 20(django__django-11133,144 步轨迹)被 5 个分析通道各判了一次——同一条轨迹,冗余率从 0.7% 到 42.4%:

图 2 · 同一条 144 步轨迹的 5 份判定(experiments.db 实验 20 实测):蓝=启发式冗余,红=LLM 冗余,橙=AgentDiet 浪费率。all_to_all·LLM 判 61 步冗余(abnormal 14 / duplicated 27 / exploratory 14 / incorrect 6),window_to_one·启发式只判 1 步。
怎么读这 60 倍的差距:不是"谁对谁错",而是方法视野不同—— 启发式只抓机械可判的重复(same tool / same params);LLM 用全局语义判"这步对最终目标有没有贡献"。 结合上一篇的 24.88% F1 警示,正确的消费姿势是:两份结果都看,把分歧点当作"需要人来看一眼"的信号,而不是赌一边。 另一个案例(实验 1,sympy__sympy-21614,38 步):AgentDiet 判浪费率 22.6%(8500/37569 字符全是 useless 类),评分 77.4 / B 级——"大部分步骤有效,但两成内容白读"是很多轨迹的常态。
工具选择决策树(按问题反向选)
flowchart TB Q["我想分析一条轨迹里的问题 step"] --> A{"想要什么?"} A -->|语义级浪费 解释| T1["agent_diet_analyzer
LLM reflection · useless/redundant/expired
无 LLM key 自动降级启发式"] A -->|step 级冗余 异常| T2["redundancy_detector
4 类全覆盖 · 默认 heuristic 零成本
可选 llm / hybrid 双写审计"] A -->|综合可靠性 评分| T3["agent_process_evaluator(PRA)
七维 100 分 · 一票否决
见第 2 讲"] A -->|只要数字 快| T4["trajectory_analyzer
纯启发式 7 规则 · 0 LLM 成本 · 秒级"] A -->|给每步加可读描述| T5["step_annotator
不分类 只描述 · 喂给其他工具当 context"]
图 3 · 五工具决策树:先问"要什么",再选工具——同一条轨迹可以被多个工具同时分析,结论不一致时不仲裁、并排呈现。
思考与讨论
  • 图 2 里启发式与 LLM 判定差 60 倍——如果你是训练数据筛选员,用哪份结果筛轨迹?说明理由(提示:误删好步骤 vs 漏掉坏步骤,代价不对称)。
  • "expired(过时)"类在 RedundancyBench 里没有对应——找一个你自己的例子:哪一步"当时有用、后来作废"?该在它作废的瞬间删掉,还是保留作审计证据?
  • 为什么不把 5 个工具合并成一个"超级分析器"?说出至少两条架构理由。
素材:wiki/38 §5-§6 下一篇:点+线与 Linting

收口:从"读轨迹"到"开药方"

一页总结:问题 step 四分类(无用=读了不该读 / 冗余=做了重复的 / 低效=做了过时的 / 错误=做错了的) 统一了两篇论文的 7 个标签;压缩(AgentDiet)与检测(RedundancyBench)是两个不同的问题,一个工具的输出不能当另一个的真值; 24.88% 的 F1 天花板决定了"启发式优先 + LLM 兜底 + 双写审计"的工程姿势;真实消融数据(0.7% vs 42.4%)提醒我们:判定分歧本身就是信息。