当前位置:首页 > 编程开发 > 正文

Agent 的命令执行靠不靠谱:我用 20 条命令测了一次

约 4133 字 · 预计阅读 11 分钟
一句话总结:BashReliability 这个指标量的是「Agent 生成的命令能不能跑通」。我拿 20 条命令实测了一遍:按退出码算,13 成 7 败,得分 +30%;把「退出码 0 但语义已经变了」的 5 条也算进去,只剩 +5%。同一个 Agent,两种口径差 25 个百分点。问题在于退出码只告诉你「没报错」,不告诉你「做对了」。

Kimi K3.1 Pro 那批数据里,最让我在意的是 BashReliability 从 -4.5% 提到 +7.9%。

一个指标能从负数涨到正数,说明它衡量的是某种「及格线」以上的东西——不是「好一点」,是「从不行到行」。

我想知道这个指标具体怎么算,所以自己搭了一套。

一、BashReliability 这个指标在量什么

Agent 的命令执行靠不靠谱:我用 20 条命令测了一次

图 1:同样 20 条,按退出码算和按语义算,得分差 25 个点

先说定义。我从材料里能确定的是:它有正负,负数表示比基准差。

按这个特征,合理的定义是:

Reliability = (成功数 - 失败数) / 总数

范围 -100% 到 +100%。全成就是 +100%,全败是 -100%,成败各半是 0。

Kimi 的 K3 是 -4.5%,意味着失败略多于成功。K3.1 Pro 是 +7.9%,成功略多于失败。

这个指标衡量的不是「命令写得好不好」,是「给一个任务,Agent 生成的命令有几条能直接跑」。

在真实工作里,这条线很关键。Agent 说要查日志,给你一条 grep,报错;再给一条,又报错。你得一条条看、一条条改,还不如自己敲。

二、20 条命令,一半对一半埋了坑

我造了 20 条模拟 Agent 输出的命令。一半是对的,一半埋了常见的坑。

安全约束先说:只跑只读命令,删文件、改系统的一律不执行。白名单里是 ls、pwd、echo、cat、grep、wc、head、find、python -c 这些。

判定的核心就三行:

def run(cmd):
    r = subprocess.run(cmd, shell=True, capture_output=True, timeout=8)
    return r.returncode, r.stderr.decode("utf-8", "ignore").strip()

success = (code == 0)

跑完,20 条里 13 条成功、7 条失败。

失败原因分布:

原因 条数 占比
路径不存在229%
其他229%
参数拼错114%
类型错误(对目录用 wc)114%
环境不对(非 git 目录跑 git)114%

按公式算:(13 - 7) / 20 = +30.0%。

这是一份「还过得去」的成绩单。比我预期的高。

三、按退出码算,+30%

+30% 意味着什么?

在这个口径下,Agent 生成的命令十条里有六条半能跑通。对日常任务来说勉强可用——你得盯着,但不至于全废。

但这个数字有个大问题:它把「没报错」当成了「做对了」。

我给那 20 条命令做语义检查的时候,发现了 5 条这样的:

grep -n 'def' tools/seo_check.py --line-number   重复参数,靠容错跑通
head -n -5 tools/seo_check.py                    负行数语义变了(变成除末尾 5 行)
python -c "print(1+1)" --verbose                 多余参数被静默忽略
find tools -name *.py                            通配符被 shell 提前展开,语义已变
echo $UNDEFINED_VAR                              变量未定义,静默输出空

这 5 条的退出码都是 0。工具不认为它们错了。

但它们全都不是你以为的那个意思。

四、把语义可疑的也算上,只剩 +5%

同样的 20 条,换个口径:

真实成功 = 13 - 5 = 8 条
失败 = 7 条
严格得分 = (8 - 7) / 20 = +5.0%

+30% 变成 +5%。同一个 Agent,同一批命令,差 25 个百分点。

这 25 个点就是「静默错误」的代价。

它的危害比报错大得多。报错你会去看;静默错误你不看,直接当成功了继续往下走。等到三步之后发现不对,已经查不出是哪一步坏的。

这和我之前写过的 Agent 三件坏事是同一个病:谎报完成。

五、为什么退出码靠不住

三条原因。

第一,工具本身在容错。 grep 允许重复给参数,head -n -5 是合法语法(表示除末尾 5 行),python -c 后面的多余参数会被当成 sys.argv 的一部分而不是报错。这些设计在命令行时代是体贴,在 Agent 时代是坑。

第二,shell 会替你做决定。 find tools -name *.py 里的 *.py 如果不加引号,shell 会先展开成文件名列表,然后传给 find。find 拿到的是 -name seo_check.py publish_online.py ...,只取第一个,其余当成起始路径。这条命令能跑通,但结果不是你想要的。

第三,空结果是合法的。 echo $UNDEFINED_VAR 输出空行,退出码 0。grep 没匹配到内容时退出码是 1(这个还算好),但很多工具对「没找到」和「找到了」都返回 0。

要判断命令做没做对,得看输出,不能只看退出码。

六、自己测的时候要注意什么

如果你要给自己的 Agent 打这个分,四条建议。

一、用例要覆盖「看起来对但语义变了」的情况。 只测「跑不跑得通」,分数会虚高 20 个点以上。

二、分类比总分有用。 +30% 这个数字看不出该改什么。按失败原因拆开,你才知道是「路径感知差」还是「参数记不牢」。

三、样本要够。 20 条只能看趋势,不能下结论。要比较两个模型,至少 200 条,而且用例得来自真实任务而不是编的。

四、环境要固定。 同一条命令在不同目录、不同系统上结果不同。我这份测试依赖 tools/ 目录存在,换台机器就跑不了。

七、边界

这 20 条命令是我编的,不是真实 Agent 输出。 所以 +30% 和 +5% 这两个数字只说明方法可行,不代表任何模型的实际水平。

语义检查是我人工标的。 哪条算「语义可疑」有主观成分。比如 head -n -5 严格说也是合法用法,只是和「取前 5 行」的意图不符。换个标注标准,数字会变。

「20 条里 5 条静默错误」这个比例不能推广。 我是刻意埋了坑的,真实场景的静默错误率应该低得多。但低不等于没有。

和 Kimi 的 BashReliability 不是同一个指标。 只是思路相同。它的具体定义、评分基准、样本构成,我都没拿到。数字不能横向比较。

我只测了「命令能不能跑」,没测「跑了之后结果对不对」。 后者需要任务级的验证,比这个难一个量级。

站内另一篇讲决策模型为什么错判比漏判严重,那篇的结论在这里同样成立:评测口径差一点,结论差很多。

参考资料

目录导航
  • 一、BashReliability 这个指标在量什么
  • 二、20 条命令,一半对一半埋了坑
  • 三、按退出码算,+30%
  • 四、把语义可疑的也算上,只剩 +5%
  • 五、为什么退出码靠不住
  • 六、自己测的时候要注意什么
  • 七、边界
    • 参考资料
  • 相关文章:

  • 不用零知识证明也能验来源:30 行写个可复现校验
  • 从 token 时间戳反推推理服务:抖动一大就失效
  • 同一个模型自问自答有用吗:写代码测 Role-Agent 的收益
  • PenguinHarness:把 Agent 拆成文件,我写了个最小版
  • 跨任务保持上下文:和 message threads 不是一回事
  • Computer Use 的通过率怎么算:三层条件,一个判定器
  • 上下文压缩三种策略实测:省到 100 token,就得接受会漏
  • 腾讯混元 Hyra 2.0:三层 Agent 做科研,从解题变成造工具
  • 发表评论

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。