首页/新闻资讯/正文详情

给Agent写测试-工具调用的回归怎么保

发布时间:2026/11/5 2:03:43 来源:云帆数科 栏目:资讯中心
给Agent写测试-工具调用的回归怎么保
给 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从今天起改提示词之前先跑回归改完心里有底。

相关推荐

武汉高级工程师职称评定条件和流程怎么准备?对照评审程序一次过
武汉高级工程师职称评定条件和流程怎么准备?对照评审程序一次过

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 2:03:43

从零手写 SPMI Master:Verilog 状态机、时序实现与仿真验证全流程实战
从零手写 SPMI Master:Verilog 状态机、时序实现与仿真验证全流程实战

摘要:本文面向数字电路与 FPGA 开发者,系统讲解一个高鲁棒性 SPMI(System Power Management Interface)主控制器(Master)的完整实现路径。文章从模块定位与功能边界出发,依次覆盖开发环境与文件结构搭建、参数配置与端口信号解析、状态机流转与时序实现、仿真测试平台构… · 2026/11/5 2:03:43

vLLM 前世今生:从 PagedAttention 到分布式推理引擎的演进之路
vLLM 前世今生:从 PagedAttention 到分布式推理引擎的演进之路

1. 引言:为什么需要 vLLM 大模型落地到生产环境时,推理服务往往是最先遇到瓶颈的一环。一个 7B 参数的模型在单张 A100 上跑起来并不难,难的是在并发请求下把吞吐量做上去、把首 token 延迟压下来、把显存用满又不 OOM。2023 年之前&#xff… · 2026/11/5 2:03:43

PhaaS钓鱼即服务产业链解析与防御策略
PhaaS钓鱼即服务产业链解析与防御策略

1. 事件背景与行业影响2023年第三季度,一场针对跨国短信钓鱼团伙的全球打击行动引发安全行业震动。这个被安全研究人员称为"PhaaS三人组"(Phishing-as-a-Service)的犯罪集团,在过去18个月内构建了完整的钓鱼即服务产业链… · 2026/11/5 2:39:01

校园二手交易平台协同过滤推荐系统设计与实践
校园二手交易平台协同过滤推荐系统设计与实践

1. 项目概述校园二手交易平台一直是大学生活中不可或缺的一部分。每到毕业季,大量教材、电子产品、生活用品需要流转;而新生入学时,又急需性价比高的二手物品。传统的校园BBS或微信群交易方式存在信息杂乱、匹配效率低、信任度不足等问题。这… · 2026/11/5 2:39:01

电商API核心功能解析与实战应用指南
电商API核心功能解析与实战应用指南

1. 电商API的价值与应用全景第一次接触电商API时,我盯着技术文档里密密麻麻的接口列表发懵——这些代码究竟能变出什么魔法?直到亲眼见证某母婴品牌通过API将库存同步效率提升20倍,才真正理解这项技术的爆发力。电商API就像连接商业世界的万能… · 2026/11/5 2:39:01

PostgreSQL JSON字段使用指南与优化技巧
PostgreSQL JSON字段使用指南与优化技巧

1. 为什么PostgreSQL的JSON字段让人不习惯?第一次在PostgreSQL里用JSON字段时,我盯着屏幕发了十分钟呆——这跟MongoDB那种行云流水的文档操作完全不是一回事啊!后来才发现,PostgreSQL的JSON类型其实是个带着关系型数据库"镣… · 2026/11/5 2:39:01

URL打开方式全解析:地址栏、页面跳转与程序化请求的工程实践
URL打开方式全解析:地址栏、页面跳转与程序化请求的工程实践

1. 从一个看似废话的标题说起"url 打开有三种方式"——第一次看到这个标题,我差点笑出声。这算什么项目?浏览器地址栏敲回车、点超链接、代码里调个接口,三岁小孩都会。但真在项目里踩过坑的人都懂,这句话背后藏着的是一… · 2026/11/5 2:39:01

混合高斯模型(GMM)聚类算法原理与实战应用
混合高斯模型(GMM)聚类算法原理与实战应用

1. 混合高斯模型聚类实战指南在数据分析领域,聚类算法一直扮演着重要角色。不同于K-means这类硬聚类方法,混合高斯模型(GMM)通过概率分布的方式描述数据,能够更灵活地处理复杂的数据结构。最近我在一个客户细分项目中成… · 2026/11/5 2:38:01

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码