首页
关于这个博客
Search
1
Java 实现Google 账号单点登录(OAuth 2.0)全流程解析
231 阅读
2
Spring AI 无法获取大模型深度思考内容?解决方案来了
202 阅读
3
微信小程序实现页面返回前确认弹窗:兼容左上角返回与右滑返回
91 阅读
4
服务器遭遇 XMRig 挖矿程序入侵排查与清理全记录
66 阅读
5
解决 Mac 版 PicGo 无法打开问题:“已损坏,无法打开” 报错处理指南
37 阅读
Java 核心
框架与中间件
数据库技术
开发工具与效率
问题排查与踩坑记录
程序员成长与思考
前端
登录
Search
标签搜索
java虚拟机
JVM
保姆级教程
Java
Spring AI
SpringBoot
Nginx
WebFlux
Spring
cdn
https
dcdn
网站加速
Tool
图片导出
服务部署
源码解析
单点登录
google
sso
Luca Ju
累计撰写
35
篇文章
累计收到
1
条评论
首页
栏目
Java 核心
框架与中间件
数据库技术
开发工具与效率
问题排查与踩坑记录
程序员成长与思考
前端
页面
关于这个博客
搜索到
1
篇与
的结果
2025-08-11
接入 DeepSeek | Java 调用大模型实战保姆级教程:新手快速上手
接入 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 接口。如果遇到问题,欢迎在评论区留言, 祝大家开发顺利! 🚀
2025年08月11日
11 阅读
0 评论
0 点赞