首页 > 其他分享 >SpringBoot对接OpenAI

SpringBoot对接OpenAI

时间:2023-08-06 11:23:17浏览次数:47  
标签:String 对接 private OpenAI chat import com SpringBoot

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技术的不断演进,我们将能够构建更多创新的智能应用,为用户带来更加令人惊喜的体验

标签:String,对接,private,OpenAI,chat,import,com,SpringBoot
From: https://www.cnblogs.com/atwood-pan/p/17609188.html

相关文章

  • SpringBoot - IOC&DI
    目录三层架构三层架构controller:控制层,接收前端请求,对请求进行处理,并响应数据service:业务逻辑层,处理具体的业务逻辑dao:数据访问层(DataAccessObject)(持久层),负责访问操作,包括数据得增删改查员工案例重构:controller:packagecom.chuangzhou.controller;importcom.chu......
  • 记录小知识 springboot,maven创建的多模块 子模块无法使用父类版本
    使用依赖时发现依赖有问题,回来检查发现没有加springboot父工程检查父模块是否加入父标签:只需要在父模块中添加一次就可以了<parent><groupId>org.springframework.boot</groupId><cartifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELE......
  • Springboot中怎么选择性使用thymeleaf进行渲染?
    SpringBoot默认支持多种模板引擎,包括Thymeleaf。如果你想选择性地使用Thymeleaf进行渲染,这基本上取决于你的Controller的实现。以下是一个基本示例:首先,确保你的SpringBoot项目已经添加了Thymeleaf的依赖。在你的pom.xml文件中,你应该看到类似以下的内容<dependency>......
  • OpenAI 已为 GPT-5 申请商标,GPT-4 发布不到半年,GPT-5 就要来了吗?
    据美国专利商标局(USPTO)信息显示,OpenAI已经在7月18日申请注册了“GPT-5”商标。在这份新商标申请中,OpenAI将“GPT-5”描述为一种“用于使用语言模型的可下载计算机软件”。继GPT-4发布之后,它预计将成为OpenAI下一代生成式人工智能版本。申请文件强调其具有“自然语言处理、生成、理......
  • SpringBoot+SpringCloud面试题整理附答案
    什么是SpringBoot?1、用来简化spring初始搭建和开发过程使用特定的方式进行配置(properties或者yml文件)2、创建独立的spring引用程序main方法运行3、嵌入Tomcat无需部署war包,直接打成jar包nohupjava-jar–&启动就好4、简化了maven的配置4、自动配置spring添加对应的starter自......
  • 在SpringBoot框架中集成MyBatis
    使用MyBatis框架操作数据,在SpringBoot框架中集成MyBatis。使用步骤如下:1、准备好数据库?serverTimezone=GMT2、MyBatis起步依赖:完成MyBatis对象自动配置,对象放在容器中创建模块的时候,需要勾选springweb、MyBatisFramework、MySQLDriver这三个pom.xml文件<?xmlversion="1.0"e......
  • SpringBoot学习笔记--过滤器Filter
    一、普通过滤器Filter是Servlet规范中的过滤器,可以处理请求,对请求的参数、属性进行调整。常常在过滤器中处理字符编码。1、创建自定义过滤器类packagecom.cqjtu.vo;importjavax.servlet.*;importjava.io.IOException;//自定义过滤器类publicclassMyFilterimplements......
  • 创建一个基于SpringBoot的web项目
    1、使用国内地址创建SpringBoot项目国内地址:https://start.springboot.io/2、项目结构1:Java目录下放Java相关文件2:static目录下放.css.html.js等文件,包括图片之类的3:templates目录下放模板文件4:放SpringBoot主要配置文件3、创建基于SpringBoot的web案例在上面基础之上,进行下......
  • 随笔(二十六)『SpringBoot + Vue 简单部署到Linux』
    1、安装docker1.1、卸载系统之前的dockersudoyumremovedocker\docker-client\docker-client-latest\docker-common\docker-latest\docker-latest-logrotate\......
  • Springboot 3.x 集成Knife4j [踩坑日记]
    之前项目用的是SpringBoot2.x新项目用了SpringBoot3.x版本,引入Knife4j报错java.lang.TypeNotPresentException:Typejavax.servlet.http.HttpServletRequestnotpresent,以为是servlet的原因,更新了Servlet的版本,依旧报错,几番周折找到找到了在SpringBoot3中集成Knife......