SpringBoot对接OpenAI

news2024/11/24 18:49:43

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项目:

  1. 环境准备:确保你已经安装了Java开发环境和Maven构建工具。
  2. 创建Spring Boot项目:使用Spring Initializr创建一个新的Spring Boot项目,选择所需的依赖,如Web、OpenAI API等。
  3. 配置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: true

ChatGPT:
  connect-timeout: 60000      # HTTP请求连接超时时间
  read-timeout: 60000         # HTTP请求读取超时时间
  variables:                  # 自定义变量:
    apiKey: xxx     # 你的 OpenAI 的 API KEY
    model: gpt-3.5-turbo   # ChartGPT 的模型
    maxTokens: 500             # 最大 Token 数
    temperature: 1         # 该值越大每次返回的结果越随机,即相似度越小

4、核心代码

4.1、项目结构

pPAtXUU.md.png

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;

    @Override
    public 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", "");

    }

    @Override
    public 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

pPANm2d.png

5.1、测试文本模型

pPANQqP.png

5.2、测试图片模型

pPANJPg.png

gpt生成的图片在链接中

pPANdrq.png

6、总结

通过Spring Boot与OpenAI的对接,我们可以轻松将强大的自然语言处理功能集成到我们的应用中,为用户提供更智能、更便捷的服务。同时,结合Spring Boot强大的开发能力,我们可以快速搭建出高效稳定的智能应用,满足不断变化的市场需求。未来,随着OpenAI技术的不断演进,我们将能够构建更多创新的智能应用,为用户带来更加令人惊喜的体验

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eclipse Java Code_Style Code_Templates

Preferences - Java - Code Style - Code Templates Eclipse [Java_Code_Style_Code_Templates_ZengWenFeng] 2023.08.07.xml 创建一个新的工程&#xff0c;不然有时候不生效&#xff0c;旧项目可能要重新导入eclipse 创建一个测试类试一试 所有的设置都生效了

【雕爷学编程】Arduino动手做(195)---HT16k33 矩阵 8*8点阵屏模块5

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

Nginx(2)

目录 1.安装Nginx1.yum安装2.编译安装3.Nginx命令 2.配置文件详解 1.安装Nginx 1.yum安装 [rootdocker ~]# yum -y install nginx通过 rpm -ql nginx 查看安装信息 2.编译安装 2.1安装所需要的依赖 yum install -y gcc gcc-c make libtool wget pcre pcre-devel zlib zlib-…

4. C++构造函数和析构函数

一、对象的初始化和清理 C中的面向对象来源于生活&#xff0c;每个对象也都会有初始设置以及对象销毁前的清理数据的设置&#xff0c;对象的初始化和清理也是两个非常重要的安全问题 一个对象或者变量没有初始状态&#xff0c;对其使用后果是未知的使用完一个对象或变量&#x…

CentOS7安装Maven详细教程

&#x1f60a; 作者&#xff1a; Eric &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_47316183?typeblog &#x1f389; 主题&#xff1a;CentOS7安装Maven详细教程 ⏱️ 创作时间&#xff1a; 2023年08月06日 第一步&#xff1a;上传或下载安装包&#x…

【Element】el-cascader 级联选择器

ElementUI label 为空的不展示 将children设为undefined dg(list) {list.forEach(item > {item.label item.nameitem.value item.iditem.children item.childrenList.length ! 0 ? item.childrenList : undefinedif (item.children) {this.dg(item.children)}}) },第…

拦截器对接口细粒度权限校验

文章目录 一、逻辑分析二、校验规则1.规则类型2.规则划分3.规则配置信息4.规则案例说明5.规则加载 三、拦截器定义1.自定义拦截器2.注册拦截器 四、获取请求参数1.获取get提交方式参数2.获取post提交方式参数&#xff08;1&#xff09;定义RequestWrapper类&#xff08;2&#…

pinctrl_desc结构体注册

pinctrl_desc结构体注册 文章目录 pinctrl_desc结构体注册pinctrl_registerpinctrl_register_pins注册所有的引脚 pinctrl_register 构建好struct pinctrl_desc结构以后&#xff0c;会调用pinctrl_register函数注册一个pinctrl控制器&#xff0c;得到一个pinctrl_dev struct …

