接入 DeepSeek | Java 调用大模型实战保姆级教程:新手快速上手
最近各大平台接入 DeepSeek 大模型的案例越来越多,作为程序员,你是不是也想亲手实现一次?别担心,这篇教程会用3 种实战方式,带你从零开始用 Java 接入 DeepSeek 大模型,从 SDK 调用到原生 HTTP 请求全覆盖,新手也能轻松上手~
前置知识:为什么需要响应式编程?
大模型对话为了提升用户体验,通常会采用流式输出(像 ChatGPT 那样逐字显示回复)。而 Java 中实现流式输出需要用到响应式编程(Reactive Programming),核心是通过Flux(Reactor 框架)处理异步数据流。
如果你对响应式编程不太熟悉,可以先简单理解:Flux能帮你 “实时接收” 大模型的每一段输出,而不是等全部结果返回后才处理。
👉 快速入门参考:Spring 响应式编程官方文档
👉 也可参考我的博客:响应式编程学习笔记
准备工作:先获取 DeepSeek API Key
在开始编码前,需要先申请 DeepSeek 的 API Key:
- 访问 DeepSeek 开放平台:https://platform.deepseek.com/api_keys
- 注册 / 登录账号后,在 “API Keys” 页面点击 “创建 API Key”,保存生成的密钥(后续代码中会用到)。

方式一:通过 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()方法:阻塞式调用,适合不需要实时显示的场景(如后端批量处理),结果如下图。
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 等模型,只需修改
baseUrl和model参数。 - 生态成熟: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 用方式一。
避坑指南
- API Key 安全:不要硬编码 API Key,建议通过配置文件(如
application.yml)或环境变量注入,避免泄露。 - 超时设置:大模型响应可能较慢,需在 HTTP 客户端或 SDK 中设置合理超时时间(如 30 秒以上)。
- 流式输出前端适配:如果前端需要显示流式效果,可通过 SSE(Server-Sent Events)或 WebSocket 接收后端的
Flux输出。 - 模型参数调试:
temperature和top_p控制输出风格,可根据需求调整(技术问答建议temperature=0.3更严谨)。
总结
通过本文的 3 种方式,介绍了 Java 调用 DeepSeek 大模型的核心方法。无论是快速集成的 SDK 方式,还是灵活的原生 HTTP 请求,都能满足不同场景的需求。
接下来可以尝试扩展功能:比如添加对话历史管理、实现多轮对话,或者集成到 Spring Boot 项目中提供 API 接口。
如果遇到问题,欢迎在评论区留言, 祝大家开发顺利! 🚀
评论 (0)