首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
给Agent写测试-工具调用的回归怎么保
📅 2026/11/5 2:03:51
✍️ 爱科研究院
👁 阅读 3,247
给 Agent 写测试工具调用的回归怎么保改了两句提示词昨天还好好的 Agent 今天开始乱调工具。想写测试可 Agent 的输出是模型生成的每次都不一样断言写什么这是所有写 Agent 的人迟早撞上的墙。答案是把「测行为」和「测文字」分开行为可以断言文字不必。三层防线把这件事说清楚。三层防线工具单测纯函数老手艺循环集成测mock 模型驱动断言行为评测集固定问答对回归对比提示词改动敢合并第一层工具单测工具是普通的 Java 方法入参出参确定单元测试原样适用这一层没有任何新东西。Tool只是便签测试测的是方法本身。把工具写成纯函数不依赖模型、不依赖上下文这层测试就是免费的。第二层循环集成测这一层是 Agent 测试的核心。思路是把不确定的那头模型换成确定的脚本只测你的循环和工具协作是否正确。Mock 模型返回预设的 tool_use你的循环照常解析、执行、回填然后断言三件事。该调的工具被调了用户问天气就必须调 get_weather不能调 get_user。参数是对的。city 的值是「北京」不是「上海」。回填是对的。tool_result 的配对 ID 与 tool_use 对上格式没散。文字不必断言相等模型的措辞会变行为不该变。这就是「测行为不测文字」的分界记住一句话断言工具的调用不要断言模型的措辞。第三层评测集攒一批固定的问答对问题、期望的行为、期望的工具调用每次改提示词或换模型就全量跑一遍输出行为快照并与上次对比。退没退步有数据说话改动才敢合并。提示词和评测集要一起版本化它们是一对就像代码和测试。评测集的质量比数量重要二十个覆盖典型场景的用例胜过两百个重复的闲聊。亲手跑下面用一段 Java 写一个自带断言的回归演示mock 模型返回预设工单跑完整循环检查工具调用。断言不过直接抛异常这就是一个最简测试运行器。直接运行java AgentRegression.javaJDK 16用了 record 语法。// 直接运行java AgentRegression.java// agent 回归测试mock 模型驱动循环断言工具行为。importjava.util.ArrayList;importjava.util.List;publicclassAgentRegression{recordToolCall(Stringid,Stringname,Stringargs){}staticclassToolTracker{finalListToolCallcallsnewArrayList();Stringexecute(ToolCallcall){calls.add(call);returnswitch(call.name()){caseget_weather-call.args()晴25 度;default-thrownewIllegalStateException(不该被调的工具call.name());};}}// mock 模型按脚本返回工单替掉不确定的那头staticToolCallmockModel(StringuserMessage){if(userMessage.contains(天气)){returnnewToolCall(tu_1,get_weather,北京);}returnnull;}staticvoidrunLoop(StringuserMessage,ToolTrackertracker){ToolCallcallmockModel(userMessage);if(call!null){Stringresulttracker.execute(call);// 工单与回执的配对在真实实现里靠 idSystem.out.println(回填 tool_resultresult);}System.out.println(生成最终回答略。);}staticvoidassertTrue(booleanok,Stringmessage){if(!ok){thrownewAssertionError(回归失败message);}}publicstaticvoidmain(String[]args){ToolTrackertrackernewToolTracker();runLoop(北京今天多少度,tracker);// 断言行为三件事assertTrue(tracker.calls.size()1,应该恰好调用一次工具实际 tracker.calls.size());assertTrue(tracker.calls.get(0).name().equals(get_weather),应该调 get_weather);assertTrue(tracker.calls.get(0).args().contains(北京),参数里应该有北京);System.out.println(回归通过该调的调了参数对了。);// 反例改坏的提示词让模型调错工具断言立刻抓住ToolTrackerbadnewToolTracker();bad.calls.add(newToolCall(tu_2,delete_user,北京));try{assertTrue(bad.calls.get(0).name().equals(get_weather),应该调 get_weather实际 bad.calls.get(0).name());}catch(AssertionErrore){System.out.println(反例被抓住了e.getMessage());}}}适用边界这一篇管回归的骨架。LLM-as-judge用模型给模型打分、线上的行为监控与告警、以及评测集的自动构造是另外的题。Mock 模型的脚本要随真实行为更新它模拟的是「模型会怎么写工单」模型升级时记得同步。跑完把 Demo 的断言抄进你的 CI从今天起改提示词之前先跑回归改完心里有底。
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/11/5 2:03:51
武汉高级工程师职称评定条件和流程怎么准备?对照评审程序一次过
2026/11/5 2:03:51
从零手写 SPMI Master:Verilog 状态机、时序实现与仿真验证全流程实战
2026/11/5 2:03:51
vLLM 前世今生:从 PagedAttention 到分布式推理引擎的演进之路
2026/11/5 3:09:00
光猫超级管理员权限获取工具:原理、实操与避坑指南
2026/11/5 3:09:00
Claude Code模板仓库实战:从工程化配置到团队协作落地
2026/11/5 3:09:00
Simulink实时路径规划:从建模到动态避障实践
2026/11/5 3:09:00
Univer:开发者优先的开源在线表格基础设施深度解析
2026/11/5 3:09:00
Univer在线表格集成指南:从核心设计到实战踩坑与落地思路
2026/11/5 3:03:59
Rufus U盘启动盘制作教程:GPT/MBR、镜像校验与避坑指南
2026/11/5 0:03:36
多智能体协作系统架构设计与实践优化
2026/11/5 0:03:36
大模型系统性入门实战指南:从原理到部署微调的全链路路线
2026/11/5 0:03:36
鸿蒙文件系统沙箱机制解析与开发实践
2026/11/4 4:08:30
面向复杂光照与角度的宠物面部识别鲁棒性增强策略
2026/11/4 4:08:26
DRV8818PWPR与R7FA8M1AHECBD工业步进驱动实战指南
2026/11/4 4:08:23
STM32与DRV8818双极步进电机驱动方案:从选型到调试全流程解析
2026/11/4 4:08:30
面向复杂光照与角度的宠物面部识别鲁棒性增强策略
2026/11/4 4:08:26
DRV8818PWPR与R7FA8M1AHECBD工业步进驱动实战指南
2026/11/4 4:08:23
STM32与DRV8818双极步进电机驱动方案:从选型到调试全流程解析