java(spring boot)实现向deepseek/GPT等模型的api发送请求/多轮对话(附源码)

我们再启动应用并获取api密钥后就可以对它发送请求了,但是官方文档对于如何进行多轮对话以及怎么自定义参数并没有说的很清楚,给的模板也没有java的,因此我们需要自己实现。

java 复制代码
import org.json.JSONArray;
import org.json.JSONObject;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class DeepSeekUtil {
    private static final String API_URL = "https://ark.cn-beijing.volces.com/api/v3/chat/completions"; //  API 地址
    private static final String API_KEY = ""; // 请替换为你的 API 密钥

    // 与模型进行交互
    public static String chat(String userMessage, JSONArray messages) {
        // 如果没有传入消息历史,初始化一个空的 JSONArray
        if (messages == null) {
            messages = new JSONArray();
        }

        // 添加用户的消息到对话历史
        messages.put(new JSONObject().put("role", "user").put("content", userMessage));

        JSONObject requestBody = new JSONObject();
        requestBody.put("model", "deepseek-v3-241226"); // 使用正确的模型名称
        requestBody.put("messages", messages); // 将历史对话传递给 API
        requestBody.put("temperature", 0.7); // 控制生成文本的创意性
        //requestBody.put("max_tokens", 1024); // 最大生成 token 数量,避免生成过长的回答

        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(API_URL))
                .header("Content-Type", "application/json")
                .header("Authorization", "Bearer " + API_KEY)
                .POST(HttpRequest.BodyPublishers.ofString(requestBody.toString()))
                .build();

        HttpClient client = HttpClient.newHttpClient();
        try {
            // 发送请求并获取响应
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

            // 检查响应状态
            if (response.statusCode() != 200) {
                System.out.println("API Response Error: " + response.body());
                return "Error: API responded with status code " + response.statusCode();
            }

            // 从响应中获取 API 返回的内容
            String responseBody = response.body();
            System.out.println("API Response: " + responseBody);

            // 解析 API 响应
            JSONObject jsonResponse = new JSONObject(responseBody);
            JSONArray choices = jsonResponse.getJSONArray("choices");

            // 获取第一个 choice 中的 message 内容
            JSONObject firstChoice = choices.getJSONObject(0);
            JSONObject message = firstChoice.getJSONObject("message");
            String apiReply = message.getString("content");

            // 添加模型回复到对话历史
            messages.put(new JSONObject().put("role", "assistant").put("content", apiReply));

            // 返回 API 的回复
            return apiReply;

        } catch (Exception e) {
            // 出现错误时返回错误消息
            e.printStackTrace(); // 打印详细的错误信息
            return "Error: " + e.getMessage();
        }
    }
}

我们再编写测试类

java 复制代码
 @Test
    void testChat(){
        JSONArray array=new JSONArray();

      String response=DeepSeekUtil.chat("你好",array);
        System.out.println(response);
        String response1=DeepSeekUtil.chat("帮我设计一个演示自由落体的网页",array);
        System.out.println(response1);
    }
相关推荐
han_hanker8 分钟前
springboot 一个请求的顺序解释
java·spring boot·后端
MaCa .BaKa9 分钟前
44-校园二手交易系统(小程序)
java·spring boot·mysql·小程序·maven·intellij-idea·mybatis
希望永不加班27 分钟前
SpringBoot 静态资源访问(图片/JS/CSS)配置详解
java·javascript·css·spring boot·后端
oh LAN43 分钟前
RuoYi-Vue-master:Spring Boot 4.x (JDK 17+) (环境搭建)
java·vue.js·spring boot
武藤一雄1 小时前
C# 异常(Exception)处理避坑指南
windows·microsoft·c#·.net·.netcore·鲁棒性
ch.ju1 小时前
Java程序设计(第3版)第二章——java的数据类型:小数
java
Advancer-1 小时前
RedisTemplate 两种序列化实践方案
java·开发语言·redis
java1234_小锋1 小时前
Java高频面试题:MyBatis如何实现动态数据源切换?
java·开发语言·mybatis
墨神谕1 小时前
Java中,为什么要将.java文件编译成,class文件,而不是直接将.java编译成机器码
java·开发语言
Nyarlathotep01132 小时前
并行设计模式(3):Future模式
java·后端