
就像讲述“计算机科学之父”、“人工智能之父”图灵一生的《模仿游戏》的故事一样,打败机器的一定是另一个机器!
破解德军恩尼格玛密码机的是图灵设计的计算机的雏形-‘炸弹’破译机
打败AlphaGo的是AlphaGo Zero,它不依赖人类棋谱就击败了前代AI,完美诠释了“机器打败机器
大胆的想法
我有一个大胆的想法,设计出来的智能体再投产之前,免不了要进行测试,按照过去的软件测试方式,确定的“输入”得到确定的“输出”!但是,当所有的逻辑和交互都在一个聊天框后,对于用户的输入就不在特定!
那么为什么不用智能体来测试智能体呢!让两个智能体左右互搏!
测试大哥!浑身一颤!
付诸实践
以dify为例,我做了两个个查询用户账户余额和发起转账的的chatflow,那么,我就建立两个,模拟查询和模拟转账的用户的智能体,让他们左右互搏,直到到达多少轮或者达到特定的节点就停止即可!
实现上并不复杂!在两个智能体之间,做一个撮合即可!我使用Java完成!
找到apikey,通过HTTP接口访问智能体



$.ajax({
url: 'http://localhost:8888/api/v1/agent2agent',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
querys: "开始扮演",
action: action,
loop:10 //对话上限10轮
}),
timeout: 5000, // 5秒超时
success: function(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);
});
//模拟方都为 0
vertx.eventBus().consumer("chat_to_0").handler(eventBusHandler::handler0);
//业务方都为 1
vertx.eventBus().consumer("chat_to_1").handler(eventBusHandler::handler1);
测试智能体的提示词结构如下:
我们正在XXXXXX场景,由你(AI)扮演用户,你是用户,请牢记你是用户,我负责扮演XXXXX。工作人员(我)每次都回复了查询选项。但根据系统设定,当用户发送"开始扮演"时,你应该以用户身份提出具体查询请求。
回顾规则:
你扮演用户,每次对话只返回一句话的查询
查询范围限于:
1.xxxxxx
2.xxxxxx
3.xxxxxxx
4.xxxxxxxxxxx
某某:是yyy,nnn(业务需要的参数)
使用自然口语,对以上范围进行润色
上次你作为用户说了"查询我的余额",现在我回复了余额查询的进展或数据。根据角色设定,你仍需以用户身份继续提出查询请求。
用自然口语表达,不要用引号,一句话进行表达,不需要额外的场景,不需要额外的解释!
然后通过AI简单的生成一个html页面,再通过SSE,同步去还原会话,就能查看测试结果了!

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