位置: IT常识 - 正文

Java调用ChatGPT(基于SpringBoot),实现可连续对话和流式输出的ChatGPT API(可自定义实现AI助手)(java 调用go)

发布时间:2024-01-06
Java调用ChatGPT(基于SpringBoot),实现可连续对话和流式输出的ChatGPT API(可自定义实现AI助手) 目录1. 配置阶段1.1 依赖引入1.2 配置application.yml文件1.3 注解添加2 使用2.1 生成回答2.1.1 测试2.2 生成图片2.2.1 测试2.3 下载图片2.3.1 测试2.4 生成流式回答2.4.1 流式回答输出到IDEA控制台2.4.2 流式回答输出到浏览器页面3 AI助手展示

推荐整理分享Java调用ChatGPT(基于SpringBoot),实现可连续对话和流式输出的ChatGPT API(可自定义实现AI助手)(java 调用go),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java 调用c,java怎么调用,java调用tuxedo,java怎么调用,java中怎么调用函数,java中怎么调用函数,java调用dll动态库,java调用dll动态库,内容如对您有帮助,希望把文章链接给更多的朋友!

本文Demo地址:https://github.com/asleepyfish/chatgpt-demo

源码及更详细的介绍说明参见Git上的ReadME.md文档 https://github.com/asleepyfish/chatgpt

1. 配置阶段1.1 依赖引入

pom.xml中引入依赖(当前最新版本为1.1.3,可前往Github页面查看当前最新版本)

<dependency> <groupId>io.github.asleepyfish</groupId> <artifactId>chatgpt</artifactId> <version>1.1.3</version> </dependency>1.2 配置application.yml文件

在application.yml文件中配置相关参数(Optional为可选参数)

参数解释token申请的API KEYSproxy-host代理的ipproxy-port代理的端口model (Optional)model可填可不填,默认即text-davinci-003chat-model (Optional)可填可不填,默认即gpt-3.5-turbo (ChatGPT当前最强模型,生成回答使用的就是这个模型)retries (Optional)指的是当chatgpt第一次请求回答失败时,重新请求的次数(增加该参数的原因是因为大量访问的原因,在某一个时刻,chatgpt服务将处于无法访问的情况,不填的默认值为5)session-expiration-time (Optional)(单位(min))为这个会话在多久不访问后被销毁,这个值不填的时候,即表示所有问答处于同一个会话之下,相同user的会话永不销毁(增加请求消耗)

例:

chatgpt: token: sk-xxxxxxxxxxxxxxx proxy-host: 127.0.0.1 proxy-port: xxxx session-expiration-time: 30

其中token、proxy-host、proxy-port是必填的

上面的session-expiration-time参数很重要,是用来表示这个会话在多久不访问后被销毁,从而实现联系上下文的连续对话。

实现方式是通过ChatCompletionRequest中的user来区分某个会话,而session-expiration-time表示这个会话在多久不访问后被销毁。

如果这里看不懂请看2.1节示例

1.3 注解添加

启动类上加入图中的注解则将服务注入到Spring中。

2 使用2.1 生成回答

提供了工具类OpenAiUtils,里面提供了相关方法进行调用。 其中最简单的使用方法是:

OpenAiUtils.createChatCompletion(content);// 不建议使用

入参content即输入的问题的字符串。但是不建议使用。

这里建议使用下面的方式,通过传入user的值,再结合session-expiration-time参数,可以实现指定某次会话,或者某个用户的连续对话。

OpenAiUtils.createChatCompletion(content, user);// 建议使用

还提供一个通用的静态方法是

public static List<String> createChatCompletion(ChatCompletionRequest chatCompletionRequest) {...}

入参ChatCompletionRequest 里包含模型的一些可调参数。

OpenAiUtils类中还提供了多个可供选择的静态方法,可以自行查看。

上述方法的返回参数是一个list,是因为调整参数返回答案n可以一次性返回多条不同的解答(n为ChatCompletionRequest类中一个参数)。

2.1.1 测试

测试代码:

@PostMapping("/chatTest")public List<String> chatTest(String content) { return OpenAiUtils.createChatCompletion(content, "testUser");}

Post请求

入参输入:Java序列化的方式

返回结果:

[ "\n\nJava序列化是将Java对象转换为字节序列的过程,以便在网络上传输或将其保存到磁盘上。Java提供了两种序列化方式:\n\n1. 基于Serializable接口的序列化\n\nSerializable接口是Java提供的一个标记接口,用于标记一个类可以被序列化。如果一个类实现了Serializable接口,那么它的所有非瞬态字段都会被序列化。序列化的过程可以通过ObjectOutputStream类来实现,反序列化的过程可以通过ObjectInputStream类来实现。\n\n2. 基于Externalizable接口的序列化\n\nExternalizable接口也是Java提供的一个标记接口,用于标记一个类可以被序列化。与Serializable接口不同的是,Externalizable接口需要实现writeExternal和readExternal方法,这两个方法分别用于序列化和反序列化。在序列化的过程中,只有被writeExternal方法显式写入的字段才会被序列化,而在反序列化的过程中,只有被readExternal方法显式读取的字段才会被反序列化。\n\n总的来说,基于Serializable接口的序列化更加简单,但是它会序列化所有非瞬态字段,包括一些不需要序列化的字段,而基于Externalizable接口的序列化可以更加灵活地控制序列化的过程。"]

再次输入:有没有更加高效的序列化框架

返回结果:

[ "是的,Java中有很多高效的序列化框架,以下是一些常用的序列化框架:\n\n1. Protobuf\n\nProtobuf是Google开发的一种高效的序列化框架,它可以将结构化数据序列化为二进制格式,支持多种编程语言。相比于Java自带的序列化方式,Protobuf序列化后的数据更小,解析速度更快。\n\n2. Kryo\n\nKryo是一个快速、高效的Java序列化框架,它可以将Java对象序列化为字节数组,支持多种数据类型。Kryo序列化的速度比Java自带的序列化方式快很多,序列化后的数据也更小。\n\n3. FST\n\nFST是一个高性能的Java序列化框架,它可以将Java对象序列化为字节数组,支持多种数据类型。FST序列化的速度比Java自带的序列化方式快很多,序列化后的数据也更小。\n\n4. Avro\n\nAvro是一个高效的数据序列化系统,它可以将结构化数据序列化为二进制格式,支持多种编程语言。Avro序列化后的数据比Java自带的序列化方式更小,解析速度也更快。\n\n总的来说,这些高效的序列化框架都比Java自带的序列化方式更快、更小、更灵活,可以根据具体的需求选择合适的框架。"]

可以看出上述两次问答是在一次会话中的,而前面所说的参数session-expiration-time即这个user所代表的会话多久没被继续访问时的销毁时间。单位(min)

2.2 生成图片Java调用ChatGPT(基于SpringBoot),实现可连续对话和流式输出的ChatGPT API(可自定义实现AI助手)(java 调用go)

最简单的使用方式是

OpenAiUtils.createImage(prompt);

入参表示生成图片的描述文字,还提供了一个通用的静态方法

public static List<String> createImage(CreateImageRequest createImageRequest) {...}

入参CreateImageRequest中有一些可以使用的参数,其中n表示生成图片的数量,responseFormat表示生成图片的格式,格式中分为url和b64_json两种,如果希望返回的是url,则返回的url会在生成一个小时后消失,默认值是url。

2.2.1 测试

测试代码

@Test public void testGenerateImg() { OpenAiUtils.createImage("英短").forEach(System.out::println); }

结果 默认情况下会生成一个url,点击去就可以看到图片。

2.3 下载图片

在3.2的基础上做了优化,直接使用responseFormat为b64_json然后解析成图片返回。简单使用方式如下:

OpenAiUtils.downloadImage(prompt, response);

通用方式如下:

public static void downloadImage(CreateImageRequest createImageRequest, HttpServletResponse response) {...}

当CreateImageRequest对象中设置的返回参数n大于1时,会将图片打包成一个zip包返回,当n等于1时直接返回图片。

2.3.1 测试

测试代码

@RestControllerpublic class ChatGPTController { @GetMapping("/downloadImage") public void downloadImage(String prompt, HttpServletResponse response) { OpenAiUtils.downloadImage(prompt, response); }}

发送get请求,然后选择Send and Download

我用的get 工具是idea里面下载的插件Fast Request的,用Postman也是可以的,但是要选择 Send and Download,上图中绿色的箭头是Send,蓝色的是Send and Download。

2.4 生成流式回答

生成流式回答的方法是OpenAiUtils的createStreamChatCompletion方法,本工具类重载了同名的多个参数的方法,其中最通用的方法是

public static void createStreamChatCompletion(ChatCompletionRequest chatCompletionRequest, OutputStream os) {...}

最简单的方法是

public static void createStreamChatCompletion(String content) {...}

其中的content即本次对话的问题。

这里需要主义的是,上述第一个方法中的OutputStream os其实是一个必传的对象,上述的最简单的方法实际上是默认传递的System.out这个os对象,也就是将流式问答的结果显示到IDEA的控制台。

如果需要将流式问答的结果显示到其他界面可以自发的传入OutputStream os对象,这里有一个简便的方法是

public static void createStreamChatCompletion(String content, OutputStream os) {...}

