Java 对接 ChatGPT

本文详细介绍了如何在Java项目中通过第三方SDK如`chatgpt-java`版本4.3.0集成ChatGPT,包括Maven和Gradle的依赖管理,YAML配置文件中的服务器设置,以及如何处理代理和API密钥。还涉及了将应用部署到线上环境,如使用Nginx进行域名代理的配置。
摘要由CSDN通过智能技术生成

Java 对接 ChatGPT 样例

本样例采用第三方SDK对接:chatgpt-java,在此感谢作者:PlexPt

当前最新版本 4.3.0 。

maven

<dependency>
    <groupId>com.github.plexpt</groupId>
    <artifactId>chatgpt</artifactId>
    <version>4.3.0</version>
</dependency>

gradle

implementation group: 'com.github.plexpt', name: 'chatgpt', version: '4.3.0'

直接在项目中引入依赖。

话不多说,直接上代码:

  1. yml配置

    server:
      port: 9000
      servlet:
        context-path: /api
    
    # chatgpt 配置
    chatgpt:
      # 代理配置
      proxy:
        # 开启:true false
        enable: true
        # 代理方式:http socks5
        type: socks5
        # 代理主机地址
        host: 127.0.0.1
        # 代理端口
        port: 10808
      # OpenAI key 可配置多个key
      apiKeys:
        - sk-axjXpCP4mvQexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxOrlRi1
        - sk-axjXpCP4mvQexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxOrlRi2
      # OpenAI 请求地址
      apiHost: https://api.openai.com/
    
  2. chatgpt 配置映射类

    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    
    @Data
    @Component
    @ConfigurationProperties(prefix = "chatgpt")
    public class ChatGPTProp {
        // 代理配置
        private ProxyConfig proxy;
        // apiKey
        private List<String> apiKeys;
        // apiHost
        private String apiHost;
    
        @Data
        static class ProxyConfig {
            private boolean enable;
            private String type;
            private String host;
            private int port;
        }
    }
    
  3. ChatGPTConfig 配置类

    import com.plexpt.chatgpt.ChatGPT;
    import com.plexpt.chatgpt.ChatGPTStream;
    import com.plexpt.chatgpt.util.Proxys;
    import jakarta.annotation.PostConstruct;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    
    import java.net.Proxy;
    
    @Slf4j
    @Component
    public class ChatGPTConfig {
    
        @Autowired
        private ChatGPTProp chatGPTProp;
    
        private Proxy proxy;
    
        @PostConstruct
        private void initProxy() {
            ChatGPTProp.ProxyConfig pdata = chatGPTProp.getProxy();
            if (!pdata.isEnable()) {
                proxy = null;
            }
    
            log.info("开启代理,代理类型:{},代理服务器:{},代理端口:{}。", pdata.getType(), pdata.getHost(), pdata.getPort());
            if ("http".equals(pdata.getType())) {
                proxy = Proxys.http(pdata.getHost(), pdata.getPort());
            } else {
                proxy = Proxys.socks5(pdata.getHost(), pdata.getPort());
            }
        }
    
        @Bean
        public ChatGPT chatGPT() {
            // 初始化 ChatGPT 对象
            return ChatGPT.builder()
                    .apiKeyList(chatGPTProp.getApiKeys())
                    .timeout(900)
                    .proxy(proxy)
                    .apiHost(chatGPTProp.getApiHost())
                    .build()
                    .init();
        }
    
        @Bean
        public ChatGPTStream chatGPTStream() {
            // 初始化 ChatGPTStream 对象
            return ChatGPTStream.builder()
                    .timeout(600)
                    .apiKeyList(chatGPTProp.getApiKeys())
                    .proxy(proxy)
                    .apiHost(chatGPTProp.getApiHost())
                    .build()
                    .init();
        }
    
    }
    
  4. Controller 类

    import com.plexpt.chatgpt.ChatGPT;
    import com.plexpt.chatgpt.ChatGPTStream;
    import com.plexpt.chatgpt.entity.chat.Message;
    import com.plexpt.chatgpt.listener.SseStreamListener;
    import com.sm.chatgptdemo.model.Question;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
    
    import java.util.List;
    
    @Slf4j
    @Controller
    @RequestMapping("/chat")
    public class ChatController {
    
        @Autowired
        private ChatGPT chatGPT;
    
        @Autowired
        private ChatGPTStream chatGPTStream;
    
        /**
         * 普通文本会话
         *
         * @param question 问题
         */
        @ResponseBody
        @PostMapping("/text")
        public String text(@RequestBody Question question) {
            String answer = chatGPT.chat(question.getContent());
            return answer;
        }
    
        /**
         * SSE 会话
         *
         * @param question 问题
         */
        @CrossOrigin
        @PostMapping("/sse")
        public SseEmitter sseEmitter(@RequestBody Question question) {
            // 封装消息体
            Message message = Message.of(question.getContent());
    
            // 创建SseEmitter
            SseEmitter sseEmitter = new SseEmitter(-1L);
    
            // 创建监听器
            SseStreamListener listener = new SseStreamListener(sseEmitter);
    
            // 监听回答完成
            listener.setOnComplate(msg -> {
                // 回答完成,可以做一些事情
                log.info("回答完成:{}", msg);
                // 完成后关闭会话
                sseEmitter.complete();
            });
    
            // 发起SSE会话请求
            chatGPTStream.streamChatCompletion(List.of(message), listener);
    
            // 流式响应
            return sseEmitter;
        }
    
    }
    
  5. Question 请求参数类

    @Data
    public class Question {
        private String content;
    }
    
  6. Nginx 代理

    敲黑板划重点:若要部署到线上,使用nginx配置域名代理,在nginx中需加如下配置:

    server {
       # HTTP默认端口
       listen 80; 
    
       # 域名
       server_name chat.example.com; 
    
       location /api/ {
          # ************ 重点配置 ************ #
          # SSE 连接时的超时时间
          proxy_read_timeout 86400s;
          # 取消缓冲
          proxy_buffering off;
          # 关闭代理缓存
          proxy_cache off;
          # ************ 重点配置 ************ #
          
          proxy_set_header Host $http_host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header REMOTE-HOST $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_pass http://localhost:9000/api/;
       }
    }
    

