SpringBoot对接OpenAI
SpringBoot对接OpenAI
随着人工智能技术的飞速发展,越来越多的开发者希望将智能功能集成到自己的应用中,以提升用户体验和应用的功能。OpenAI作为一家领先的人工智能公司,提供了许多先进的自然语言处理和语言生成模型,其中包括深受欢迎的GPT-3.5模型。本文将介绍如何利用Spring Boot框架与OpenAI进行对接,为你的应用增加强大的智能能力。
1、OpenAI概述:
OpenAI是一家人工智能研究实验室,致力于构建人类水平通用人工智能。他们的GPT-3.5模型是目前最先进的自然语言处理模型之一,能够理解和生成自然语言文本。通过与OpenAI对接,你可以将这一强大的模型嵌入到你的应用中,实现自动化文本生成、智能问答、机器翻译等功能。
2、Spring Boot 简介:
Spring Boot是一个用于构建独立的、基于生产级别的Java应用程序的框架。它简化了Spring应用的开发过程,提供了一系列的工具和插件,帮助开发者快速搭建稳健的应用。通过Spring Boot,你可以轻松创建RESTful API,处理HTTP请求,以及管理应用的依赖等。
3、搭建Spring Boot项目:
- 环境准备:确保你已经安装了Java开发环境和Maven构建工具。
- 创建Spring Boot项目:使用Spring Initializr创建一个新的Spring Boot项目,选择所需的依赖,如Web、OpenAI API等。
- 配置OpenAI API密钥:在application.properties或application.yml文件中,设置OpenAI API的访问密钥,确保可以在项目中调用OpenAI的服务。
3.1、环境准备
这里就不多说了,直接使用maven搭建一个SpringBoot项目
3.2、引入依赖
本次案例比较简单,就是一个干净的SpringBoot项目,再引入Hutool工具包即可,下面是全部的pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.pp.chat</groupId><artifactId>chatgpt-api-demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><!-- Fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency><!-- HuTool工具包 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency><!-- knife4j生成接口文档 --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi2-spring-boot-starter</artifactId><version>4.2.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- lombok简化实体构造方法 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
</project>
3.3、配置文件
knife4j:enable: trueChatGPT:connect-timeout: 60000 # HTTP请求连接超时时间read-timeout: 60000 # HTTP请求读取超时时间variables: # 自定义变量:apiKey: xxx # 你的 OpenAI 的 API KEYmodel: gpt-3.5-turbo # ChartGPT 的模型maxTokens: 500 # 最大 Token 数temperature: 1 # 该值越大每次返回的结果越随机,即相似度越小
4、核心代码
4.1、项目结构

