基于ChatGPT API的PC端软件开发过程遇到的问题的分析

如果喜欢本文章,记得收藏哦!
关注我,一起学Java。

一、基于ChatGPT API的PC端软件开发过程遇到的问题的分析

最近这个OpenAI公司推出的GPT-4.0模型真是太火了。当然由于OpenAI目前还没有正式全面对外开放GPT-4.0 API,所以本次使用的是GPT-3.5 API。

首先来看一下效果图吧!

image-20230403175127354

本客户端使用的是 JavaFX 开发的。JavaFX 相比于 Swing 来说,JavaFX 支持 CSS 样式,如果使用 Java 来开发 GUI 软件的话,还是推荐使用 JavaFX 的。JavaFX 是 2008 年由 Oracle 公司推出的项目。需要说明的是在高版本的 JDK 中不含有 JavaFX 相关的 API,所以你需要自己安装 JavaFX。因为我开发使用的是 JDK 8 所以无需自己另外安装 JavaFX,直接就可以调用 JavaFX API。

上面的图中我们可以看到使用 JavaFX 编写的 UI 界面不是太好看,没办法 Java 是我的主力编程语言,所以只能用 Java 来编写 UI 界面了。

主要有四个功能,分别是:发送,保存,查看,删除。其中发送是最核心的功能。在发送时会间接调用 GPT-3.5 API,这里为什么说是间接调用而不是直接调用呢,想必大家都知道,这个 OpenAI 公司是不对我们中国地区开放的,虽然我们可以直接访问OpenAI 的官方网站,但是不能访问 OpenAI 的产品ChatGPT。所以这里我们必须要自己使用一个国外的服务器作为中转服务器。很容易理解为啥使用中转服务器就可以访问GPT API,比如你是A,你可以访问B,但是你无法访问C,然而B是可以访问C的,那么你就可以告诉B,让B把信息传递给C。

这里我只讲开发客户端软件遇到的问题,不会讲解如何编写接口。

二、遇到的第一个问题,用户点击发送按钮后,线程阻塞

这个问题主要是因为用户点击了发送按钮后会调用 Hutool 工具类中的 HttpRequest.post() 方法将数据发送到自己定义的接口上。代码如下:

sendButton.setOnAction(e -> sendMessage());
private void sendMessage() {// 获取用户输入的消息并将其添加到聊天区域String prompt = inputArea.getText();// 获取当前时间String nowTime = getNowTime();chatArea.appendText(nowTime + "\n");chatArea.appendText("我说:" + prompt + "\n\n");// 清空输入框inputArea.setText("");// 存储上下文语境messages.add(new Message("user", prompt));// 获取 ChatGPT 的回复String reply = httpRequest(messages);// 机器人回复时间String replyTime = getNowTime();chatArea.appendText(replyTime + "\n");// 把内容显示到 UI 界面上chatArea.appendText("机器人说:" + reply + "\n\n");messages.add(new Message("assistant", reply));
}

在上面的代码中,运行的时候给用户的感觉是不好的,因为在调用 httpRequest(messages) 时会造成线程阻塞。因为在当前线程在进行网络请求时是非常耗时的操作,所以整个 main 线程会阻塞,导致应用卡顿,如果 ChatGPT 一直没有响应结果,那么会一直卡在那里。

或许你们想到的是创建一个新的线程来发送 http 请求就解决了,其实不是的,问题的根源在我们点击“发送”按钮,我们应该在点击发送按钮的时候创建新的线程,当然这里我在发送 http 的时候也是创建了新的线程。代码如下:

