支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


DIFY对轰,左右互搏之术-用智能体测试智能体

发布日期:2025-06-18 17:59:10 浏览次数: 1543
作者:高级面试工程师

微信搜一搜,关注“高级面试工程师”

推荐语

用智能体测试智能体,DIFY实战案例展示AI自我进化的可能性!

核心内容:
1. 智能体互测的创新理念与实现原理
2. DIFY平台构建双智能体测试环境的技术细节
3. Java Vert.x框架在高效交互中的关键作用

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

就像讲述“计算机科学之父”、“人工智能之父”图灵一生的《模仿游戏》的故事一样,打败机器的一定是另一个机器!

    破解德军恩尼格玛密码机的是图灵设计的计算机的雏形-'炸弹'破译机

    打败AlphaGo的是AlphaGo Zero,它不依赖人类棋谱就击败了前代AI,完美诠释了“机器打败机器

大胆的想法

    我有一个大胆的想法,设计出来的智能体再投产之前,免不了要进行测试,按照过去的软件测试方式,确定的“输入”得到确定的“输出”!但是,当所有的逻辑和交互都在一个聊天框后,对于用户的输入就不在特定!

    那么为什么不用智能体来测试智能体呢!让两个智能体左右互搏!

    测试大哥!浑身一颤!

付诸实践

    以dify为例,我做了两个个查询用户账户余额和发起转账的的chatflow,那么,我就建立两个,模拟查询和模拟转账的用户的智能体,让他们左右互搏,直到到达多少轮或者达到特定的节点就停止即可!

    实现上并不复杂!在两个智能体之间,做一个撮合即可!我使用Java完成!

    找到apikey,通过HTTP接口访问智能体


    将目标机和测试机的配置在自己项目里,方便切换不同的测试!

    

页面调用Agent2agent接口,是向测试DIFY发出。
$.ajax({               url'http://localhost:8888/api/v1/agent2agent',               type'POST',               contentType'application/json',               dataJSON.stringify({                   querys"开始扮演",                   action: action,                   loop:10    //对话上限10轮               }),               timeout5000// 5秒超时successfunction(response) {                   if (response.data) {                      localStorage.setItem('pingId', response.data.pingId);                      console.log(this);                     slef.loadHistory();                   }               },           });
后端使用Java的Vert.x框架,是Java中,性能最爆炸的框架!
(如果想了解请移步我的另一篇文章:
Java高性能开发工具/框架-Vert.x与Spring
)
public CompositeFuture chatToAgent(RoutingContext rc) {    final QueryParam param  = rc.body().asJsonObject().mapTo(QueryParam.class);       Future<JsonObject> sourceFuture = service.selectByType("0",param.getAction())   .map(m -> buildJson(m,param));       Future<JsonObject> targetFuture = service.selectByType("1",param.getAction())     .map(m -> buildJson(m,param));         return     CompositeFuture.all(sourceFuture, targetFuture)      .onComplete(ar -> {              if (ar.succeeded()) {                   // 所有的Future都成功完成                JsonObject result1 = ar.result().resultAt(0);               JsonObject result2 = ar.result().resultAt(1);            EvevtParam build =  EvevtParam.builder().source(result1).target(result2).loop(param.getLoop()).pingId(IdUtil.fastSimpleUUID()).build();                      sendEventBusMessage( JsonObject.mapFrom(build));//异步发给seventBus                   ResponseUtils.buildOkResponse(rc,new Result<EvevtParam>().ok(build));              } else  {              // 至少有一个Future失败了                  Throwable cause = ar.cause();               ResponseUtils.buildErrorResponse(rc, cause);               } })             .onFailure(cause -> {                 // 错误统一处理                  ResponseUtils.buildErrorResponse(rc, cause);      });

测试机的智能体收到指令后,按提示词开始角色扮演!

测试智能体的answer就是目标机的query

目标机的answer也是测试机的query

vertx.eventBus().consumer("chat_to_dify").handler(message ->{            eventBusHandler.handlerStart(message);         });//模拟方都为 0vertx.eventBus().consumer("chat_to_0").handler(eventBusHandler::handler0);//业务方都为 1vertx.eventBus().consumer("chat_to_1").handler(eventBusHandler::handler1);
handler0和handler1,互相拿着返回值,左右互搏

测试智能体的提示词结构如下:

我们正在XXXXXX场景,由你(AI)扮演用户,你是用户,请牢记你是用户,我负责扮演XXXXX。工作人员(我)每次都回复了查询选项。但根据系统设定,当用户发送"开始扮演"时,你应该以用户身份提出具体查询请求。回顾规则:你扮演用户,每次对话只返回一句话的查询查询范围限于:1.xxxxxx2.xxxxxx3.xxxxxxx4.xxxxxxxxxxx某某:是yyy,nnn(业务需要的参数)使用自然口语,对以上范围进行润色上次你作为用户说了"查询我的余额",现在我回复了余额查询的进展或数据。根据角色设定,你仍需以用户身份继续提出查询请求。用自然口语表达,不要用引号,一句话进行表达,不需要额外的场景,不需要额外的解释!

然后通过AI简单的生成一个html页面,再通过SSE,同步去还原会话,就能查看测试结果了!

      这是一个不太成熟的DEMO,验证了一下自己的想法!

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询