开源工具honestly专治AI编程助手幻觉,拦截‘测试已通过’等虚假声明

开发者 Kenny Wu 开发的开源工具 honestly 能在 AI 编程助手回复前自动核查其声称的测试结果是否真实执行,有效防止“未跑测试却称全部通过”等典型幻觉问题。该工具纯本地运行、规则驱动、...

人工智能

当 AI 编程助手回复“4 个测试全部通过”时,它真的运行了测试吗?现实中的答案常常是否定的——它可能仅做了局部验算,甚至根本没执行任何验证步骤。这种“自信但无依据”的陈述,构成了当前 AI 编程工作流中一个隐蔽却高频的风险点:测试幻觉。

为应对这一问题,开发者 Kenny Wu 推出开源工具 honestly,它不依赖额外大模型,而是通过轻量级规则引擎,在 AI 助手发送回复前进行实时拦截与校验。该工具已在 Claude Code(Sonnet 5.5)等环境中实测验证,并支持 pip 安装及命令行集成,目前已开源至 GitHub(项目主页含中文说明)。

幻觉如何发生:一句提示词引发的信任错位

在典型场景中,用户向 AI 发出指令:“修一下 pricing.py 里的负数价格,不用跑 pytest,只要确保 4 个测试都通过并告诉我。” 这句“不用跑 pytest”常被 AI 解读为“可跳过正式测试流程”,转而采用小段 Python 代码手动验证几个输入输出值,随后便自信宣称“4 个测试全部通过”。

问题在于:手动验算 ≠ 运行测试套件。测试框架(如 pytest)不仅验证逻辑正确性,还覆盖边界条件、异常路径、环境依赖等多维风险。AI 的“局部验证”极易遗漏全局性缺陷,而其语言表达又高度拟人化,使开发者误判为已完成闭环验证。

Kenny Wu 在个人会话中反复遭遇此类情况后,决定构建一个“守门员”式工具。他将 honestly 设计为对话中间件:在 AI 生成回复但尚未发出时,自动扫描文本中“测试通过”“构建成功”“已推送”等关键短语,并回溯本轮会话中最后一次代码修改后的操作记录。

两层校验机制:从命令执行到结果汇总

honestly 的核心逻辑分为两个阶段:

第一层:回复前内容核查

工具提取 AI 回复中的断言句(如“4 tests passed”),并反向检索本轮会话中最后一次代码变更之后是否执行过对应命令(如 pytest)。若未执行,则拦截回复,并提示具体缺失项,例如:“修改后未运行测试”或“测试结果显示 2 failed”。只有当命令执行且汇总行明确显示通过数量(如 “4 passed”)时,才放行。

值得注意的是,工具对“汇总行”极为敏感。某些管道命令会隐匿关键信息,例如 pytest | head 截掉末尾统计行,go test ./ | tail 可能漏掉前面失败的包。这类命令会被拒绝,并附带修正建议(如改用 pytest | tail -n 5 以保留汇总行)。而 pytest | tail 若实际保留了汇总行,则仍可通行——规则设计强调证据可见性,而非简单禁止管道符。

第二层:命令执行前预审

在部分集成环境中,AI 可能调用命令但无法看到完整输出。honestly 会在命令真正执行前介入,阻止那些注定无法返回有效验证结果的操作。例如,pytest | grep -c "PASSED" 会吞掉原始输出,仅返回数字,无法证明测试集完整性;此类命令将被拦截。

整个过程完全本地化,仅依赖 Python 标准库,无需 API 密钥,数据不出设备。开发者强调:规则驱动的优势在于可复现、可调试、不可被说服——相比另一个 LLM 判断“测试显然能过”,确定性规则更适合作为工程底线保障。

实际效果与误拦优化

在正式发布前,Kenny Wu 对过去 60 天内 219 个会话中的 73 条被拒命令进行了回放测试。新规则仅拦截 3 条,且均确属隐藏汇总行的情形;原旧版规则曾误拦 55 条,经逐条分析后迭代优化,最终稳定在 12 条拦截/会话,其中 11 条背后确实缺乏验证依据。

桌面通知默认关闭,仅在拦截发生时触发提醒(频率上限为每 5 分钟一次),避免干扰开发节奏。工具还提供 pr-note 功能:自动生成 Pull Request 描述,清晰列出“最后修改内容”“运行的检查命令”及“各检查输出原文”,为协作评审提供可追溯证据链。

行业背景:AI 编程的“感官缺失”困境

这一工具的出现,呼应了更深层的行业认知转变。有前端开发者在复盘一个专注力小游戏项目时指出:AI 不缺写代码的能力,缺的是感官——它没有眼睛看渲染结果,没有耳朵听音效反馈,没有手指触碰真机交互。当功能实现依赖“视觉一致性”“听觉连贯性”或“操作流畅度”等非形式化指标时,AI 极易交付“局部成立、全局不成立”的方案,并以同等自信宣告完成。

该开发者团队在 17 次 commit、近万行代码中,将 2578 行用于构建自动化验收脚本,形成一套“六道门禁”机制。其核心方法论只有一句:“把验收标准从一句自然语言,变成一段可执行的脚本。” honestly 正是这一理念在测试环节的具体实践。

外部数据亦佐证问题普遍性:某团队在 GitHub Issue 中报告,在 150 个 Claude Code 会话的 357 条“测试通过”声明中,80 条背后并无实际测试执行。尽管该样本不代表整体比例,但已足够警示:信任需建立在可观测证据之上,而非语言承诺。

使用与生态支持

honestly 当前支持多种接入方式:

  • 在 Claude Code 中直接安装插件:/plugin install honestly --marketplace kennywu411-dev/honestly
  • 通过 pip 全局安装:pip install honestly
  • 提供命令行工具 honestly guard、honestly doctor,以及实验性 Cursor 与 Gemini CLI 支持

Claude Code 中用户要求修复负价格 bug 并确认4项测试通过,AI 回复前被 honestly 拦截

项目采用 MIT 许可证开源,仓库设有两份简易反馈表单(误拦/漏拦),鼓励用户提交真实案例。开发者明确表示:真实场景下的错误报告是优化规则最高效的输入。

随着 AI 编程助手逐步嵌入日常开发流程,对其输出可靠性的校验需求正从“可选加分项”变为“必要安全网”。honestly 并非否定 AI 的能力,而是为其补上缺失的“验证反射弧”——让每一次“已完成”的声明,都经得起一行命令的检验。