智能体使用测试与验证技术的效果究竟如何?

智能体使用测试与验证技术的效果究竟如何?

Hacker News 摘要

原标题:How well do agents use test/verification techniques?

本文探讨了编程智能体在没有测试专家深度指导的情况下,使用各种测试与形式化验证技术和工具时的实际表现。

实验背景与设计

虽然通过有效的测试手段更容易提升软件质量,但随着编程智能体的使用增加,实际软件质量似乎在下降,这说明开发者默认的使用方式可能存在问题。

作者设计了一项实验,模拟没有测试专业知识的用户,仅通过提示词简单要求智能体使用某种测试方法或工具,观察这能否提高实现的正确率。实验主要基于用 Rust 语言实现 Zstd 算法的任务,并在 IMAP RFC 等其他任务上进行了交叉对比。

评测测试了26种提示词条件和4个特定的技能包(Skills):

• 测试与验证条件:ACL2、Alloy、审查并模糊测试高风险区域、先审查、Creusot、默认(无额外指令)、差分测试、模糊测试、Hegel、Insta、智能体自主判断、Kani、Lean 4、不要犯错、变异测试、基于属性的测试、Proptest、QuickCheck、rstest、Rust 内置测试框架、SMT 求解器、Spin、测试驱动开发(TDD)、TLA+、Verus 等。

• 技能包:官方 Hegel 技能、ECC Rust 测试技能(在 GitHub 上有大量星标)、Trail of Bits 基于属性的测试技能,以及作者自己快速写的一个简短测试技能。

总体实验结果

实验结果显示,没有任何一种方法能够大幅超越基准表现:

• 默认表现较好:不给任何额外指令的默认条件,其表现反而明显高于平均水平。

• 技能包大多表现不佳:推荐的现成测试技能包普遍表现不佳,不仅没有提升正确率,反而大幅增加了 Token 消耗和成本。作者自己编写的简短技能表现相对最好,因为它重点在于引导智能体避开不良习惯。

• 测试驱动开发(TDD)表现较差:被要求使用 TDD 时,智能体生成了更多的测试用例,但写出的测试质量很差,容易在测试中固化错误逻辑,导致最终代码正确率下降。

• 形式化方法未达预期:智能体虽然能使用形式化验证工具,但往往只证明了无关紧要或微不足道的小属性,没有触及容易出错的核心逻辑。

智能体在各类测试工具中的具体表现

• 形式化验证工具(Verus、Lean 4、Alloy、Spin、TLA+、ACL2、Creusot):智能体几乎不会用这些工具来直接验证复杂的业务代码。它们通常在写完代码后,做一些显而易见的算术或边界断言(例如证明简单的区间条件),甚至写出等价于恒真式的无意义证明。形式化建模往往脱离实际代码实现,无法发现真正的算法漏洞。

• 基于属性的测试与模糊测试(QuickCheck、Proptest、Hegel、Fuzzing):智能体在生成随机输入时缺乏结构性思考,倾向于生成完全无序的随机字节,导致测试只反复命中了最外层的参数校验或错误拦截路径,无法深入内部复杂状态。不过,当模糊测试偶然生成了结构化数据,或使用 Proptest 的测试用例缩减功能时,偶尔能发现实际的非微小漏洞。

• 差分测试与快照测试(Differential Testing、Insta):智能体在差分测试中并没有独立写出两套实现,而是几乎照抄相同逻辑,导致两套代码包含相同的缺陷;在快照测试中,智能体通常只是把普通的单元测试套在快照测试的框架里。

• 测试驱动开发与内置测试(TDD、Rust 内置框架、rstest):智能体产出了大量固定输入和输出的小型单元测试。这种测试容易让智能体产生误判,把错误的输出当成预期结果写进测试,并在后续的调试迭代中强化了这种错误。

• 代码审查(Audit):在生成代码后要求智能体进行审查,能够发现一些问题并促成修改,在高计算资源下正确率较高,但这大幅增加了 Token 消耗。

为什么智能体不擅长测试

• 缺乏对抗性与深度思考:智能体写测试时表现出类似于醉汉在路灯下找钥匙的倾向,只去测试容易测试和容易通过的地方,而不是真正有风险的地方。

• 过度依赖低质量的单元测试:目前的模型训练可能偏向于编写常规的固定断言单元测试,而不是编写能探索状态空间的模糊测试或性质测试。

• 形式主义:只要给出一个测试方法或工具的名称,智能体通常只是表面上引入该工具,内部仍然遵循它原本那套低效的测试习惯。

结论与建议

• 单纯指定工具名称无效:仅仅在提示词中加入使用 TDD 或使用某某验证库,往往会引发无意义的工作量激增,甚至降低代码正确率。

• 有效的交互方式:智能体本身具备一定的测试与审查知识,但需要人类提供明确的结构化引导。例如要求智能体先识别高风险边界情况、生成探索复杂状态的非对称测试用例、或者在独立上下文环境下重新推导结果。

• 技能包的设计思路:针对智能体的技能包不应写成冗长的人类教程,而应简短有力,专注于纠正智能体的默认不良行为偏好。


原文:https://danluu.com/agentic-testing/

评论:https://news.ycombinator.com/item?id=49605246

Report Page