DIFY对轰,左右互搏之术-用智能体测试智能体
用智能体测试智能体,DIFY实战案例展示AI自我进化的可能性!
从图灵到AlphaGo,人工智能的发展史就是一部"机器打败机器"的演进史。破解德军恩尼格玛密码机的是图灵设计的计算机雏形——"冲击波"破译机;打败AlphaGo的是AlphaGo Zero,它不依赖任何人类棋谱便击败了前代AI,完美诠释了什么叫"机器打败机器"。
如今,这个逻辑在AI应用开发中有了新的演绎。

一个大胆的想法:既然人工智能体诞生于机器,那么测试它的最佳方式,是否也应该是另一个机器?
传统软件测试的逻辑很简单:确定的输入,得到确定的输出。但当所有逻辑和交互都发生在一个聊天窗口中,用户输入的不确定性急剧增加,传统的测试方式瞬间失效。那么,为什么不用智能体来测试智能体?让两个智能体彼此对话、左右互搏,模拟真实用户与业务智能体的交互过程。
付诸实践:以DIFY平台为例,首先构建两个Chatflow——一个负责查询用户账户余额,另一个负责发起转账。紧接着,再构建两个模拟用户行为的智能体,一个模拟查询用户,一个模拟转账用户。让它们自动对话,直到到达设定的轮数或特定节点时停止。
实现上并不复杂。核心就是在两个智能体之间做一个撮合。采用Ja va完成,利用Vert.x框架——Ja va生态中性能表现最出色的框架之一。具体流程如下:
- 找到API Key,通过HTTP接口访问智能体
- 将目标机和测试机的配置信息封装到项目中,方便切换不同测试场景
页面调用Agent2Agent接口,向测试DIFY发出请求:
$.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);
self.loadHistory();
}
},
});
后端使用Ja va的Vert.x框架,通过CompositeFuture并行获取测试机和目标机的配置信息,然后通过EventBus异步发送对话指令:
public CompositeFuture chatToAgent(RoutingContext rc) {
final QueryParam param = rc.body().asJsonObject().mapTo(QueryParam.class);
Future sourceFuture = service.selectByType("0", param.getAction())
.map(m -> buildJson(m, param));
Future targetFuture = service.selectByType("1", param.getAction())
.map(m -> buildJson(m, param));
return CompositeFuture.all(sourceFuture, targetFuture)
.onComplete(ar -> {
if (ar.succeeded()) {
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));
ResponseUtils.buildOkResponse(rc, new Result().ok(build));
} else {
Throwable cause = ar.cause();
ResponseUtils.buildErrorResponse(rc, cause);
}
})
.onFailure(cause -> {
ResponseUtils.buildErrorResponse(rc, cause);
});
}
测试机智能体收到指令后,按照提示词开始角色扮演。测试智能体的回答,就是目标机的查询输入;目标机的回答,又成为测试机的下一轮输入。双方循环往复,真正实现了"左右互搏"。
EventBus消息处理逻辑:
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);
handler0和handler1,相互持有返回值,循环轮转。
测试智能体的提示词结构如下:
我们正在XXXXXX场景,由你(AI)扮演用户,你是用户,请牢记你是用户,我负责扮演XXXXX。
工作人员(我)每次都回复了查询选项。但根据系统设定,当用户发送"开始扮演"时,
你应该以用户身份提出具体查询请求。
回顾规则:
你扮演用户,每次对话只返回一句话的查询。
查询范围限于:
1.xxxxxx
2.xxxxxx
3.xxxxxxx
4.xxxxxxxxxxx
某某:是yyy,nnn(业务需要的参数)
使用自然口语,对以上范围进行润色。
上次你作为用户说了"查询我的余额",现在我回复了余额查询的进展或数据。
根据角色设定,你仍需以用户身份继续提出查询请求。
用自然口语表达,不要用引号,一句话进行表达,不需要额外的场景,不需要额外的解释!
最后通过AI简单生成一个HTML页面,再借助SSE同步还原会话,就能实时查看测试结果了。
这是一个尚未完全成熟的DEMO,但它验证了一个极具潜力的想法——用AI测试AI,让机器在自我对话中完成进化。未来的软件测试,或许将不再是"人找bug",而是"AI互搏,自动迭代"。
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名