sendButton.setOnAction(e -> {Task<Void> task = new Task<Void>() {@Overrideprotected Void call() throws Exception {// 执行耗时操作,例如发送网络请求或执行计算密集型任务sendMessage();// 返回nullreturn null;}};// 在后台线程上执行Tasknew Thread(task).start();// 将操作提交到JavaFX应用程序线程队列中Platform.runLater(() -> {// 在此更新UI或执行其他需要在JavaFX应用程序线程上执行的操作});
});
private void sendMessage() {// 获取用户输入的消息并将其添加到聊天区域String prompt = inputArea.getText();// 获取当前时间String nowTime = getNowTime();chatArea.appendText(nowTime + "\n");chatArea.appendText("我说:" + prompt + "\n\n");// 清空输入框inputArea.setText("");// 存储上下文语境messages.add(new Message("user", prompt));// 获取 ChatGPT 的回复// String reply = httpRequest(messages);// 创建新的线程去发送 ChatGPT 请求FutureTask<String> task = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() throws Exception {return httpRequest(messages);}});new Thread(task).start();try {String reply = task.get();// 机器人回复时间String replyTime = getNowTime();chatArea.appendText(replyTime + "\n");// 把内容显示到 UI 界面上chatArea.appendText("机器人说:" + reply + "\n\n");messages.add(new Message("assistant", reply));} catch (Exception e) {e.printStackTrace();}
}

注意:如果想要更新 UI 界面的内容,那么可以使用Platform.runLater()

三、第二个问题是ChatGPT无法进行连续对话,也就是没有上下文语境

这个问题折腾了好久。官方开发文档好像也没有特地说明这一点。我是研究了 GitHub 的代码,并且网上搜索了别人的想法,然后知道必须要把聊天记录再次发送给 ChatGPT API。但是这样就会消耗更多的资金。因为 OpenAI 并非真的是 Open。

我们每次把聊天记录发送给 ChatGPT 就行。

这里我们使用一个集合存放聊天记录,每次把聊天记录追加到集合里面即可。然后把 List 集合发送到 ChatGPT API。

// 存放上下文语境
private List<Message> messages = new ArrayList<>();
// 存储上下文语境
messages.add(new Message("system", "你是一个助手"));
messages.add(new Message("user", prompt));
messages.add(new Message("assistant", reply));

其中 Message 类代码如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {private String role;private String content;
}

ChatGPT 开发文档中说明了 role 有三种值,一个是 system,表示让 ChatGPT 充当什么角色,第二种取值是 user,表示用户,第三种是 assistant,表示 ChatGPT。而角色对应的内容存储到 content 变量中。这类似于 map 集合,也就是 role 是 key,content 是 value。


有更多问题欢迎访问博客。

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

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

相关文章

网站链接被微信屏蔽拦截了怎么办?VJump帮你解除屏蔽

出现这种情的原因呢&#xff0c;我相信大家也去了解了很多&#xff0c;但是对于商家来说&#xff0c;我们要避免出现这种情况&#xff0c;或出现了要立马解决。了解原因再去想解决办法是技术的事情。一天没解决&#xff0c;就多一天的损失。原因大同小异&#xff0c;无非是域名…

聊天消息敏感词屏蔽系统(字符串替换 str.replace(str1, *) )

Python 官网&#xff1a;https://www.python.org/ 这里&#xff0c;才 python 前沿。可惜是英文原版。所以&#xff0c;我要练习英文阅读。&#x1f9d0;&#x1f9d0; 我的CSDN主页My Python 学习个人备忘录我的HOT博老齐教室 自学并不是什么神秘的东西&#xff0c;一个人一辈…

域名被微信/QQ红了(被封锁、被屏蔽、被和谐)后最好的解决方法

关于域名总被微信封杀、屏蔽、拦截&#xff0c;等问题。简单说下自己的经验。有不少用户私信我。累死了&#xff0c;统一说下&#xff1a; 域名被微信封杀&#xff0c;显示的是链接无法访问&#xff1b; 域名被微信拦截&#xff0c;是跟淘宝一样 - 如需浏览&#xff0c;请长按…

Adguard Home导致bilibili图片视频被屏蔽记录

Adguard Home导致bilibili图片视频被屏蔽记录 一、问题 使用openwrt中的Adguard&#xff0c;出现了打开bilibili后&#xff0c;里面的视频图片无法显示&#xff0c;点进去的视频也无法观看的问题。 二、尝试解决 跳过Adguard&#xff0c;即设置DNS不通过Adguard。没效果。关闭…

四种方法检测网站是否被微信、QQ等拦截屏蔽

如今公司的线上网站、App业务都离不开微信、QQ这样的社交软件来推广&#xff0c;有时候分享链接一旦点击的人多了&#xff0c;就被微信、QQ拦截或标红了&#xff0c;非常影响业务的发展和用户体验。那如何监控线上业务的持续性呢&#xff1f;今天我们就介绍几种方法来知道域名有…

保存图片到本地和分享多张图片到QQ、微信、WhatsApp、Facebook等平台

保存图片到本地和分享多张图片到QQ、微信、WhatsApp、Facebook等平台 一、分享图片到各个平台多种方式&#xff1a;如第三方的sdk&#xff1a;ShardSDK,直接通过分享到的平台的包名来分享图片的原生方法 1.通过ShareSDK分享图片&#xff0c;不要忘记导入相应的应用包和初始化…

这样写代码,同事乐开花

往期热门文章&#xff1a; 1、Java接口开发&#xff0c;不用写Controller、Service、Dao、Mapper、XML、VO&#xff0c;自动生成&#xff01; 2、为什么说程序员是一个极度劳累的工作&#xff1f; 3、Spring6的新特性&#xff0c;正式“抛弃”feign了 4、微软美国全职员工福利&…

【资源分享】经典老歌、KTV必点歌曲分享

不知道各位小伙伴有没有遇到过这种情况。长辈叫你帮他下载一些老歌放U盘里面&#xff0c;于是打开搜索引擎正准备大展手脚时&#xff0c;却发现是一个又一个的付费购买。 本人也是在这上面与搜索引擎做了不少斗争&#xff0c;以下包含了KTV必点歌曲五百多首&#xff0c;经典粤…

基于GPT3.5模型搭建的聊天系统BAIChat

1. 使用chatgpt前提条件 需要特殊的网络环境。如果是小白&#xff0c;不会搭建网络环境&#xff0c;可以关注我私信我&#xff0c;在线帮你搭建网络环境。 2.BAIChat链接 https://chatbot.theb.ai/#/chat/1686535596065 GPT3 研究背景 最近的研究表明&#xff0c;在 pretrai…

【编程必备】保姆级教学:简单教你使用 Python 调用 ChatGPT-3.5-API

前天 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-3.5…

GPT时代,超强大脑才是你的第一财富。

ChatGPT 爆火后&#xff0c;无数人把这个无所不能的对话机器人当做生活、工作助理&#xff0c;用其代替搜索引擎、生成流畅的翻译、甚至撰写文章、剪辑视频、分析数据&#xff0c;享受着“不劳而获”的便利和高效体验。 自然而然地&#xff0c;一些老生常谈的话题&#xff0c;比…

新书上市 | 从大脑认知开始,全方面提高编程能力,助你摆脱“GPT焦虑症”

目录 一、ChatGPT火爆全网二、《程序员超强大脑》三、本书内容四、本书特色五、作译者简介1、费莉安赫尔曼斯&#xff08;Felienne Hermans&#xff09;2、蒋楠 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&#xff0c;49天精通Java从入门到就业。 全网最细Java零…

别贩卖焦虑了,人工智能永远无法取代你

每一次生产力的变革&#xff0c;在带来技术进步与更高效率的同时&#xff0c;也都无可避免的会带来一波失业浪潮&#xff0c;当下的人工智能浪潮自然也不例外。现在&#xff0c;第一批因为AI失业的人已经出现了…… 因为AI失业的第一批人&#xff0c;已经开始在游戏行业出现了 …

基于线上考研资讯数据抓取的推荐系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网的飞速发展&#xff0c;互联网在各行各业的应用迅速成为众多学校关注的焦点。他们利用互联网提供电子商务服务&#xff0c;然后有了“考研信息平台”&#xff0c;这将使学生考研的信息平台更加方便和简单。 对于考研信息平台的设计&#xff0c;大多采用java技…

【.NET AI Books】问题分类和技能使用大全

第一章 问题分类 我会把问题设定放在首位&#xff0c;也就是我们的第一章。毕竟所有生成式的 AI 都是需要基于问题给出答案。所以我一直不认同人工智能会取代人类&#xff0c;没有人类哪来问题呢&#xff1f; ChatGPT 的神奇之处在于它可以根据你的问题去完成不同的工作&…

周期函数傅里叶级数的各次谐波系数确定

周期函数傅里叶级数的各次谐波系数确定 在不考虑直流分量的情况下对于周期函数的系数进行计算确定。 简单阐述原理过程。 实例场景&#xff1a; 假定被采样信号的模拟信号时一个周期性时间函数&#xff0c;除基波外还含有不衰减的直流分量和各次函数。 基本形式 周期函数的…

奈奎斯特稳定性判据的步骤(含详细推导)

奈奎斯特稳定性判据的步骤&#xff1a; 一、作出半闭合曲线1.作出开环系统的奈奎斯特曲线2.补圆 二、计算R的大小三、判断Z是否为0 提示&#xff1a;本文只含有奈奎斯特判据的步骤&#xff0c;适合期末防挂科的同学&#xff0c;若想要透彻地了解奈奎斯特判据的原理&#xff0c;…

《重学 Java 设计模式》PDF 出炉了 - 小傅哥,肝了50天写出18万字271页的实战编程资料

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 文章目录 一、前言二、简介1. 谁发明了设计模式&#xff1f;2. 我怎么学不会设计模式&#xff1f;3. 适合人群4. 我能学到什么5.…

三角函数到傅立叶级数

我讨厌傅立叶级数的叫法&#xff0c;这老让我感觉到很深奥&#xff0c;但当我用三角级数时&#xff0c;感觉就大不同了&#xff01;&#xff01; 下面进入正题 正弦波 信号处理中极为极为极为重要的一个函数,三角函数,之所以叫做三角函数,是因为它的计算方式和直角三角密切相…

三大变换与自控(一)傅里叶级数

这一系列文章记录了我在学习三大变换时的心得。 首先从傅里叶变换开始&#xff0c;这是将一个信号从时域转变成频域的算法&#xff0c;在信号处理方面非常有用。 如果正在阅读这篇文章的读者还对傅立叶分析没有一个比较清楚的感性认识&#xff0c;建议先阅读一下知乎的一篇文…