【大数据】Flink 详解(二):核心篇 Ⅰ

Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅰ 14、Flink 的四大基石是什么&#xff1f; ​ Flink 的四大基石分别是&#xff1a; Checkpoint&#xff08;检查点&#xff09;State&#xff08;状态&#xff09;Time&#xff08;时间&#xff09;Window&#xff…

【机器学习2】什么是Jupyter notebook 新手使用Jupter notebook

什么是Jupyter notebook? Jupyter Notebook&#xff08;此前被称为 IPython notebook&#xff09;是一个交互式笔记本&#xff0c;支持运行 40 多种编程语言。 Jupyter Notebook 的本质是一个 Web 应用程序&#xff0c;便于创建和共享程序文档&#xff0c;支持实时代码&#x…

Redis 7.X Linux 环境安装

Redis 简介 作为一名开发人员&#xff0c;想必大家对Redis一定是耳熟能详&#xff0c;因此在此只做简单介绍。 Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value内存数据库&#xff0c;它提…

命令模式(C++)

定义 将一个请求(行为)封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 应用场景 在软件构建过程中&#xff0c;“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比…

iPhone苹果手机地震预警功能怎么开启?

iPhone苹果手机地震预警功能怎么开启&#xff1f; 1、打开iPhone苹果手机设置&#xff1b; 2、在iPhone苹果手机设置内找到辅助功能&#xff1b; 3、在辅助功能内找到触控&#xff1b; 4、在iPhone苹果手机辅助功能触控内找到振动&#xff0c;如果是关闭状态请启&#xff1b; …

jdk1.7与jdk1.8中String.split()方法问题

split切割字符串的坑&#xff0c;会有索引越界的风险。 在jdk1.8中 public static void main(String[] args) { String card "abcdefgh"; System.out.println(card.split("").length); } 结果&#xff1a;8 在jdk1.7中&#xff0c;同样的代码 …

kubectl 详解(陈述式资源管理与声明式资源管理)

目录 一、kubectl简介 二、kubectl基础命令 三、基本信息查看 1.查看标签信息 ​2. 查看 master 节点状态 3. 查看命名空间 4.创建、删除命名空间app 5.在命名空间kube-public 创建副本控制器&#xff08;deployment&#xff09;来启动Pod&#xff08;nginx-www&#xf…

网关 GateWay 的使用详解、路由、过滤器、跨域配置

一、网关的基本概念 SpringCloudGateway网关是所有微服务的统一入口。 1.1 它的主要作用是&#xff1a; 反向代理&#xff08;请求的转发&#xff09; 路由和负载均衡 身份认证和权限控制 对请求限流 1.2 相比于Zuul的优势&#xff1a; SpringCloudGateway基于Spring5中…

libcurl网络库的函数接口使用

文章目录 1、libcurl简介2、libcurl的使用3、函数简介4、 curl_easy_setopt函数部分选项介绍5、curl_easy_perform 函数说明&#xff08;error 状态码&#xff09;6、简单实例,包含库文件&#xff0c;头文件即可 1、libcurl简介 libcurl是一个跨平台的网络协议库&#xff0c;支…

【福建事业单位-推理判断】02图形推理(数量-空间重构)

【福建事业单位-推理判断】02图形推理&#xff08;数量-空间重构&#xff09; 一、数量规律1.1点&#xff08;交点、切点&#xff09;点的细化考法总结 1.2线条&#xff08;线条的数量&#xff09;线的细化考点一笔画&#xff08;重点&#xff09;一笔画的判定 总结 1.3 面面的…

PWNlab靶机渗透

安装靶机 下载地址&#xff1a;https://www/vulnhub.com/entry/pwnlab-init,158/ 信息收集&#xff1a; 收集靶机ip地址&#xff0c;由于搭建在本地使用kali自带命令 arp-scan -l nmap 扫描端口&#xff0c;服务 nmap -sV -p 1-65535 -A 靶机ip地址 漏洞探测 访问80端口地…

LeetCode--HOT100题(21)

目录 题目描述&#xff1a;240. 搜索二维矩阵 II&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;240. 搜索二维矩阵 II&#xff08;中等&#xff09; 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&am…