接入 DeepSeek | Java 调用大模型实战保姆级教程:新手快速上手

接入 DeepSeek | Java 调用大模型实战保姆级教程:新手快速上手

Luca Ju
2025-08-11 / 0 评论 / 11 阅读 / 正在检测是否收录...

接入 DeepSeek | Java 调用大模型实战保姆级教程:新手快速上手

最近各大平台接入 DeepSeek 大模型的案例越来越多,作为程序员,你是不是也想亲手实现一次?别担心,这篇教程会用3 种实战方式,带你从零开始用 Java 接入 DeepSeek 大模型,从 SDK 调用到原生 HTTP 请求全覆盖,新手也能轻松上手~

前置知识:为什么需要响应式编程?

大模型对话为了提升用户体验,通常会采用流式输出(像 ChatGPT 那样逐字显示回复)。而 Java 中实现流式输出需要用到响应式编程(Reactive Programming),核心是通过Flux(Reactor 框架)处理异步数据流。
如果你对响应式编程不太熟悉,可以先简单理解:Flux能帮你 “实时接收” 大模型的每一段输出,而不是等全部结果返回后才处理。
👉 快速入门参考:Spring 响应式编程官方文档

👉 也可参考我的博客:响应式编程学习笔记

准备工作:先获取 DeepSeek API Key

在开始编码前,需要先申请 DeepSeek 的 API Key:

  1. 访问 DeepSeek 开放平台:https://platform.deepseek.com/api_keys
  2. 注册 / 登录账号后,在 “API Keys” 页面点击 “创建 API Key”,保存生成的密钥(后续代码中会用到)。

deepseek-api.png

方式一:通过 DeepSeek 官方 SDK 调用(最直接)

DeepSeek 官方提供了适配 Spring AI 的 SDK,开箱即用,适合快速集成。

1. 添加依赖

pom.xml中引入 Spring AI 对 DeepSeek 的支持(建议使用1.0.0+版本,兼容性更好):

<!-- Spring AI 核心依赖 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-deepseek</artifactId>
    <version>1.0.0</version> <!-- 请使用最新稳定版 -->
</dependency>

2. 编码实现:阻塞式与流式输出

import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.ai.deepseek.DeepSeekChatOptions;
import org.springframework.ai.deepseek.api.DeepSeekApi;
import reactor.core.publisher.Flux;
import java.util.ArrayList;
import java.util.List;

public class DeepSeekSdkTest {

    // 初始化DeepSeek模型(核心对象)
    private final DeepSeekChatModel chatModel = DeepSeekChatModel.builder()
            .deepSeekApi(DeepSeekApi.builder()
                    .apiKey("你的API Key") // 替换为你的DeepSeek API Key
                    .build())
            .defaultOptions(DeepSeekChatOptions.builder()
                    .model("deepseek-chat") // 指定模型(支持deepseek-chat、deepseek-coder等)
                    .temperature(0.7) // 控制输出随机性(0-1,值越高越随机)
                    .build())
            .build();

    // 测试1:阻塞式输出(适合简单场景,等待完整结果返回)
    @Test
    public void testBlockingCall() {
        // 构建对话消息(SystemMessage设定角色,UserMessage是用户提问)
        List<Message> messages = new ArrayList<>();
        messages.add(new SystemMessage("你是一个出色的聊天助手,擅长通过幽默的风格回答用户问题。"));
        messages.add(new UserMessage("你好,请问你是谁"));

        // 调用模型并获取结果
        ChatResponse response = chatModel.call(new Prompt(messages));
        // 打印完整回复
        System.out.println("完整回复:" + response.getResult().getOutput().getText());
    }

    // 测试2:流式输出(适合用户体验场景,逐字显示回复)
    @Test
    public void testStreamCall() {
        // 准备参数
        List<Message> messages = new ArrayList<>();
        messages.add(new SystemMessage("你是一个出色的聊天助手,擅长通过幽默的风格回答用户问题。"));
        messages.add(new UserMessage("你好,请问你是谁"));

        // 调用
        Flux<ChatResponse> flux = chatModel.stream(new Prompt(messages));
        // 打印结果
        flux.subscribe(resp -> System.out.println(resp.getResult().getOutput().getText()));

        // 阻塞等待(测试环境用,实际项目无需此操作)
        try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); }
    }
}

