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…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...