基于ChatGPT API的PC端软件开发过程遇到的问题的分析
如果喜欢本文章,记得收藏哦!
关注我,一起学Java。
一、基于ChatGPT API的PC端软件开发过程遇到的问题的分析
最近这个OpenAI公司推出的GPT-4.0模型真是太火了。当然由于OpenAI目前还没有正式全面对外开放GPT-4.0 API,所以本次使用的是GPT-3.5 API。
首先来看一下效果图吧!
本客户端使用的是 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。
有更多问题欢迎访问博客。
相关文章:
基于ChatGPT API的PC端软件开发过程遇到的问题的分析
如果喜欢本文章,记得收藏哦! 关注我,一起学Java。 一、基于ChatGPT API的PC端软件开发过程遇到的问题的分析 最近这个OpenAI公司推出的GPT-4.0模型真是太火了。当然由于OpenAI目前还没有正式全面对外开放GPT-4.0 API,所以本次使用…...
啥是插入排序 ?
一、概述 排序是算法中的一部分。所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏,发完牌之后需要对手上的牌进行排序,大家想想,麻将排序如何排呢…...
华为OD机试题 Q2 押题【贪心的商人 or 最大利润】用 C++ 编码,速通
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:贪心的商人 or 最大利润 题目…...
spring框架注解
3.Spring有哪些常用注解呢? Spring常用注解 Web: Controller:组合注解(组合了Component注解),应用在MVC层(控制层)。 RestController:该注解为一个组合注解,相当于Con…...
前端如何处理文本溢出
前言 在现代网页设计中,文本是网页中最重要的内容之一。然而,当文本超出其容器的大小时,会发生文本溢出的问题。文本溢出不仅会影响网页的视觉效果,还会影响网页的可读性和可用性。在前端开发中,解决文本溢出的问题是…...
vue elementUI select下拉框设置默认值(赋值)失败
vue elementUI select下拉框设置默认值 要为select下拉框设定默认值,只需要把 v-model 绑定的值和你想要选中 option 的 value 值设置一样即可。 下面上代码: html部分代码: <el-select v-model"valuetype" change"ch…...
TensorRT创建Engine并推理engine
1. 验证集数据集 Class Images Labels P R mAP.5 mAP.5:.95: 100%|██████████| 84/all 1000 28423 0.451 0.374 0.376 0.209pedestrians 1000 17833 0.737 0.855 0.88 …...
生成式人工智能所面临的问题有哪些?
在生成式人工智能中工作需要混合技术、创造性和协作技能。通过发展这些技能,您将能够在这个令人兴奋且快速发展的领域应对具有挑战性的问题。 生成式人工智能是指一类机器学习技术,旨在生成与训练数据相似但不完全相同的新数据。 换句话说,…...
代码随想录算法训练营第四十三天 | 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零
打卡第43天,01背包应用。 今日任务 1049.最后一块石头的重量 II494.目标和474.一和零 1049. 最后一块石头的重量 II 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头࿰…...
PostCSS 让js可以处理css
GitHub 中文readmie PostCSS 中文网(建设中) PostCSS 不是样式预处理器 是 CSS 语法转换的工具,但不严格遵循css规范,只要符合css语法规则就可以被处理。这也让提前实现新提案成为可能。 使用 webpack 中使用 postcss-loader …...
【C语言进阶:自定义类型详解】位段
本节重点内容: 什么是位段位段的内存分配位段的跨平台问题位段的应用⚡什么是位段 位段的声明和结构是非常类似的,但是有两个不同: 位段的成员必须是 int、unsigned int 或signed int 。位段的成员名后边有一个冒号和一个数字。 struct A…...
十三、RNN循环神经网络实战
因为我本人主要课题方向是处理图像的,RNN是基本的序列处理模型,主要应用于自然语言处理,故这里就简单的学习一下,了解为主 一、问题引入 已知以前的天气数据信息,进行预测当天(4-9)是否下雨 日期温度气压是否下雨4-…...
五子棋透明棋盘界面设计(C语言)
五子棋透明棋盘设计,漂亮的界面制作。程序设置双人对奕,人机模式,对战演示三种模式。设置悔棋,记录功能,有禁手设置。另有复盘功能设置。 本文主要介绍透明的玻璃板那样的五子棋棋盘的制作。作为界面设计,…...
Redis第六讲 Redis之List底层数据结构实现
List数据结构 List是一个有序(按加入的时序排序)的数据结构,Redis采用quicklist(双端链表) 和 ziplist 作为List的底层实现。可以通过设置每个ziplist的最大容量,quicklist的数据压缩范围,提升数据存取效率 list-max-ziplist-size -2 // 单个ziplist节点最大能存储 8kb ,…...
电子学会2023年3月青少年软件编程python等级考试试卷(四级)真题,含答案解析
目录 一、单选题(共25题,共50分) 二、判断题(共10题,共20分) 三、编程题(共3题,共30分)...
【MATLAB】一篇文章带你了解beatxbx工具箱使用
目录 一篇文章带你了解beatxbx工具箱使用 一篇文章带你了解beatxbx工具箱使用 clc;clear; tic; % step1 初始化 % 个体数量 NIND = 35; % 最大遗传代数 MAXGEN = 180; % 变量的维数 NVAR = 2; % 变量的二进制位数 % 上下界 bounds=[-10 10-10 10]; precision=0.0001; %运算精度…...
【LinuxC Sqlite数据库小项目】基于Sqlite的打卡系统------适合初学者练手的小项目
最近小哥老是想浪,不想好好学习,这不行啊,得想点办法,多少做点努力,于是就自己给自己写了个打卡程序; 该程序基于Sqlite数据库,实现一个简单的打卡功能,该函数具有自动初始化的功能…...
在掌握C#基础上再学习C语言
C#和C语言虽然名字相似,但它们在很多方面都有很大的区别。 首先,C#是一种面向对象的语言,而C语言是过程化的语言。这意味着C#具有更丰富的语言特性,如类、接口、继承和多态性等,而C语言则更侧重于直接对计算机硬件进行…...
HTML5 <body> 标签
HTML <body> 标签 实例 一个简单的 HTML 文档,包含尽可能少的必需的标签: <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>文档标题</title> </head><body> 文档内容…...
(链表)反转链表
文章目录前言:问题描述:解题思路:代码实现:总结:前言: 此篇是针对链表的经典练习。 问题描述: 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1…...
终极指南:3步用VR-Reversal将3D视频转为2D,普通设备也能自由探索VR世界
终极指南:3步用VR-Reversal将3D视频转为2D,普通设备也能自由探索VR世界 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址…...
视频高清低延时直播/音视频点播/云点播/云直播EasyDSS在校园教育/K12教育等各场景中的应用介绍
在线教育的核心竞争力,归根结底在于教学体验的优劣,而视频技术作为线上教学的核心载体,直接决定了教学体验的上限。随着在线教育行业的快速迭代,学员对线上课堂的要求愈发严苛:不仅需要高清流畅、稳定无卡顿的音视频传…...
丹青幻境保姆级教程:LoRA卷轴版本管理与热更新机制在生产环境落地
丹青幻境保姆级教程:LoRA卷轴版本管理与热更新机制在生产环境落地 1. 项目背景与核心价值 丹青幻境是一款专为数字艺术创作者设计的AI绘画工具,它巧妙地将现代AI技术与传统东方美学相结合。与传统的技术工具不同,丹青幻境采用了宣纸质感界面…...
3种方法永久解决IDM激活弹窗问题 开源工具全解析
3种方法永久解决IDM激活弹窗问题 开源工具全解析 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager(IDM)作为一款…...
从一次系统升级说起:聊聊Android PMS如何管理/system/app下的预装应用
Android PMS深度解析:系统预装应用的管理艺术 1. 系统预装应用的特殊地位 在Android生态系统中,预装应用占据着独特的位置。这些位于/system/app目录下的应用与普通用户应用有着本质区别: 系统级权限:预装应用通常拥有更高的系统权…...
StructBERT中文相似度模型保姆级教学:如何用TSNE可视化高维句向量空间分布
StructBERT中文相似度模型保姆级教学:如何用TSNE可视化高维句向量空间分布 1. 引言:为什么需要可视化句向量? 当你使用StructBERT这样的模型计算句子相似度时,你得到的只是一个0到1之间的数字。这个数字告诉你两个句子“有多像”…...
ClaudeCode 入门详细教程,手把手带你Vibe Coding
本文使用 Mac 进行演示。主要是在安装环节有环境差异。 1. Claude Code 简介 Claude Code 是 Anthropic 推出的面向开发者的 AI 编程协作工具。Claude Code 的核心目标是理解你的整个项目,并参与到真实的编码、修改和重构过程中。Claude Code 不是一个代码生成器&…...
华为五级流程体系(L1-L5) 、流程框架、实施方法与最佳实践108页PPT
一、华为流程体系 业务流程持续变革促进华为业务的高速发展,持续管理变革,降低运作成本、提升运作效率,实现对客户端到端优质交付.把过去,好的方法固话下来。推广出去,提高效率和质量降低业务风险;提供多条路径和方法,…...
从RTL到GDSII:用Design Compiler优化时序的关键20个命令详解
从RTL到GDSII:用Design Compiler优化时序的关键20个命令详解 在先进工艺节点下,时序收敛已成为ASIC设计中最具挑战性的环节之一。当我们从RTL代码出发,最终生成满足PPA(性能/功耗/面积)目标的GDSII布局布线文件时&…...
资源提取高效解析与跨设备管理:猫抓浏览器扩展的技术实践
资源提取高效解析与跨设备管理:猫抓浏览器扩展的技术实践 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化内容爆炸的今天&…...