代码说明

  • DeepSeekChatModel:DeepSeek SDK 的核心类,通过建造者模式配置 API Key 和模型参数。
  • call()方法:阻塞式调用,适合不需要实时显示的场景(如后端批量处理),结果如下图。

    call.png

  • stream()方法:流式调用,返回Flux对象,通过subscribe()实时接收输出(前端可配合 SSE 显示)。
  • 模型参数:temperature控制回复随机性(0 = 严谨,1= creative),model可切换为代码模型deepseek-coder

方式二:通过 OpenAI 兼容 SDK 调用(推荐!)

大多数主流大模型(包括 DeepSeek)都兼容 OpenAI 的 API 格式,用 OpenAI 的 SDK 调用更通用,后续切换模型(如 GPT、 Claude)几乎不用改代码。

1. 添加依赖

引入 Spring AI 对 OpenAI 的支持(和方式一的依赖不冲突,可共存):

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-model-openai</artifactId>
    <version>1.0.0</version> <!-- 与DeepSeek依赖版本保持一致 -->
</dependency>

2. 编码实现:兼容 OpenAI 格式

import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.openai.api.OpenAiApi;
import reactor.core.publisher.Flux;
import java.util.ArrayList;
import java.util.List;

public class OpenAiCompatibleTest {

    // 初始化OpenAI兼容模型(核心是替换baseUrl为DeepSeek)
    private final OpenAiChatModel chatModel = OpenAiChatModel.builder()
            .openAiApi(OpenAiApi.builder()
                    .baseUrl("https://api.deepseek.com/") // DeepSeek的OpenAI兼容接口地址
                    .apiKey("你的API Key") // 同样使用DeepSeek的API Key
                    .build())
            .defaultOptions(OpenAiChatOptions.builder()
                    .model("deepseek-chat") // 模型名称与DeepSeek一致
                    .temperature(0.7)
                    .build())
            .build();

    // 测试阻塞式输出(和方式一用法几乎一致)
    @Test
    public void testBlockingCall() {
        List<Message> messages = new ArrayList<>();
        messages.add(new SystemMessage("你是一个出色的聊天助手,擅长通过幽默的风格回答用户问题。"));
        messages.add(new UserMessage("你好,请问你是谁"));

        ChatResponse response = chatModel.call(new Prompt(messages));
        System.out.println("完整回复:" + response.getResult().getOutput().getText());
    }

    // 测试流式输出
    @Test
    public void testStreamCall() {
         // 准备参数
        List<Message> messages = new ArrayList<>();
        messages.add(new SystemMessage("你是一个出色的聊天助手,擅长通过幽默的风格回答用户问题。"));
        messages.add(new UserMessage("你好,请问你是谁"));

        // 调用
        Flux<ChatResponse> flux = chatModel.stream(new Prompt(messages));
        // 打印结果
        flux.subscribe(resp -> System.out.println(resp.getResult().getOutput().getText()));

        try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); }
    }
}

为什么推荐这种方式?

  • 兼容性强:后续想切换到 GPT-4、Anthropic Claude 等模型,只需修改baseUrlmodel参数。
  • 生态成熟:OpenAI 的 SDK 文档和社区支持更丰富,遇到问题更容易找到解决方案。
  • 代码复用:团队中如果已有 OpenAI 调用逻辑,无需重复开发,直接适配 DeepSeek。

方式三:原生 HTTP 请求调用(无 SDK,更灵活)

如果不想依赖第三方 SDK,也可以直接通过 HTTP 请求调用 DeepSeek 的 API,适合需要自定义请求 / 响应处理的场景。

1. 核心原理

DeepSeek 的聊天接口地址为:https://api.deepseek.com/v1/chat/completions,支持 POST 请求,通过stream: true参数开启流式输出。
请求头需携带Authorization: Bearer 你的API Key,请求体为 JSON 格式(包含对话消息、模型参数等)。