获取 ChatGPT API key

  1. 前提你需要一个可用的ChatGPT账号(账号需自行去购买)

  2. 登录 ChatGPT官网
    在这里插入图片描述
    在这里插入图片描述

  3. 创建 key
    在这里插入图片描述

  • 25
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java对接ChatGPT,您需要使用OpenAI API。您可以使用Java的HTTP客户端库(如Apache HttpClient或OkHttp)来向OpenAI API发送HTTP请求,并解析返回的JSON响应。以下是一个简单的Java代码示例,演示如何使用OpenAI API与ChatGPT进行交互: ```java import java.io.IOException; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import org.json.JSONObject; public class ChatGPTClient { // OpenAI API endpoint private static final String API_ENDPOINT = "https://api.openai.com/v1/engines/davinci-codex/completions"; // OpenAI API key private static final String API_KEY = "YOUR_API_KEY_HERE"; // Request content type private static final MediaType CONTENT_TYPE = MediaType.parse("application/json; charset=utf-8"); private final OkHttpClient httpClient; public ChatGPTClient() { this.httpClient = new OkHttpClient(); } public String askChatGPT(String prompt) throws IOException { // Build the request body JSONObject requestBody = new JSONObject(); requestBody.put("prompt", prompt); requestBody.put("max_tokens", 100); requestBody.put("temperature", 0.5); // Build the HTTP request Request request = new Request.Builder() .url(API_ENDPOINT) .header("Authorization", "Bearer " + API_KEY) .post(RequestBody.create(CONTENT_TYPE, requestBody.toString())) .build(); // Send the HTTP request and parse the response try (Response response = httpClient.newCall(request).execute()) { JSONObject responseBody = new JSONObject(response.body().string()); return responseBody.getJSONArray("choices") .getJSONObject(0) .getString("text"); } } } ``` 在上面的代码中,您需要将`YOUR_API_KEY_HERE`替换为您在OpenAI上获取的API密钥。然后,您可以使用`askChatGPT`方法向ChatGPT发送问题,并获得响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值