首页 > 教程攻略 > ai资讯 >DIFY对轰,左右互搏之术-用智能体测试智能体

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

来源:互联网 时间:2026-07-22 15:08:27

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

从图灵到AlphaGo,人工智能的发展史就是一部"机器打败机器"的演进史。破解德军恩尼格玛密码机的是图灵设计的计算机雏形——"冲击波"破译机;打败AlphaGo的是AlphaGo Zero,它不依赖任何人类棋谱便击败了前代AI,完美诠释了什么叫"机器打败机器"。

如今,这个逻辑在AI应用开发中有了新的演绎。

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

一个大胆的想法:既然人工智能体诞生于机器,那么测试它的最佳方式,是否也应该是另一个机器?

传统软件测试的逻辑很简单:确定的输入,得到确定的输出。但当所有逻辑和交互都发生在一个聊天窗口中,用户输入的不确定性急剧增加,传统的测试方式瞬间失效。那么,为什么不用智能体来测试智能体?让两个智能体彼此对话、左右互搏,模拟真实用户与业务智能体的交互过程。

付诸实践:以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互搏,自动迭代"。