接下来我们演示,如何使用JBolt AI实现上面的流程。
提示:
以下代码基于JBolt AI库实现
- 首先我们实现模拟用户提问,由大模型判断该提问是否和订单查询有关
//注册大模型资源
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();
以下是执行结果:
- 接下来我们创建一个事件节点,将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;
});
- 这时候这两个节点还毫无关系,我们要构建一个链条,将它俩串联起来,并开始运行这个链条。
//创建一个判断节点
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
- 实现流程图中的
否
对应的分支
//... 其他代码一样
//模拟用户提问
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
运行结果:
- 实现流程图中
是
对应的分支:
//模拟用户提问
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
以下是执行结果:
请继续关注,期待后续更新 …