只需要输入问题,和输出流对象即可。

下面将举例具体说明。(本文所有Demo的示例地址: https://github.com/asleepyfish/chatgpt-demo)

2.4.1 流式回答输出到IDEA控制台

代码如下:

@GetMapping("/streamChat")public void streamChat(String content) { // OpenAiUtils.createStreamChatCompletion(content, System.out); // 下面的默认和上面这句代码一样,是输出结果到控制台 OpenAiUtils.createStreamChatCompletion(content);}

然后使用Postman或者其他可以发送Get请求的工具发送请求。

本次测试的结果如下面的Gif图所示

2.4.2 流式回答输出到浏览器页面

上述的方法中输出流传入的是System.out对象,该对象实际上就是一个PrintStream对象,会把输出结果展示到控制台。

如果需要将输出结果在浏览器展示,可以从前端传入一个HttpServletResponse response对象,拿到这个response以后将response.getOutputStream()这个输出流对象传入createStreamChatCompletion方法的入参中。同时,为了避免结果输出到浏览器产生乱码和支持流式输出,需要ContentType和CharacterEncoding。

具体代码如下:

@GetMapping("/streamChatWithWeb")public void streamChatWithWeb(String content, HttpServletResponse response) throws IOException { // 需要指定response的ContentType为流式输出,且字符编码为UTF-8 response.setContentType("text/event-stream"); response.setCharacterEncoding("UTF-8"); OpenAiUtils.createStreamChatCompletion(content, response.getOutputStream());}

测试结果过程的Gif图如下所示:

3 AI助手展示

接入微信公众号,AI助手可自动回复。

本文链接地址:https://www.jiuchutong.com/zhishi/288014.html 转载请保留说明!

上一篇:npm,nodejs如何升级(nodejs怎么更新版本)

下一篇:最小的外置DVD刻录机(最小的外置dvd刻机多少寸)

  • 悄悄恢复已删微信好友(恢复被删掉的微信聊天记录)

    悄悄恢复已删微信好友(恢复被删掉的微信聊天记录)

  • 小米手表color2怎么设置表盘(小米手表color2怎么播放音乐)

    小米手表color2怎么设置表盘(小米手表color2怎么播放音乐)

  • 微信聊天背景尺寸大小是多少(微信聊天背景尺寸是几比几)

    微信聊天背景尺寸大小是多少(微信聊天背景尺寸是几比几)

  • 笔记本多少g内存够用(笔记本多少g内存比较好)

    笔记本多少g内存够用(笔记本多少g内存比较好)

  • 为什么软件打不开(为什么软件打不开电脑)

    为什么软件打不开(为什么软件打不开电脑)

  • 苹果id给别人用安全吗(苹果id给别人用了怎么解决)

    苹果id给别人用安全吗(苹果id给别人用了怎么解决)

  • 笔记本键盘能不能扣下来(笔记本键盘能不能锁住)

    笔记本键盘能不能扣下来(笔记本键盘能不能锁住)

  • 抖音喜欢为0是什么情况(抖音喜欢为0是隐藏了吗)

    抖音喜欢为0是什么情况(抖音喜欢为0是隐藏了吗)

  • win10自带软件哪些可以删除(win10自带软件哪些可以卸载)

    win10自带软件哪些可以删除(win10自带软件哪些可以卸载)

  • 手机屏边上有一条亮线怎么办(手机屏边上有一条绿色的线能修吗多少钱)

    手机屏边上有一条亮线怎么办(手机屏边上有一条绿色的线能修吗多少钱)

  • 微信怎么突然没有一个好友了(微信怎么突然没有提取文字功能)

    微信怎么突然没有一个好友了(微信怎么突然没有提取文字功能)

  • 京东验证码频繁多久解除(京东验证码频繁怎么回事)

    京东验证码频繁多久解除(京东验证码频繁怎么回事)

  • 天猫精灵的音乐库的来源(天猫精灵的音乐盲盒怎么关)

    天猫精灵的音乐库的来源(天猫精灵的音乐盲盒怎么关)

  • 微信如何取消视频号(微信如何取消视频号功能)

    微信如何取消视频号(微信如何取消视频号功能)

  • ipad发现不了蓝牙耳机(ipad发现不了蓝牙设备)

    ipad发现不了蓝牙耳机(ipad发现不了蓝牙设备)

  • ipadmini没有计算器吗(ipad为啥没计算器)

    ipadmini没有计算器吗(ipad为啥没计算器)

  • 芒果账号可以几个人用(芒果账号能登几个)

    芒果账号可以几个人用(芒果账号能登几个)

  • 安卓怎么开热点(安卓怎么开热点给电脑)

    安卓怎么开热点(安卓怎么开热点给电脑)

  • 怎么查是不是骚扰电话(怎么看是不是骚扰电话)

    怎么查是不是骚扰电话(怎么看是不是骚扰电话)

  • 有的软件卸载不了怎么办(有的软件为啥卸载不了)

    有的软件卸载不了怎么办(有的软件为啥卸载不了)

  • 苹果x配无线耳机吗(苹果x配无线耳机怎么样)

    苹果x配无线耳机吗(苹果x配无线耳机怎么样)

  • 小米9pro5g是双模吗(小米9pro5g单模)

    小米9pro5g是双模吗(小米9pro5g单模)

  • 电脑系统怎么看(电脑系统怎么看多少位的)

    电脑系统怎么看(电脑系统怎么看多少位的)

  • pr转场特效怎么导入(pr转场特效怎么安装)

    pr转场特效怎么导入(pr转场特效怎么安装)

  • 键盘重启快捷键(台式电脑键盘重启快捷键)

    键盘重启快捷键(台式电脑键盘重启快捷键)

  • 设置背景图片大小的方法(设置背景图片大小和元素的大小一致的代码)

    设置背景图片大小的方法(设置背景图片大小和元素的大小一致的代码)

  • 【C语言进阶】文本与二进制操作文件,优化通讯录。(c语音进阶)

    【C语言进阶】文本与二进制操作文件,优化通讯录。(c语音进阶)

  • 城镇土地使用税的计算公式
  • 超率累进税率有哪些税种呢怎么算
  • 减资 股东
  • 出售可供出售金融资产的利得属于什么活动
  • 农副产品增值税免税政策
  • 外勤会计主要是干什么
  • 固定资产一次性扣除政策文件
  • 停车费可以抵扣个人所得税吗
  • 个体户一直零申报会不会罚款
  • 对外支付代扣代缴企业所得税
  • 跨年收取租金
  • 房屋租赁可以开住宿费吗
  • 福利企业退税的资金去处
  • 公司没有缴纳住房公积金离职能要求补缴吗
  • 支付的各项税费包括个人所得税吗
  • 收派服务费入什么科目
  • 关于旅行社代订的通知
  • 消费税和增值税的不同之处
  • 金融资产包括哪三大类及会计科目
  • 最新定额是哪年
  • 理财代持有法律效力吗
  • 审计报告格式与范文怎么写?
  • 营改增后征收增值税的税目
  • 小规模纳税人月销售额不超过10万免征
  • 企业停产后员工怎么办
  • 外籍人员工资个税
  • win10无internet怎么解决
  • 应付工程款账务处理
  • 开办费 工资
  • 报税系统维护费怎么入账
  • 动态壁纸怎么设置锁屏
  • linux设置用户密码
  • rsmsink.exe - rsmsink是什么进程 有何作用
  • 利息股息红利所得属于综合所得吗
  • 付给他人押金的会计分录
  • 房屋租赁费如何结转成本
  • php如何调用类
  • 金税盘锁住了怎么办
  • vue引用类型
  • php graph
  • 当年实现的利润弥补以前年度亏损还是提盈余公积
  • mysql集群三种方式
  • vue如何使用axios
  • od输出结构
  • 营业外收入的会计科目编码
  • 织梦产品详情页相关产品推荐调用代码
  • linux中mongodb启动
  • 解决Dede5.6联动类型更改排序数字的BUG
  • 个体户增值税减免申报明细表怎么填
  • 企业法人个人贷款哪里好贷
  • 银行日记账怎么做账
  • 为什么盈余公积减少,未分配利润增加
  • 买车挂公司名下的坏处
  • 合同约定合同期限自动顺延
  • 往来核算是指会计核算中的资金往来业务
  • 银行汇票质押办理流程
  • 企业购买黄金有限制吗
  • 财务专用章的效力
  • sql2008数据库置疑
  • 小黑马科技
  • wncloud.exe是什么程序
  • 如何ie8升级到10
  • gnaupdaemon.exe是什么
  • centos安装yun
  • xp系统光盘读不出来
  • win8系统网络设置在哪里
  • android图像处理
  • 用&lt;TABLE&gt;语句来实现圆角表格可以省去制作圆角图片之苦!
  • jq判断浏览器
  • vue怎么实现多页面
  • Android开发工具
  • 如何设置python
  • 仿京东商城源码
  • javascript的基础类型有哪些
  • 安徽省马鞍山地区代码
  • 企业所得税汇总纳税备案表
  • 运输服务费税率9%还是6%
  • 增值税专票红冲退税
  • 拆迁补偿的房子是什么性质
  • 山东地税局网上办税平台
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号