Java调用DeepSeek实现多轮对话功能

 更新时间:2025年03月09日 10:42:58   作者:渡劫的咸鱼  
对于广大Java开发者而言,DeepSeek这一先进的人工智能技术,犹如一把钥匙,为我们打开了提升开发效率与创新能力的新大门,本文给大家介绍了Java调用DeepSeek实现多轮对话功能,需要的朋友可以参考下

背景

近期deepSeek比较火,很多小伙伴尝试用各种语言调用deepSeek,最近刚好也有些兴趣,写了一版关于适用java调用deepSeek的代码供小白使用。

效果

1.创建API keys

登陆deepSeek开放平台DeepSeek开放平台创建api key

2.参考官网调用文档

地址对话补全 | DeepSeek API Docs

3.多轮对话

代码

最后附上代码,感兴趣的小伙伴可以拿去玩玩

package com.ssc.gdh.phbc.data.serve.strategy.layer;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
 
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
 
public class DeepSeek {
 
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        JSONArray chat = null;
        while (true){
            System.out.print("与deepSeek对话,请输入内容(输入 'exit' 退出):");
            String msg = scanner.nextLine(); // 读取一行输入
            OkHttpClient client = new OkHttpClient().newBuilder()
                    .connectTimeout(10, TimeUnit.SECONDS) // 连接超时时间
                    .readTimeout(300, TimeUnit.SECONDS)    // 读取超时时间
                    .writeTimeout(300, TimeUnit.SECONDS)   // 写入超时时间
                    .build();
            // 检查是否退出
            if ("exit".equalsIgnoreCase(msg)) {
                System.out.println("程序已退出。");
                break; // 退出循环
            }
            chat = sendMessage(client, msg, chat);
        }
    }
 
    private static JSONArray sendMessage(OkHttpClient client,String question,JSONArray chat) {
        MediaType mediaType = MediaType.parse("application/json");
        JSONObject param = new JSONObject();
        param.put("model","deepseek-chat");
        param.put("frequency_penalty",0);
        param.put("presence_penalty",0);
        JSONArray messages = chat;
 
        if (messages == null){
            messages = new JSONArray();
            JSONObject o1 = new JSONObject();
            o1.put("role","user");
            o1.put("content",question);
            messages.add(o1);
        }else {
            JSONObject o1 = new JSONObject();
            o1.put("role","user");
            o1.put("content",question);
            messages.add(o1);
        }
        param.put("messages",messages);
 
 
//        RequestBody body = RequestBody.create(mediaType, String.format("{\n  \"messages\": [\n    {\n      \"content\": \"%s\"," +
//                "\n      \"role\": \"user\"\n    },\n    {\n      \"content\": \"%s\",\n      \"role\": \"user\"\n    }\n  ],\n  \"model\": \"deepseek-chat\",\n  \"frequency_penalty\": 0,\n  \"max_tokens\": 2048," +
//                "\n  \"presence_penalty\": 0,\n  \"response_format\": {\n    \"type\": \"text\"\n  },\n  \"stop\": null,\n  \"stream\": false," +
//                "\n  \"stream_options\": null,\n  \"temperature\": 1,\n  \"top_p\": 1,\n  \"tools\": null,\n  \"tool_choice\": \"none\",\n  \"logprobs\": false,\n  \"top_logprobs\": null\n}",question,question1));
 
        RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(param));
        Request request = new Request.Builder()
                .url("https://api.deepseek.com/chat/completions")
                .method("POST", body)
                .addHeader("Content-Type", "application/json")
                .addHeader("Accept", "application/json")
                .addHeader("Authorization", "Bearer 你的api_keys")//你申请的api_keys
                .build();
        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                ResponseBody responseBody = response.body();
                if (responseBody != null) {
                    // 将响应体转换为字符串
                    String responseString = responseBody.string();
                    JSONObject jsonObject = JSONObject.parseObject(responseString);
                    JSONArray choices = JSONArray.parseArray(jsonObject.getString("choices"));
                    String content = JSONObject.parseObject(JSONObject.parseObject(choices.get(0).toString()).get("message").toString()).get("content").toString();
                    if (StringUtils.isNotBlank(content)){
                        JSONObject o1 = new JSONObject();
                        o1.put("role","assistant");
                        o1.put("content",content);
                        messages.add(o1);
                    }
                    System.out.println(content);
                    return messages;
                }
            } else {
                System.out.println("Request failed with code: " + response.code());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
 

到此这篇关于Java调用DeepSeek实现多轮对话功能的文章就介绍到这了,更多相关Java DeepSeek多轮对话内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java默认传入时间段时间的实例

    Java默认传入时间段时间的实例

    下面小编就为大家带来一篇Java默认传入时间段时间的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • spring security环境搭建

    spring security环境搭建

    本文通过代码给大家介绍了spring security环境搭建的详细教程,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09
  • SpringBoot中项目如何读取外置logback配置文件

    SpringBoot中项目如何读取外置logback配置文件

    这篇文章主要介绍了SpringBoot中项目如何读取外置logback配置文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java中HashMap集合的6种遍历方式详解

    Java中HashMap集合的6种遍历方式详解

    这篇文章主要介绍了Java中HashMap集合的6种遍历方式详解,HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对,HashMap 的实现不是同步的,这意味着它不是线程安全的,我们来看一下其遍历方式,需要的朋友可以参考下
    2023-12-12
  • java list,set,map,数组间的相互转换详解

    java list,set,map,数组间的相互转换详解

    这篇文章主要介绍了java list,set,map,数组间的相互转换详解的相关资料,这里附有实例代码,具有参考价值,需要的朋友可以参考下
    2017-01-01
  • Spring Boot中自动化配置的利弊以及解决方法

    Spring Boot中自动化配置的利弊以及解决方法

    这篇文章主要给大家介绍了关于Spring Boot中自动化配置的利弊以及解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-08-08
  • Java中Map.getOrDefault()方法举例详解

    Java中Map.getOrDefault()方法举例详解

    这篇文章主要介绍了Java 8中Map接口的getOrDefault()方法,该方法在获取键值对时,如果键不存在则返回默认值,文中通过一个统计网站用户点击次数的应用场景,详细展示了getOrDefault()的用法,需要的朋友可以参考下
    2025-02-02
  • mybatis @InsertProvider报错问题及解决

    mybatis @InsertProvider报错问题及解决

    这篇文章主要介绍了mybatis @InsertProvider报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 基于@LastModifiedDate不起作用的解决方案

    基于@LastModifiedDate不起作用的解决方案

    这篇文章主要介绍了基于@LastModifiedDate不起作用的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • spring boot集成jasypt 并实现自定义加解密的详细步骤

    spring boot集成jasypt 并实现自定义加解密的详细步骤

    由于项目中的配置文件 配置的地方过多,现将配置文件统一放到nacos上集中管理 且密码使用加密的方式放在配置文件中,配置文件的加密使用加密库jasypt,本文给大家介绍spring boot集成jasypt并实现自定义加解密,感兴趣的朋友一起看看吧
    2023-08-08

最新评论