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

news/2024/4/27 4:10:20/文章来源:https://blog.csdn.net/qq_41821963/article/details/128992539

目录

  • 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助手展示

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

例:

chatgpt:token: sk-xxxxxxxxxxxxxxxproxy-host: 127.0.0.1proxy-port: xxxxsession-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可以一次性返回多条不同的解答(nChatCompletionRequest类中一个参数)。

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 生成图片

最简单的使用方式是

OpenAiUtils.createImage(prompt);

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

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

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

2.2.1 测试

测试代码

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

结果
默认情况下会生成一个url,点击去就可以看到图片。
在这里插入图片描述

2.3 下载图片

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

OpenAiUtils.downloadImage(prompt, response);

通用方式如下:

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

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

2.3.1 测试

测试代码

@RestController
public 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 生成流式回答

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

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方法的入参中。同时,为了避免结果输出到浏览器产生乱码和支持流式输出,需要ContentTypeCharacterEncoding

具体代码如下:

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

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

在这里插入图片描述

3 AI助手展示

接入微信公众号,AI助手可自动回复。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_184.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

奇舞周刊第486期:ChatGPT 的狂飙之路

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■ChatGPT 的狂飙之路最近随着 ChatGPT 爆火出圈&#xff0c;网络上各种关于 ChatGPT 的争论声也不断&#xff1b;有些人把它当成一个更高级的聊天机器人&#xff0c;有人兴奋地看到了创…

阿里巴巴达摩院通义千问【附申请链接】阿里版ChatGPT

&#x1f951; Welcome to Aedream同学 s blog! &#x1f951; 文章目录报名测试实际体验效果阿里云作为数一数二的全球云平台&#xff0c;阿里的大语言模型通义千问还是值得期待的&#xff0c;凭借强大的算力支持还是有机会赶上人工智能发展浪潮。 早前阿里巴巴达摩院关于人工…

如何在QQ群中接入ChatGPT机器人

最近ChatGPT很火&#xff0c;但是每次要在浏览器上输入显得很麻烦。那么能不能在我们日常使用的软件中接入它让我们能方便的使用它呢&#xff1f;下面为你介绍如何在QQ群中接入chatgpt。环境介绍今天我们的分享主要围绕着大部分用户Windows电脑。基于nodejs。所需工具nodejs(版…

InstructGPT论文详解(学习ChatGPT必看论文)

InstructGPT论文详解&#xff08;Training language models to follow instructions with human feedback&#xff0c;学习ChatGPT必看论文&#xff09;返回论文和资料目录 1.导读 继ChatGPT大火后&#xff0c;越来越多人想了解ChatGPT相关技术。OpenAI官网虽然没有给出ChatG…

解放生产力!chatGPT接入Excel与Word教程(需要魔法上网,不用的都是骗人的)

解放生产力&#xff01;chatGPT接入Excel与Word教程&#xff08;需要魔法上网&#xff0c;不用的都是骗人的&#xff09;&#xff01;&#xff01;&#xff01;默认你注册过openAI账号了并使用过chatGPT了&#xff0c;本文就不教如何注册GPT啦&#xff0c;网上全是教程&#xf…

已获得百度文心一言内测资格,和ChatGPT3.5简单对比测评

今日获得了百度刚发布的文心一言的内测资格。整体感觉还不错哟。 闲来无事&#xff0c;使用同样的问题&#xff0c;用文心一言和我们基于ChatGPT的GPT-3.5-Turbo接口开发的免费镜像网站作了一下对比。给各位同学提前做一下参考。 传送门&#xff1a;https://ai.bo-e.com/ 接口…

ChatGPT技术与市场动态

ChatGPT服务器&#xff0c;深度拆解&#xff08;2023&#xff09;ChatGPT发布之后&#xff0c;引发了全球范围的关注和讨论&#xff0c;国内各大厂商相继宣布GPT模型开发计划。据各公司官网&#xff0c;2023年2月7日&#xff0c;百度宣布将推出ChatGPT类似产品“文心一言”&…

PHP - ChatGpt 学习 仅供参考

由于最近ChatGpt 大火&#xff0c;但是门槛来说是对于大家最头疼的环节&#xff0c; 由此ChatGpt 有一个API 可以仅供大伙对接 让我来说下资质&#xff1a; 1&#xff1a;首先要搞得到一个 ChatGpt 的账户&#xff0c; 会获得一个KEY&#xff0c;该key为访问API核心&#xff0…

ChatGPT王炸更新!能联网获取新知识,可与5000+个应用交互,网友:太疯狂了

