MineExplorer 的判定看整段执行 / 中途改计划也会被记进结果

文章导读
MineExplorer 这类执行体在判定时,通常不是看最后一步是否成功,而是把整段执行记录当成一次结果来判断:中途改过计划,改动本身也会被记进判定结果里。所以“agent 中途换策略算不算失败”这个问法其实问偏了,真正要处理的是两件事:一是切换点在记录里能不能被定位,二是读结论的人知不知道结论覆盖的是哪一段执行。做法上建议在每一步上带计划版本标记,按切换点分段呈现结果,并在结论行写明判定口径;如
📋 目录
  1. A 在执行记录里标出策略切换发生在哪一步
  2. B 区分主动改计划和被失败逼着补救
  3. C 把切换前后的执行结果分开呈现
  4. D 写结论时说明判定口径来自哪里
A A

MineExplorer 这类执行体在判定时,通常不是看最后一步是否成功,而是把整段执行记录当成一次结果来判断:中途改过计划,改动本身也会被记进判定结果里。所以“agent 中途换策略算不算失败”这个问法其实问偏了,真正要处理的是两件事:一是切换点在记录里能不能被定位,二是读结论的人知不知道结论覆盖的是哪一段执行。做法上建议在每一步上带计划版本标记,按切换点分段呈现结果,并在结论行写明判定口径;如果记录里没有切换标记,就不要把整段结果当成单一路径的结果来解读。

MineExplorer 的判定看整段执行,中途改计划会被计入结果,这不等于判定失败,但会让“一个总分”变得不可解释。处理方向:在执行记录里给每一步打计划版本和触发来源,按切换点分段汇总,结论行标注判定口径覆盖了哪几段、是否包含计划变更;口径不明时,只陈述观测到的事实,不下“成功/失败”的定性结论。

在执行记录里标出策略切换发生在哪一步

切换点标记的目标很朴素:让后来的人能回答“这一步之前和之后,agent 在做什么不同的事”。推荐在 step 级别加三个字段,字段名按你实际记录格式替换,语义保持即可:plan_revision(计划版本号,从 0 递增)、change_trigger(触发来源)、change_note(一句话说明改了什么)。

{
  "step_id": 7,
  "plan_revision": 1,
  "change_trigger": "tool_error",
  "change_note": "原计划读取配置文件失败,改为先列目录再读取",
  "goal": "定位配置项并读出当前值",
  "goal_changed": false,
  "observation": "..."
}

前后各保留哪些字段,建议按下面的分工固定下来:切换前的步骤要留住原计划的步骤序号、原计划目标、该步的观测结果和失败原因;切换点本身要留住触发来源、发起者(人指定还是执行体自主)、时间戳、变更说明;切换后的步骤要留住新计划版本、新目标、首步输入和与切换前观测的衔接关系。少任何一段,回溯时都只能靠猜。

验证方式很直接:从执行记录里把所有变更事件筛出来,看能不能和步骤序号对上。

# 字段名按本次记录的实际格式替换
jq -r '.steps[] | select(.plan_revision != null and .change_trigger != null)
  | [.step_id, .plan_revision, .change_trigger, .change_note] | @tsv' run.jsonl

如果这条命令筛出的切换点位置,和你人工复盘的印象对不上,先修记录,再谈判定。

区分主动改计划和被失败逼着补救

这两类行为在结果里的含义完全不同:主动改计划通常是执行体在信息更充分后调整路径,目标没变;被失败逼着补救是原路径走不通后的降级动作,往往伴随目标收窄。判据用三条就够。

MineExplorer 的判定看整段执行 / 中途改计划也会被记进结果
判据主动改计划失败后补救
触发来源执行体自主判断或人工指定,前面没有硬失败工具报错、超时、校验不通过等失败事件之后
时间点切换点与失败事件无先后绑定关系切换点紧跟在失败事件之后
前后目标是否一致目标字段基本不变,只改路径和步骤目标被收窄、被替换或增加限制条件

三条里有两条指向补救,就按补救记录;只有触发来源明确且目标未变,才记为主动调整。拿不准时,在记录里两个标签都写上,比强行归一类更安全。

把切换前后的执行结果分开呈现

一个总分最容易掩盖的恰恰是关键差异:切换前几步全失败、切换后几步全成功,合并成一个“部分成功”,读者什么也判断不出来。建议按 plan_revision 分段呈现,每段给四项:段内步骤区间、目标、成功/失败步数、该段终止原因。

执行分段:
  段 0(step 1-6,目标 A):失败 4 步,因工具报错终止,未完成
  段 1(step 7-11,目标 A):成功 5 步,正常结束
合并说明:总分只覆盖段 1;段 0 的失败不计入成功率,但计入执行时长和调用次数

合并汇总时有几个注意点:一是合并行必须写明覆盖的步骤区间或段号,不能写“整体成功”;二是失败段不能因为“后面补上了”就从记录里删掉,补救成功不等于原路径成功;三是如果判定规则本身不允许中途改计划,那结论要写成“该次执行不满足单计划判定条件”,而不是“失败”。

写结论时说明判定口径来自哪里

结论行带口径,读者才知道自己看的是什么。做法是在结论上方或同一行加一段标注:判定依据来自整段执行记录还是末段结果、记录里包含几次计划变更、判定规则取自哪个配置文件或页面上的哪个开关。

判定口径:整段执行记录(含 1 次计划变更,step 7)
规则来源:judge 配置 judge.profile 当前生效项(页面「判定设置」可见)

口径不明时的保守写法:只描述观测,不定性。比如“本次执行共 11 步,其中 step 7 发生一次计划变更,变更前 4 步失败、变更后 5 步成功;若判定规则只取末段结果,结论会与整段判定不同。”这种写法不能给读者一个干脆的结论,但能保证结论不失真,也让下一个人知道该去确认哪条规则。需要结合环境确认的是判定规则的生效范围:同一份记录在不同判定规则下可能得出不同结果,把口径写出来,比把结论写强更有用。