一、技术介绍chatgpt-java是一款支持开箱即用的openai java sdk。目前以支持官网全部api。我们赞成使用最新版本的gpt-3.5-turbo和whisper-1模型。
2.spring boot是由pivotal团队提供的全新框架,其设计目的是用来简化新spring应用的初始搭建以及开发过程。这个框架采用特定的配置方式,无需开发人员再定义通用配置。通过这种方式,spring boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
3.chatui pro 是在chatui 基础组件的基础上,结合阿里小蜜的最佳实践,沉淀和总结出来的一个开箱即用的,可快速搭建智能对话机器人的框架。它简单易上手,通过简单的配置就能搭建出对话机器人;同时它强大易扩展,通过丰富的接口和自定义卡片满足各种定制化需求。
二、项目介绍本项目采用了gpt-3.5-turb模型作为基础,通过springboot结合redis、chat-java以及chatui pro实现简单的人工智能机器人。因为访问openai的api返回结果比较慢,项目中当前端将问题请求发送到后端后,后端会将生成一个uuid,返回前端,同时后端也会重新开启一个线程去访问openai,当openai返回结果后,后端将uuid做为key,openai返回的结果做为value存储到redis中。前端会根据后端第一次请求的结果中uuid做为参数每个5s请求一次后端的answer接口,answer接口会根据uuid查询redis是否有值,直到后端answer接口返回结果后前端将结果输出给用户
三、项目搭建1.创建springboot项目,项目命名mychatgpt。
2.导入项目pom的依赖
<?xml version="1.0" encoding="utf-8"?><project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.5.12</version> <relativepath/> <!-- lookup parent from repository --> </parent> <groupid>com.xyh</groupid> <artifactid>mychatgpt</artifactid> <version>0.0.1-snapshot</version> <name>mychatgpt</name> <description>demo project for spring boot</description> <properties> <java.version>8</java.version> </properties> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-redis</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-aop</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <exclusions> <exclusion> <groupid>org.apache.logging.log4j</groupid> <artifactid>log4j-api</artifactid> </exclusion> <exclusion> <groupid>org.apache.logging.log4j</groupid> <artifactid>log4j-to-slf4j</artifactid> </exclusion> </exclusions> <scope>test</scope> </dependency> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <optional>true</optional> </dependency> <dependency> <groupid>org.apache.httpcomponents</groupid> <artifactid>httpcore</artifactid> </dependency> <dependency> <groupid>com.theokanning.openai-gpt3-java</groupid> <artifactid>api</artifactid> <version>0.10.0</version> </dependency> <dependency> <groupid>com.theokanning.openai-gpt3-java</groupid> <artifactid>service</artifactid> <version>0.10.0</version> </dependency> <dependency> <groupid>com.theokanning.openai-gpt3-java</groupid> <artifactid>client</artifactid> <version>0.10.0</version> </dependency> <dependency> <groupid>cn.hutool</groupid> <artifactid>hutool-all</artifactid> <version>5.8.12</version> </dependency> <dependency> <groupid>com.unfbx</groupid> <artifactid>chatgpt-java</artifactid> <version>1.0.5</version> </dependency> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>8.0.17</version> </dependency> <dependency> <groupid>com.alibaba</groupid> <artifactid>druid-spring-boot-starter</artifactid> <version>1.2.8</version> </dependency> <dependency> <groupid>com.baomidou</groupid> <artifactid>mybatis-plus-boot-starter</artifactid> <version>3.5.2</version> <exclusions> <exclusion> <groupid>com.baomidou</groupid> <artifactid>mybatis-plus-generator</artifactid> </exclusion> </exclusions> </dependency> <dependency> <groupid>com.github.yulichang</groupid> <artifactid>mybatis-plus-join</artifactid> <version>1.4.2</version> </dependency> <!--集成随机生成数据包 --> <dependency> <groupid>com.apifan.common</groupid> <artifactid>common-random</artifactid> <version>1.0.19</version> </dependency> <!--集成随机生成数据包 --> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-maven-plugin</artifactid> <configuration> <excludes> <exclude> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> </exclude> </excludes> </configuration> </plugin> </plugins> </build></project>
3.编写chatgpt实现工具类
package com.xyh.mychatgpt.utils;import com.unfbx.chatgpt.openaiclient;import com.unfbx.chatgpt.entity.chat.chatchoice;import com.unfbx.chatgpt.entity.chat.chatcompletion;import com.unfbx.chatgpt.entity.chat.message;import com.unfbx.chatgpt.entity.common.choice;import com.unfbx.chatgpt.entity.completions.completion;import org.springframework.beans.factory.annotation.autowired;import org.springframework.beans.factory.annotation.value;import org.springframework.stereotype.component;import java.util.arrays;import java.util.list;/** * @author xiangyuanhong * @description: todo * @date 2023/3/21上午9:28 */@componentpublic class chatgptutils { @value("${xyh.openai.key}") private string token; @autowired private redisutils redisutils; public void ask(string model,string question,string uuid){ stringbuffer result=new stringbuffer(); try { openaiclient openaiclient = new openaiclient(token, 3000, 300, 300, null); if("gpt-3.5-turb".equals(model)){ // gpt-3.5-turb模型 message message=message.builder().role(message.role.user).content(question).build(); chatcompletion chatcompletion = chatcompletion.builder().messages(arrays.aslist(message)).build(); list<chatchoice> resultlist = openaiclient.chatcompletion(chatcompletion).getchoices(); for (int i = 0; i < resultlist.size(); i++) { result.append(resultlist.get(i).getmessage().getcontent()); } }else{ //text-davinci-003/text-ada-003 completion completion = completion.builder() .prompt(question) .model(model) .maxtokens(2000) .temperature(0) .echo(false) .build(); choice[] resultlist = openaiclient.completions(completion).getchoices(); for (choice choice : resultlist) { result.append(choice.gettext()); } } }catch (exception e) { system.out.println(e.getmessage()); result.append("小爱还不太懂,回去一定努力学习补充知识"); } redisutils.set(uuid,result.tostring()); }}
4.开发项目controller类,用来与前端进行交互
package com.xyh.mychatgpt.controller;import cn.hutool.core.thread.threadutil;import cn.hutool.core.util.idutil;import cn.hutool.core.util.strutil;import com.xyh.mychatgpt.utils.chatgptutils;import com.xyh.mychatgpt.utils.r;import com.xyh.mychatgpt.utils.redisutils;import org.springframework.beans.factory.annotation.autowired;import org.springframework.web.bind.annotation.getmapping;import org.springframework.web.bind.annotation.restcontroller;import javax.servlet.http.httpservletrequest;/** * @author xiangyuanhong * @description: todo * @date 2023/2/28下午4:57 */@restcontrollerpublic class indexcontroller { @autowired private redisutils redisutils; @autowired private chatgptutils chatgptutils; @getmapping("/ask") public r ask(string question,httpservletrequest request) { string uuid=idutil.simpleuuid(); if (strutil.isblank(question)) { question = "今天天气怎么样?"; } string finalquestion = question; threadutil.execasync(()->{ chatgptutils.ask("gpt-3.5-turb", finalquestion,uuid); }); return r.ok().put("data",uuid); } @getmapping("/answer") public r answer(string uuid){ string result=redisutils.get(uuid); return r.ok().put("data",result); }}
5.前端页面开发,在项目templates目录创建index.html页面,并引入chatui pro相关文件
<!doctype html><html lang="zh-cn"><head> <meta name="renderer" content="webkit" /> <meta name="force-rendering" content="webkit" /> <meta http-equiv="x-ua-compatible" content="ie=edge,chrome=1" /> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0, viewport-fit=cover" /> <title>滴答小爱</title> <link rel="stylesheet" href="//g.alicdn.com/chatui/sdk-v2/0.2.4/sdk.css" rel="external nofollow" ></head><body><div id="root"></div><script src="//g.alicdn.com/chatui/sdk-v2/0.2.4/sdk.js"></script><script src="//g.alicdn.com/chatui/extensions/0.0.7/isv-parser.js"></script><script src="js/setup.js"></script><script src="js/jquery-3.6.3.min.js"></script><script src="//g.alicdn.com/chatui/icons/0.3.0/index.js" async></script></body></html>
6.创建setup.js实现chatui pro与后端通信交换。
var bot = new chatsdk({ config: { // navbar: { // title: '滴答小爱' // }, robot: { avatar: 'images/chat.png' }, // 用户头像 user: { avatar: 'images/user.png', }, // 首屏消息 messages: [ { type: 'text', content: { text: '您好,小爱为您服务,请问有什么可以帮您的?' } } ], // 快捷短语 // quickreplies: [ // { name: '健康码颜色',ishighlight:true }, // { name: '入浙通行申报' }, // { name: '健康码是否可截图使用' }, // { name: '健康通行码适用范围' }, // ], // 输入框占位符 placeholder: '输入任何您想询问的问题', }, requests: { send: function (msg) { if (msg.type === 'text') { return { url: '/ask', data: { question: msg.content.text } }; } } }, handlers: { /** * * 解析请求返回的数据 * @param {object} res - 请求返回的数据 * @param {object} requesttype - 请求类型 * @return {array} */ parseresponse: function (res, requesttype) { // 根据 requesttype 处理数据 if (requesttype === 'send' && res.code==0) { // 用 isv 消息解析器处理数据 $.ajaxsettings.async=false; var answer=""; var isok=false; while(!isok){ $.get("/answer",{uuid:res.data},function(result){ console.log(result.data) if(null != result.data){ isok=true; answer=result.data; } },"json"); if(!isok){ sleep(5000); } } $.ajaxsettings.async=true; return [{"_id":res.data,type:"text",content:{text:answer},position:"left"}]; } }, },});function sleep(n) { //n表示的毫秒数 var start = new date().gettime(); while (true) { if (new date().gettime() - start > n) { break; } }}bot.run();
一旦完成项目搭建,启动 spring boot 项目并访问 http://ip:端口 即可。项目最终效果:http://hyrun.vip/
四、项目展示
以上就是怎么使用springboot+chatgpt+chatui pro开发智能聊天工具的详细内容。