梦晨 杨净 发自 凹非寺量子位 | 公众号 QbitAI都说ChatGPT是AI的“iPhone时刻”&#xff0c;现在属于它的“应用商店”来了。OpenAI刚刚又甩出一个王炸——宣布推出插件功能&#xff0c;赋予ChatGPT使用工具、联网、运行计算的能力。例如在官方演示中&#xff0c;ChatGPT一旦接…

chatgpt的多种免费使用方式

很多朋友因为各种限制无法开通#ChatGPT Plus&#xff0c;而申请OpenAI的GPT-4 API也要慢慢排队&#xff08;我的也还没下来&#xff09;。于是在这里我搜集了X个可以免费使用的方法。 注&#xff1a;哪有什么真正免费&#xff0c;只不过有人在替你付钱。因此下述的方法都有限制…

ChatGPT带你轻松入门嵌入式,实现51、STM32、Arduino、树莓派、Linux各种点灯程序...

关注星标公众号&#xff0c;不错过精彩内容作者 | strongerHuang微信公众号 | strongerHuang最近两个月什么最火&#xff1f;我想 ChatGPT 必定算其中一个。这东西能有多火&#xff1f;我之前一直以为只有在互联网等技术领域比较火&#xff0c;直到前不久&#xff0c;我们当地政…

搭建个人专属ChatGPT(零成本且不需要XX)

本篇文章假定读者已经拥有OpenAPI帐号&#xff0c;并且已经获取了API访问的secret key。 本文部分内容由ChatGPT生成 ChatGPT网页版开发 本章节描述了如何从零开发一个私有化版本的 ChatGPT 网站&#xff0c;主要使用技术栈为 NextJS TailwindCSS chatgpt &#xff0c;其中 …

6 个令人惊艳的 ChatGPT 项目,开源了!

公众号关注 “GitHubDaily”设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01;过去一周&#xff0c;技术圈的各个爆炸新闻&#xff0c;可以说是让我真正见证到了什么叫人间一日&#xff0c;AI 一年。首先是 New Bing 对所有用户放开&#xff0c;注册即可用&#xff0c;然…

关于 ChatGPT 必看的 10 篇论文

目录1 Transformer2 GPT-33 InstructGPT4 Sparrow5 RLHF6 TAMER7 PPO8 In-Context Learning8.1 Why Can GPT Learn In-Context8.2 What learning algorithm is in-context learning9 Prompt参考团队博客: CSDN AI小组 相关阅读 ChatGPT 简介从 ELMo 到 ChatGPT&#xff1a;历数…

前沿重器[31] | 理性聊聊ChatGPT

前沿重器栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

最强的数据增强--ChatGPT?

在许多自然语言处理(NLP)任务中&#xff0c;文本数据增强是克服样本量有限挑战的有效策略。 目前的文本数据增强方法要么不能保证生成数据的正确标记(缺乏可信度)&#xff0c;要么不能保证生成数据的足够多样性(缺乏完整性)&#xff0c;要么两者兼有。 ChatGPT在具有无与伦比…

chatgpt_academic学术优化(配置使用教学-保姆级)

一、Anaconda 下载及安装 1.官网下载链接 &#xff1a;www.anaconda.com/ 2.安装 &#xff08;1&#xff09;下载完成后&#xff0c;双击exe进行安装 &#xff08;2&#xff09;安装完成后&#xff0c;点击Anaconda Navigator&#xff0c;然后点击 CMD.exe Prompt &#xff0…

未来以来,可能是最好ChatGPT学习社群来了!

最近ChatGPT大火&#xff0c;但是大部分人都停留在入门级阶段。但有一点是毫无疑问的&#xff0c;ChatGPT带动的这波浪潮将会彻底改变我们的生活。我最近也一直在研究如何将ChatGPT与大数据结合起来&#xff0c;有进展会与大家分享。今天分享的这个社群也是自己抱有极高期望&am…

用ChatGPT创建虚拟小镇,或许《西部世界》已经成为现实

我们也许真的可以创造一个世界&#xff01; 你们有没有想过有一天电影《西部世界》可能成为现实&#xff0c;又或许它已经成为现实了。当我们以后玩的游戏不在是程序员的精心设计&#xff0c;而是它们自己的“情绪变化”&#xff0c;那这个世界又会是怎样&#xff1f;可能有一天…

手把手教你使用Python调用 ChatGPT!我不容许你还不知道这么好的东西!

前段时间OpenAI 开放了两个新模型的api接口&#xff0c;专门为聊天而生的 gpt-3.5-turbo 和 gpt-3.5-turbo-0301。 ChatGPT is powered by gpt-3.5-turbo, OpenAI’s most advanced language model. 从上面这句话&#xff0c;我们可以知道现在 chat.openai.com 官网就是由 gpt-…