SpringBoot 集成 ChatGPT,实战附源码
1 前言
在本文中,我们将探索在 Spring Boot 应用程序中调用 OpenAI ChatGPT API 的过程。我们的目标是开发一个 Spring Boot 应用程序,能够利用 OpenAI ChatGPT API 生成对给定提示的响应。
您可能熟悉 ChatGPT 中的术语“提示”。在 ChatGPT 或类似语言模型的上下文中,提示是指用户提供的用于生成响应的输入或初始文本。它是您输入到模型中以获得相关输出的文本或查询。
提示本质上是作为语言模型理解和生成连贯响应的指令或起点。提示的质量和清晰度会显著影响模型提供准确且相关的信息或响应的能力。
2 什么是 ChatGPT?
我向 ChatGPT 提出了这个问题,看看它会产生什么反应。

ChatGPT 是一种生成式人工智能,允许用户输入提示并接收类似人类的图像、文本或视频形式的输出,所有这些都是由人工智能生成的。
ChatGPT 目前使用 GPT-3.5 模型,通过微调过程改进算法。然而,增强版本 ChatGPT Plus 包含了 GPT-4 模型。此升级版本拥有更快的响应时间,支持互联网插件,并展示了处理图像描述、图像标题生成等复杂任务的改进功能。
OpenAI 将 GPT-4 描述为比其前身 GPT-3.5 先进十倍。这一进步使模型能够表现出更好的上下文理解和细微差别,从而导致更精确和连贯的响应。
3 OpenAI ChatGPT API
我们将调用create chat completion API (POST https://api.openai.com/v1/chat/completions )来生成对提示的响应。让我们探索一下 OpenAI ChatGTP API。
我们需要发送什么请求来调用 OpenAI API?
访问“create chat completion API ” 链接后,可以看到有关端点、请求和响应的以下信息。
端点:POST https://api.openai.com/v1/chat/completions
转到 Playgroud 并输入任何消息,例如“什么是 Spring Boot?”

现在点击“查看代码”。您将看到提示符“ What is spring boot?”的 curl 命令。”。

复制命令并导入到postman客户端中。

这是我们传递的请求,用于从 OpenAI 完成 API 获取响应。
检查 API 的基本请求参数:
- Model: 该参数指定请求将发送到的模型的版本。存在各种模型版本,为此,我们将使用 gpt-3.5-turbo 模型,这是最新的公开版本。
- Messages: 该参数作为模型的提示。每条消息都包含两个基本字段:“role”和“content”。“role”字段指定消息发送者,在请求中表示为“用户”,在响应中表示为“助理”。“content”字段包含实际的消息内容。
Model 和 Message 是 API 请求中必须包含的参数。
其他可选参数包括:
- n: 默认值为1,表示为每个输入消息生成的响应数。
- temperature: 默认值为1,范围为0到2。该参数调节响应的随机性。较高的值会增加随机性,而较低的值会增强焦点和确定性。
- max_tokens: 默认情况下没有限制,但该参数允许您指定在响应中生成的最大令牌数量。事实证明,它在管理非常大的响应和控制成本方面非常有用。
在 Postman 中发出上述请求时,除非将 OpenAI API 密钥作为不记名令牌传递,否则将发生身份验证失败。必须包含 OpenAI API 密钥作为不记名令牌来验证 OpenAI ChatGPT 完成 API。
4 创建 OpenAI API 密钥
在此注册并创建您自己的 OpenAI API 密钥。

4.1 设置 Spring Boot 应用
现在让我们设置 Spring Boot 应用程序…

我们需要在 pom.xml 中添加以下依赖项
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
在 dtos 包下创建 ChatBotRequest、ChatBotResponse 和 Message DTO:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChatBotRequest {private String model;private List<Message> messages;private int n;private double temperature;private int max_tokens;
}--------------------@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChatBotResponse {private List<Choice> choices;@Data@AllArgsConstructor@NoArgsConstructorpublic static class Choice {private int index;private Message message;}
}--------------------@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {private String role;private String content;}
在application.properties文件中添加以下配置:
openai.chatgtp.model=gpt-3.5-turbo
openai.chatgtp.api.key=REPLACE_WITH_YOUR_API_KEY
openai.chatgtp.api.url=https://api.openai.com/v1/chat/completionsopenai.chatgtp.max-completions=1
openai.chatgtp.temperature=0
openai.chatgtp.max_tokens=100
4.2 RestTemplate配置
在配置包下创建一个类OpenAIChatGtpConfig:
@Configuration
public class OpenAIChatGtpConfig {@Value("${openai.chatgtp.api.key}")private String openaiApiKey;@Beanpublic RestTemplate restTemplate() {RestTemplate restTemplate = new RestTemplate();restTemplate.getInterceptors().add((request, body, execution) -> {request.getHeaders().add("Authorization", "Bearer " + openaiApiKey);return execution.execute(request, body);});return restTemplate;}
}
- @Value(“${openai.chatgtp.api.key}”):此注释用于从应用程序的属性文件注入值。在本例中,它从属性文件中检索 OpenAI 的 API 密钥。
- restTemplate.getInterceptors().add(…):配置拦截器RestTemplate。该拦截器被添加到拦截器列表中,负责在发送 HTTP 请求之前对其进行修改。
- 拦截器 ( (request, body, execution) -> { … }) 将“Authorization”标头添加到 HTTP 请求中。标头包含格式为“Bearer {apiKey}”的 OpenAI API 密钥。
总之,此配置类设置了一个RestTemplate带有拦截器的 bean,该拦截器将 OpenAI API 密钥添加到“Authorization”标头,确保由此发出的后续 HTTP 请求经过RestTemplate身份验证。
4.3 API控制器
现在,我们可以继续创建 REST 控制器,负责利用之前配置的RestTemplate来发出 API 请求并处理相应的 API 响应。
在controllers包下创建一个类ChatBotController:
@RestController
public class ChatBotController {@Autowiredprivate RestTemplate restTemplate;@Value("${openai.chatgtp.model}")private String model;@Value("${openai.chatgtp.max-completions}")private int maxCompletions;@Value("${openai.chatgtp.temperature}")private double temperature;@Value("${openai.chatgtp.max_tokens}")private int maxTokens;@Value("${openai.chatgtp.api.url}")private String apiUrl;@PostMapping("/chat")public BotResponse chat(@RequestParam("prompt") String prompt) {BotRequest request = new BotRequest(model,List.of(new Message("user", prompt)),maxCompletions,temperature,maxTokens);BotResponse response = restTemplate.postForObject(apiUrl, request, BotResponse.class);return response;}
}
现在我们已经完成了编码。让我们测试一下应用程序…

使用 OpenAI ChatGPT Completion API 我们可以实现什么?
以下是使用 OpenAI Completion API 和 ChatGPT 等模型可以实现的一些功能:
- 自然语言生成: 您可以出于各种目的生成类似人类的文本,例如内容创建、创意写作等。
- 文本摘要: 您可以使用该模型来总结长文本或文章,将信息压缩为更短、更容易理解的形式。
- 语言翻译: 将文本从一种语言翻译成另一种语言。
- 文本完成: 您可以使用 ChatGPT 来完成句子或段落,这对于填充文本的缺失部分非常有用。
- 问答: 您可以向模型提出问题,它可以根据给出的上下文提供答案。
- 对话代理: 开发聊天机器人、虚拟助理或其他对话式人工智能应用程序,以提供客户支持、信息检索或与用户互动。
- 代码生成: 生成代码片段或通过提供代码示例、解释和解决方案来协助编程任务。
- 数据输入和表格填写: 使用模型自动填写表格或完成数据输入任务。
- 创意写作: 生成诗歌、故事或其他创意内容。
- 语言理解: 分析和理解用户查询或消息中的意图和情绪。
- 模拟角色: 在虚构角色之间创建对话和互动,以讲故事或开发游戏。
- 教育援助: 为学生的问题提供解释和答案或帮助完成家庭作业。
- 内容推荐: 根据用户的偏好和查询向他们推荐内容、产品或服务。
- 起草电子邮件或文档: 协助撰写电子邮件、报告或其他书面文档。
- 模拟用户行为: 生成用户评论、评论或反馈以用于测试和培训目的。
这些只是使用 OpenAI Completion API 和 ChatGPT 等模型可以实现的一些示例。这些模型的多功能性使其对于各个行业的广泛应用都很有价值,包括教育、医疗保健、客户服务、内容生成等。请记住,生成的文本的质量可能会根据特定用例和提供给模型的输入数据而有所不同。
5 项目源码
https://github.com/363153421/chatgpt-springboot-integration
相关文章:
SpringBoot 集成 ChatGPT,实战附源码
1 前言 在本文中,我们将探索在 Spring Boot 应用程序中调用 OpenAI ChatGPT API 的过程。我们的目标是开发一个 Spring Boot 应用程序,能够利用 OpenAI ChatGPT API 生成对给定提示的响应。 您可能熟悉 ChatGPT 中的术语“提示”。在 ChatGPT 或类似语…...
数据结构——希尔排序(详解)
呀哈喽,我是结衣 不知不觉,我们的数据结构之路已经来到了,排序这个新的领域,虽然你会说我们还学过冒泡排序。但是冒泡排序的性能不高,今天我们要学习的希尔排序可就比冒泡快的多了。 希尔排序 希尔排序的前身是插入排…...
C++ day53 最长公共子序列 不相交的线 最大子序和
题目1:1143 最长公共子序列 题目链接:最长公共子序列 对题目的理解 返回两个字符串的最长公共子序列的长度,如果不存在公共子序列,返回0,注意返回的是最长公共子序列,与前一天的最后一道题不同的是子序…...
ubuntu中删除镜像和容器、ubuntu20.04配置静态ip
1 删除镜像 # 短id sudo docker rmi 镜像id # 完整id sudo docker rmi 镜像id# 镜像名【REPOSITORY:TAG】 sudo docker rmi redis:latest2 删除容器 # 删除某个具体容器 sudo docker rm 容器id# 删除Exited状态/未运行的容器,三种命令均可 sudo docker rm docker …...
华为手环 8 五款免费表盘已上线,请注意查收
华为手环 8,作为一款集时尚与实用于一体的智能手环,不仅具备强大的功能,还经常更新的表盘样式,让用户掌控时间与健康的同时,也能展现自己的时尚品味。这不,12 月官方免费表盘又上新了,推出了五款…...
JOSEF约瑟 同步检查继电器DT-13/200 100V柜内安装,板前接线
系列型号 DT-13/200同步检查继电器; DT-13/160同步检查继电器; DT-13/130同步检查继电器; DT-13/120同步检查继电器; DT-13/90同步检查继电器; DT-13/254同步检查继电器; 同步检查继电器DT-13/200 100V柜内板前接线 一、用途 DT-13型同步检查继电器用于两端供电线路的…...
龙迅#LT8311X3 USB中继器应用描述!
1. 概述 LT8311X3是一款USB 2.0高速信号中继器,用于补偿ISI引起的高速信号衰减。通过外部下拉电阻器选择的编程补偿增益有助于提高 USB 2.0 高速信号质量并通过 CTS 测试。 2. 特点 • 兼容 USB 2.0、OTG 2.0 和 BC 1.2• 支持 HS、FS、LS 信令 • 自动检测和补偿 U…...
eclipse jee中 如何建立动态网页及服务的设置问题
第一次打开eclipse 时,设置工作区时,一定是空目录 进入后 File-----NEW------Dynamic Web Project 填 项目名,不要有大写 m1 next next Generate前面打对勾 finish 第一大步: window----Preferences type filter text 处填 :Serve…...
一张网页截图,AI帮你写前端代码,前端窃喜,终于不用干体力活了
简介 众所周知,作为一个前端开发来说,尤其是比较偏营销和页面频繁改版的项目,大部分的时间都在”套模板“,根本没有精力学习前端技术,那么这个项目可谓是让前端的小伙伴们看到了一丝丝的曙光。将屏幕截图转换为代码&a…...
处理k8s中创建ingress失败
创建ingress: 如果在创建过程中出错了: 处理方法就是: kubectl get ValidatingWebhookConfiguration kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission 然后再次创建,发现可以:...
Redis高可用集群架构
高可用集群架构 哨兵模式缺点 主从切换阶段, redis服务不可用,高可用不太友好只有单个主节点对外服务,不能支持高并发单节点如果设置内存过大,导致持久化文件很大,影响数据恢复,主从同步性能 高可用集群…...
JAVA常见问题解答:解决Java 11新特性兼容性问题的六个步骤
引言: 随着技术的不断发展,Java作为一种被广泛使用的编程语言,也在不断更新和改进。Java 11作为Java的最新版本,带来了许多新的特性和改进。然而,对于一些老旧的Java应用程序来说,升级到Java 11可能会带来一…...
【C语言】深入理解指针(1)
目录 前言 (一)内存与地址 从实际生活出发 地址 内存 内存与地址关系密切 (二)指针变量 指针变量与取地址操作符 指针变量与解引用操作符 指针的大小 指针的运算 指针 - 整数 指针-指针 指针的关系运算 指针的类型的…...
MySQL的系统信息函数
系统信息函数让你更好的使用MySQL数据库 1、version()函数 查看MySQL系统版本信息号 select version();2、connection_id()函数 查看当前登入用户的连接次数 直接调用CONNECTION_ID()函数--不需任何参数--就可以看到当下连接MySQL服务器的连接次数,不同时间段该…...
python中.format() 方法
.format() 方法是一种用于格式化字符串的方法,它允许将变量的值插入到字符串中的占位符位置上。该方法可以接受一个或多个参数,并根据给定的格式规则将它们插入到字符串中。 下面是一些使用 .format() 方法的示例: # 基本用法 name "…...
【新手解答8】深入探索 C 语言:递归与循环的应用
C语言的相关问题解答 写在最前面问题:探索递归与循环在C语言中的应用解析现有代码分析整合循环示例代码修改注意事项结论 延伸:递归和循环的退出条件设置解析使用递归使用循环选择适合的方法 写在最前面 一位粉丝私信交流,回想起了当初的我C…...
服务器中深度学习环境的配置
安装流程 11.17 日,周末去高校参加学术会议,起因, 由于使用了某高校内的公共有线网络, 远程连接服务器后,黑客利用 ssh 开放的 22 端口, 篡改了主机的配置, 使得只要一连上网络, 服…...
html实现各种好看的鼠标滑过图片特效模板
文章目录 1.鼠标悬浮效果1.1 渐动效果1.2 渐变效果1.3 边框效果1.4 线行效果1.5 图标效果1.6 块状效果1.7 边线效果1.8 放大效果1.9 渐出效果1.10 痕迹效果1.11 交叉效果1.12 着重效果1.13 详展效果1.14 能动效果1.15 明细效果 2.主要源码2.1 源代码 源码下载 作者:…...
leetcode:LCR 122. 路径加密python3解法)
难度:简单 假定一段路径记作字符串 path,其中以 "." 作为分隔符。现需将路径加密,加密方法为将 path 中的分隔符替换为空格 " ",请返回加密后的字符串。 示例 1: 输入:path "a.a…...
vue中实现纯数字键盘
一、完整 代码展示 <template><div class"login"><div class"login-content"><img class"img" src"../../assets/image/loginPhone.png" /><el-card class"box-card"><div slot"hea…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