4.2、实体类
1、GPTChoice
package com.pp.chat.entity;import lombok.Data;
/*** TODO 文本模型返回内容** @author ss_419* @version 1.0* @date 2023/8/5 15:47*/
@Data
public class GPTChoice {private String text;private Integer index;private Message message;}
2、GPTData
package com.pp.chat.entity;import lombok.Data;/*** TODO 图形模型返回内容** @author ss_419* @version 1.0* @date 2023/8/5 11:37*/
@Data
public class GPTData {private String url;
}
3、GPTRequest
package com.pp.chat.entity;import lombok.Data;import java.util.List;/*** TODO 问题请求体** @author ss_419* @version 1.0* @date 2023/8/5 15:47*/
@Data
public class GPTRequest {/*** 问题*/private String askStr;/*** 文本回答*/private String replyStr;/*** 图形回答*/private List<GPTData> replyImg;
}
4、GPTResponse
package com.pp.chat.entity;import lombok.Data;import java.util.List;
/*** TODO 文本模型返回响应体** @author ss_419* @version 1.0* @date 2023/8/5 15:47*/
@Data
public class GPTResponse {private String id;private String object;private String created;private String model;private List<GPTChoice> choices;}
5、GPTImageResponse
package com.pp.chat.entity;import lombok.Data;import java.util.List;/*** TODO 图形模型返回响应体** @author ss_419* @version 1.0* @date 2023/8/5 15:47*/
@Data
public class GPTImageResponse {private String created;private List<GPTData> data;
}
6、Message
package com.pp.chat.entity;import lombok.Data;/*** TODO 文本模型消息体** @author ss_419* @version 1.0* @date 2023/8/5 10:30*/
@Data
public class Message {private String role;private String content;
}
4.3、业务类
ChartGPTService
package com.pp.chat.service;import com.pp.chat.entity.GPTData;import java.util.List;public interface ChartGPTService {/*** 调用文本模型ai* @param prompt* @return*/String send(String prompt);/*** 调用图片模型ai* @param prompt* @return*/List<GPTData> sendImg(String prompt);
}
ChartGPTServiceImpl
package com.pp.chat.service.impl;import cn.hutool.http.Header;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.pp.chat.entity.*;
import com.pp.chat.service.ChartGPTService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Service("chartGPTService")
public class ChartGPTServiceImpl implements ChartGPTService {@Value("${ChatGPT.variables.apiKey}")private String apiKey;@Value("${ChatGPT.variables.maxTokens}")private String maxTokens;@Value("${ChatGPT.variables.model}")private String model;@Value("${ChatGPT.variables.temperature}")private String temperature;@Overridepublic String send(String prompt) {JSONObject bodyJson = new JSONObject();Message message = new Message();message.setContent(prompt);message.setRole("system");ArrayList<Message> messages = new ArrayList<>();messages.add(message);bodyJson.put("messages", messages);bodyJson.put("model", model);bodyJson.put("max_tokens", Integer.parseInt(maxTokens));bodyJson.put("temperature", Double.parseDouble(temperature));Map<String, Object> headMap = new HashMap<>();
// headMap.put("Authorization", "Bearer " + apiKey);HttpResponse httpResponse =// 官网请求,没梯子不能访问// HttpUtil.createPost("https://api.openai.com/v1/chat/completions")// 使用代理地址 https://api.openai-proxy.com/HttpUtil.createPost("https://api.openai-proxy.com/v1/chat/completions").header(Header.AUTHORIZATION, "Bearer " + apiKey).header(Header.CONTENT_TYPE, "application/json").body(JSONUtil.toJsonStr(bodyJson)).execute();String resStr = httpResponse.body();GPTResponse gptResponse = JSONUtil.toBean(resStr, GPTResponse.class);return gptResponse.getChoices().get(0).getMessage().getContent().replaceAll("\\n", "");}@Overridepublic List<GPTData> sendImg(String prompt) {JSONObject bodyJson = new JSONObject();bodyJson.put("prompt", prompt);bodyJson.put("n", 2);bodyJson.put("size", "1024x1024");Map<String, Object> headMap = new HashMap<>();headMap.put("Authorization", "Bearer " + apiKey);HttpResponse httpResponse =// 官网请求,没梯子不能访问// HttpUtil.createPost("https://api.openai.com/v1/chat/completions")// 使用代理地址 https://api.openai-proxy.com/HttpUtil.createPost("https://api.openai-proxy.com/v1/images/generations").header(Header.AUTHORIZATION, "Bearer " + apiKey).header(Header.CONTENT_TYPE, "application/json").body(JSONUtil.toJsonStr(bodyJson)).execute();String resStr = httpResponse.body();GPTImageResponse gptResponse = JSONUtil.toBean(resStr, GPTImageResponse.class);List<GPTData> data = gptResponse.getData();return data;}
}
4.4、Boot启动类
Main
package com.pp.chat;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author ss_419*/
@SpringBootApplication
public class Main {public static void main(String[] args) {SpringApplication.run(Main.class,args);System.out.println("Hello world!");}
}
5、测试
启动项目,使用knife4j进行接口测试
接口文档默认地址:http://localhost:8080/doc.html

5.1、测试文本模型

5.2、测试图片模型

gpt生成的图片在链接中

6、总结
通过Spring Boot与OpenAI的对接,我们可以轻松将强大的自然语言处理功能集成到我们的应用中,为用户提供更智能、更便捷的服务。同时,结合Spring Boot强大的开发能力,我们可以快速搭建出高效稳定的智能应用,满足不断变化的市场需求。未来,随着OpenAI技术的不断演进,我们将能够构建更多创新的智能应用,为用户带来更加令人惊喜的体验
相关文章:
SpringBoot对接OpenAI
SpringBoot对接OpenAI 随着人工智能技术的飞速发展,越来越多的开发者希望将智能功能集成到自己的应用中,以提升用户体验和应用的功能。OpenAI作为一家领先的人工智能公司,提供了许多先进的自然语言处理和语言生成模型,其中包括深…...
(C++)继承
目录 1.继承的概念及定义 1.1继承的概念 1.2继承定义 1.2.1定义格式 1.2.2继承方式和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6.继承与静态成员 7.复杂的菱形继承及菱形虚拟…...
图像处理技巧形态学滤波之膨胀操作
1. 引言 欢迎回来,我的图像处理爱好者们!今天,让我们继续研究图像处理领域中的形态学计算。在本篇中,我们将重点介绍腐蚀操作的反向效果膨胀操作。 闲话少说,我们直接开始吧! 2. 膨胀操作原理 膨胀操作…...
机器学习基础之《特征工程(4)—特征降维》
一、什么是特征降维 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程 1、降维 降低维度 ndarry 维数:嵌套的层数 0维:标量,具体的数0 1 2 3... …...
学生管理系统(Python版本)
class Student:def __init__(self, id, name, age):self.id idself.name nameself.age ageclass StudentManagementSystem:def __init__(self):self.students []def add_student(self, student):self.students.append(student)print("学生信息添加成功!&qu…...
Linux下快速创建大文件的4种方法总结
1、使用 dd 命令创建大文件 dd 命令用于复制和转换文件,它最常见的用途是创建实时 Linux USB。dd 命令是实际写入硬盘,文件产生的速度取决于硬盘的读写速度,根据文件的大小,该命令将需要一些时间才能完成。 假设我们要创建一个名…...
用 Rufus 制作 Ubuntu 系统启动盘时,选择分区类型为MBR还是GPT?
当使用 Rufus 制作 Ubuntu 系统启动盘时,您可以根据您的需求选择分区类型,MBR(Master Boot Record)还是 GPT(GUID Partition Table)。 MBR 是传统的分区表格式,适用于大多数旧版本的操作系统和旧…...
Nodejs+vue+elementui汽车租赁管理系统_1ma2x
语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端nodejsvueelementui, 课题主要分为三大模块:即管理员模块、用户模块和普通管理员模块,主要功能包括&#…...
Prometheus入门
Prometheus(普罗米修斯) 是一种 新型监控告警工具,Kubernetes 的流行带动了 Prometheus 的应用。 全文参考自 prometheus 学习笔记(1)-mac 单机版环境搭建[1] Mac 上安装 Prometheus brew install prometheus 安装路径在 /usr/local/Cellar/prometheus/2.20.1, 配置文件在 /usr…...
RISC-V云测平台:Compiling The Fedora Linux Kernel Natively on RISC-V
注释:编译Fedora,HS-2 64核RISC-V服务器比Ryzen5700x快两倍! --- 以下是blog 正文 --- # Compiling The Fedora Linux Kernel Natively on RISC-V ## Fedora RISC-V Support There is ongoing work to Fedora to support RISC-V hardwar…...
Vim学习(三)—— Git Repo Gerrit
Git、Gerrit、Repo三者的概念及使用 三者各自作用: git:版本管理库,在git库中没有中心服务器的概念,真正的分布式。 repo:repo就是多个git库的管理工具。如果是多个git库同时管理,可以使用repo。当然使用…...
论坛项目之用户部分
注册接口 实现思路 1.特殊字段检查(比如性别没有给出需要给出默认值) 2.对比检查两次输入的密码是否一致,不一致报错 3.利用UUID生成随机‘盐’值,并使用密码进行MD5加密后与‘盐’进行拼接,生成加密后的密码 4.创建U…...
golang内存对齐
为什么要内存对齐? CPU访问内存时,以CPU的位数为单位进行访问。 如果访问未对齐的内存,处理器需要做两次内存访问,对齐的内存的访问可能仅需要一次,利用内存对齐后提升读取速度。 golang结构体内存对齐规则 在代码编译…...
【CheatSheet】Python、R、Julia数据科学编程极简入门
《Python、R、Julia数据科学编程极简入门》PDF版,是我和小伙伴一起整理的备忘清单,帮助大家10分钟快速入门数据科学编程。 另外,最近 TIOBE 公布了 2023 年 8 月的编程语言排行榜。 Julia 在本月榜单中实现历史性突破,成功跻身 …...
【golang】怎样判断一个变量的类型?
怎样判断一个变量的类型? package mainimport "fmt"var container []string{"zero", "one", "two"} func main() {container : map[int]string{0: "zero", 1: "one", 2: "two"}fmt.Printf…...
怎么学习AJAX相关技术? - 易智编译EaseEditing
学习AJAX(Asynchronous JavaScript and XML)相关技术可以让你实现网页的异步数据交互,提升用户体验。以下是一些学习AJAX技术的步骤和资源: HTML、CSS和JavaScript基础: 首先,确保你已经掌握了基本的HTML…...
JDK、JRE、JVM:揭秘Java的关键三者关系
文章目录 JDK:Java开发工具包JRE:Java运行环境JVM:Java虚拟机关系概述 案例示例:Hello World结语 在Java世界中,你可能经常听到JDK、JRE和JVM这几个概念,它们分别代表了Java开发工具包、Java运行环境和Java…...
【reactNative混合安卓开发~使用问题持续更】
reactNative混合安卓开发 reactNative开发移动端reactNative界面开发前端init.bat文件部分组件第三方组件解析1、定义theme主题shopify/restyle;菜单导航react-navigation/drawer、react-navigation/native; RN问题记录1、使用theme.js写的公共组件报错&…...
OCR的发明人是谁?
OCR的发明背景可以追溯到早期计算机科学和图像处理的研究。随着计算机技术的不断发展,人们开始探索如何将印刷体文字转换为机器可读的文本。 OCR(Optical Character Recognition,光学字符识别)的发明涉及多个人的贡献,…...
笔记本电脑连上WiFi之后的IP为什么会变?如何让它不变固定住?
笔记本连上WiFi后获取IP地址的过程,通常是通过DHCP (动态主机配置协议) 来完成的。默认情况下,DHCP会根据连接设备和网络状态动态地分配IP地址,因此你会看到IP地址可能经常改变。 如果你希望电脑的IP地址固定,可以尝试设置静态IP…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
Axure Rp 11 安装、汉化、授权
Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...
NoSQL——Redis配置与优化
目录 关系型&非关系型数据库 一、核心原理对比 二、核心特性对比 三、关键区别剖析 四、典型产品示例 总结 Redis Redis核心原理 核心特性 技术意义 配置文件解析 1. 基础配置 2. 持久化配置 3. 内存管理 4. 高可用配置 5. 性能调优 6.…...
Redis:常用数据结构 单线程模型
🌈 个人主页:Zfox_ 🔥 系列专栏:Redis 🔥 常用数据结构 🐳 Redis 当中常用的数据结构如下所示: Redis 在底层实现上述数据结构的过程中,会在源码的角度上对于上述的内容进行特定的…...
React 进阶特性
1. ref ref 是 React 提供的一种机制,用于访问和操作 DOM 元素或 React 组件的实例。它可以用于获取某个 DOM 元素的引用,从而执行一些需要直接操作 DOM 的任务,例如手动设置焦点、选择文本或触发动画。 1.1. 使用 ref 的步骤 1. 创建一个 ref:使用 React.createRef 或 …...
