JAVA开发AI应用(四):实现复杂的业务流程1

在这里插入图片描述

接下来我们演示,如何使用JBolt AI实现上面的流程。

提示:
以下代码基于JBolt AI库实现

  1. 首先我们实现模拟用户提问,由大模型判断该提问是否和订单查询有关
//注册大模型资源
 ResourceCenter.registerAI("ai-chatgpt1", AIModel.CHATGPT_35, "api key****")
         .setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 19181)));
 //模拟用户提问
 String userQuestion = "张三下了几个单?";
 //创建一个ai 事件
 AIChatEvent askEvent = JBoltAI.chat().setStream(false)
         .prompt("请判断用户的提问是否和订单查询有关,如果有关,请直接返回true,无关直接返回false。\n" +
                 "以下是用户的提问:`{}`", userQuestion)
         .onSuccess((e,msg) -> {
             System.out.println( msg.getContent());
         }).onFail((e, error) -> {
             System.out.println(error.getMsg());
         });
 //发布事件,等待执行结束
 EventBus.publish(event).await();

以下是执行结果:
在这里插入图片描述

  1. 接下来我们创建一个事件节点,将askEvent包装一下,然后创建一个if 节点,和它串联起来。
//注册大模型资源
ResourceCenter.registerAI("ai-chatgpt1", AIModel.CHATGPT_35, JBoltAITestConfig.OPENAI_API_KEY)
        .setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 19181)));;
//模拟用户提问
String userQuestion = "张三下了几个单?";

//创建一个提问的节点
EventChainNode askNode = new EventChainNode(chain -> {
    //创建一个ai 事件
    AIChatEvent askEvent = JBoltAI.chat().setStream(false)
            .prompt("请判断用户的提问是否和订单查询有关,如果有关,请直接返回true,无关直接返回false。\n" +
                    "以下是用户的提问:`{}`", userQuestion)
            .onSuccess((e,msg) -> {
                System.out.println("大模型返回了:" + msg.getContent());
                //将大模型返回的结果,放入链条的context中,供整个链条节点访问
                chain.setData("isOrderSearch", msg.getContent());
            }).onFail((e, error) -> {
                System.out.println(error.getMsg());
            });

    return askEvent;
});

//创建一个判断节点
BooleanChainNode judgeNode = new BooleanChainNode(chain -> {
    //从链条的Context中取出数据
    String isOrderSearch = chain.getData("isOrderSearch");
    //判断大模型输出的是不是true,这里纯为了演示,忽略它的多此一举
    boolean result =  StrUtil.contains(isOrderSearch, "true");
    System.out.println("判断是否是和订单查询有关:" + result);
    return result;
});
  1. 这时候这两个节点还毫无关系,我们要构建一个链条,将它俩串联起来,并开始运行这个链条。
//创建一个判断节点
 BooleanChainNode judgeNode = new BooleanChainNode(chain -> {
     //从链条的Context中取出数据
     String isOrderSearch = chain.getData("isOrderSearch");
     //判断大模型输出的是不是true,这里纯为了演示,忽略它的多此一举
     boolean result =  StrUtil.contains(isOrderSearch, "true");
     System.out.println("判断是否是和订单查询有关:" + result);
     return result;
 }).addPrevNode(askNode); //设置该节点的前置节点为askNode

 //将节点加入链条,只需要添加一级节点就可以,后续节点会根据关联关系自动处理
 JBoltAI.chain().addNodes(askNode).onSuccess((e,result) -> {
     System.out.println("链条执行成功");
 }).onFail((e, error) -> {
     System.out.println("链条执行失败:" + error.getMsg());
 }).publish().await();

运行结果:

在这里插入图片描述

重要:
judgeNode最后的addPrevNode方法,这个方法将judgeNode和askNode建立了关联关系,并表明askNode是judgeNode的前置节点,askNode执行完了,并且成功,才会继续执行judgeNode。

注意:
事件一旦进入节点中,它什么时候执行完全由链条决定,不需要我们手动publish执行了。所以原来的publish代码去掉了,改为链条的publish

  1. 实现流程图中的对应的分支
//... 其他代码一样

//模拟用户提问
String userQuestion = "地球有几个大洋?";

//....

//创建一个普通的聊天节点,用于回答用户的提问
EventChainNode normalAnswerNode = new EventChainNode(chain -> {
    return JBoltAI.chat().prompt(userQuestion)
            .setStream(false)//一次性输出
            .onSuccess((e, result) -> {
                System.out.println("大模型进行普通回答:" + result.getContent());
            });
}).addPrevWhenFalse(judgeNode); //设置该节点的前置节点为judgeNode,并且触发条件是judgeNode返回false

运行结果:
在这里插入图片描述

  1. 实现流程图中对应的分支:
//模拟用户提问
String userQuestion = "张三下了几个单";
//创建一个提取关键词的节点
EventChainNode sqlNode = new EventChainNode(chain -> {
    //创建一个ai 事件
    AIChatEvent sqlEvent = JBoltAI.chat().setStream(false)
            .prompt("请根据用户的提问,生成一个mysql数据库的订单查询语句,然后请直接输出语句,不要输出其他说明性文字。订单表的结构为:\n" +
                    "CREATE TABLE `order` (\n" +
                    "  `id` int(11) NOT NULL AUTO_INCREMENT  COMMENT '主键',\n" +
                    "  `userName` varchar(40)   COMMENT '用户名',\n" +
                    "  `sn` varchar(40)  COMMENT '订单号',\n" +
                    "  PRIMARY KEY (`id`)\n" +
                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8;\n" +
                    "以下是用户的提问:`{}`", userQuestion)
            .onSuccess((e,msg) -> {
                System.out.println("大模型生成的查询语句:" + msg.getContent());
                //将大模型返回的结果,放入链条的context中,供整个链条节点访问
                chain.setData("searchSql", msg.getContent());
            }).onFail((e, error) -> {
                System.out.println(error.getMsg());
            });

    return sqlEvent;
}).addPrevWhenTrue(judgeNode);//设置该节点的前置节点为judgeNode,并且触发条件是judgeNode返回true

以下是执行结果:
在这里插入图片描述

请继续关注,期待后续更新 …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catastrophe_zy

如果真的帮到你了,我很荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值