2. 编码实现:用 WebClient 发送请求

import org.junit.jupiter.api.Test;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;

public class HttpDirectCallTest {

    // 你的DeepSeek API Key
    private static final String API_KEY = "你的API Key";
    // DeepSeek聊天接口地址
    private static final String API_URL = "https://api.deepseek.com/v1/chat/completions";

    @Test
    public void testStreamHttpCall() {
        // 构建请求体JSON(流式输出需设置stream: true)
        
                String requestBody = """
                {
                   "messages": [
                     {
                       "role": "system",
                       "content": "你是一个出色的聊天助手,擅长通过幽默的风格回答用户问题。"
                     },
                     {
                       "role": "user",
                       "content": "如何用Java发送HTTP请求?"
                     }
                   ],
                   "model": "deepseek-chat",
                   "stream": true,
                   "temperature": 0.7,
                   "max_tokens": 2048
                 }
                """;

        // 用WebClient发送POST请求(响应式HTTP客户端)
        WebClient webClient = WebClient.create(API_URL);
        Flux<String> responseFlux = webClient.post()
                .contentType(MediaType.APPLICATION_JSON)
                .header("Authorization", "Bearer " + API_KEY)
                .bodyValue(requestBody)
                .retrieve()
                .bodyToFlux(String.class); // 流式接收响应

        // 订阅并处理响应
        responseFlux.subscribe(
            chunk -> { // 每一段流式输出(SSE格式,需解析data字段)
                if (chunk.contains("\"data\":")) {
                    String content = chunk.split("\"data\":")[1].replace("}", "").replace("\"", "").trim();
                    if (!content.equals("[DONE]")) { // 过滤结束标识
                        System.out.print(content);
                    }
                }
            },
            error -> System.err.println("HTTP请求错误:" + error.getMessage()),
            () -> System.out.println("\nHTTP流式输出结束~")
        );

        // 阻塞等待
        try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); }
    }
}

代码说明

  • 请求体参数messages是对话历史(role支持system/user/assistant),stream: true开启流式输出。
  • 响应处理:流式响应为 SSE(Server-Sent Events)格式,每一行是data: {内容},需解析data字段获取实际输出。
  • 灵活性:可自定义超时时间、重试机制、请求拦截器等,适合复杂场景(如企业级网关适配)。

三种方式对比与选择建议

方式优点缺点适合场景
DeepSeek 官方 SDK原生支持,参数适配性好仅支持 DeepSeek,切换模型需改代码仅用 DeepSeek,快速集成
OpenAI 兼容 SDK跨模型兼容,生态成熟需确认模型兼容性(部分参数可能不同)可能切换模型,追求代码复用
原生 HTTP 请求无依赖,高度自定义需手动处理参数、解析响应,开发效率低自定义需求高,避免第三方 SDK 依赖

👉 新手推荐方式二,兼顾简单性和灵活性;追求极致自定义用方式三;仅深度集成 DeepSeek 用方式一

避坑指南

  1. API Key 安全:不要硬编码 API Key,建议通过配置文件(如application.yml)或环境变量注入,避免泄露。
  2. 超时设置:大模型响应可能较慢,需在 HTTP 客户端或 SDK 中设置合理超时时间(如 30 秒以上)。
  3. 流式输出前端适配:如果前端需要显示流式效果,可通过 SSE(Server-Sent Events)或 WebSocket 接收后端的Flux输出。
  4. 模型参数调试temperaturetop_p控制输出风格,可根据需求调整(技术问答建议temperature=0.3更严谨)。

总结

通过本文的 3 种方式,介绍了 Java 调用 DeepSeek 大模型的核心方法。无论是快速集成的 SDK 方式,还是灵活的原生 HTTP 请求,都能满足不同场景的需求。
接下来可以尝试扩展功能:比如添加对话历史管理、实现多轮对话,或者集成到 Spring Boot 项目中提供 API 接口。
如果遇到问题,欢迎在评论区留言, 祝大家开发顺利! 🚀

0

评论 (0)

取消