news 2026/5/17 0:50:53

DeepSeek API 调用 - Spring Boot 实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek API 调用 - Spring Boot 实现

DeepSeek API 调用 - Spring Boot 实现

1. 项目依赖

pom.xml中添加以下依赖:

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> </dependencies>
2. 项目结构
deepseek-project/ ├── src/main/java/com/example/deepseek/ │ ├── DeepSeekApplication.java │ ├── config/ │ │ └── DeepSeekConfig.java │ ├── model/ │ │ ├── ChatRequest.java │ │ ├── ChatResponse.java │ │ └── Message.java │ └── service/ │ └── DeepSeekService.java └── conversation.txt
3. 完整代码实现
3.1 配置类DeepSeekConfig.java
package com.example.deepseek.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @Configuration @Getter public class DeepSeekConfig { @Value("${deepseek.api.url}") private String apiUrl; @Value("${deepseek.api.key}") private String apiKey; }
3.2 请求/响应模型

Message.java:

package com.example.deepseek.model; import lombok.Data; @Data public class Message { private String role; private String content; }

ChatRequest.java:

package com.example.deepseek.model; import lombok.Data; import java.util.List; @Data public class ChatRequest { private String model = "deepseek-ai/DeepSeek-V3"; private List<Message> messages; private boolean stream = true; private int max_tokens = 2048; private double temperature = 0.7; private double top_p = 0.7; private int top_k = 50; private double frequency_penalty = 0.5; private int n = 1; private ResponseFormat response_format = new ResponseFormat("text"); @Data public static class ResponseFormat { private String type; public ResponseFormat(String type) { this.type = type; } } }

ChatResponse.java:

package com.example.deepseek.model; import lombok.Data; import java.util.List; @Data public class ChatResponse { private List<Choice> choices; @Data public static class Choice { private Delta delta; } @Data public static class Delta { private String content; } }
3.3 服务类DeepSeekService.java
package com.example.deepseek.service; import com.example.deepseek.config.DeepSeekConfig; import com.example.deepseek.model.ChatRequest; import com.example.deepseek.model.ChatResponse; import com.example.deepseek.model.Message; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Flux; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Collections; import java.util.Scanner; @Service @RequiredArgsConstructor public class DeepSeekService { private final DeepSeekConfig config; private final WebClient.Builder webClientBuilder; private final ObjectMapper objectMapper = new ObjectMapper(); public void startInteractiveChat() { try (Scanner scanner = new Scanner(System.in); PrintWriter fileWriter = new PrintWriter(new FileWriter("conversation.txt", true))) { while (true) { System.out.print(" 请输入您的问题 (输入 q 退出): "); String question = scanner.nextLine().trim(); if ("q".equalsIgnoreCase(question)) { System.out.println("程序已退出"); break; } // 保存问题 saveToFile(fileWriter, question, true); // 发起对话请求 Flux<String> responseFlux = sendChatRequest(question); StringBuilder fullResponse = new StringBuilder(); responseFlux .doOnNext(chunk -> { System.out.print(chunk); fullResponse.append(chunk); }) .doOnComplete(() -> { // 保存完整回复 saveToFile(fileWriter, fullResponse.toString(), false); System.out.println(" ----------------------------------------"); fileWriter.println(" ----------------------------------------"); fileWriter.flush(); }) .blockLast(); } } catch (IOException e) { e.printStackTrace(); } } private Flux<String> sendChatRequest(String question) { ChatRequest request = new ChatRequest(); Message userMessage = new Message(); userMessage.setRole("user"); userMessage.setContent(question); request.setMessages(Collections.singletonList(userMessage)); return webClientBuilder.build() .post() .uri(config.getApiUrl()) .header("Authorization", "Bearer " + config.getApiKey()) .header("Content-Type", "application/json") .bodyValue(request) .retrieve() .bodyToFlux(String.class) .filter(line -> line.startsWith("data: ") && !line.equals("data: [DONE]")) .map(line -> { try { String jsonStr = line.substring(6); ChatResponse response = objectMapper.readValue(jsonStr, ChatResponse.class); return response.getChoices().get(0).getDelta().getContent(); } catch (Exception e) { return ""; } }) .filter(content -> !content.isEmpty()); } private void saveToFile(PrintWriter fileWriter, String content, boolean isQuestion) { String timestamp = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); if (isQuestion) { fileWriter.printf(" [%s] Question: %s [%s] Answer: ", timestamp, content, timestamp); } else { fileWriter.print(content); } fileWriter.flush(); } }
3.4 主应用类DeepSeekApplication.java
package com.example.deepseek; import com.example.deepseek.service.DeepSeekService; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class DeepSeekApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(DeepSeekApplication.class, args); DeepSeekService deepSeekService = context.getBean(DeepSeekService.class); deepSeekService.startInteractiveChat(); } }
3.5 配置文件application.properties
deepseek.api.url=https://api.siliconflow.cn/v1/chat/completions deepseek.api.key=YOUR_API_KEY
4. 代码详解
4.1 关键特性
  1. 使用 Spring WebFlux 的响应式编程模型
  2. 流式处理 API 响应
  3. 文件记录对话
  4. 错误处理和异常管理
4.2 主要组件
  • DeepSeekConfig: 管理 API 配置
  • DeepSeekService: 处理对话逻辑和 API 交互
  • 模型类: 定义请求和响应结构
5. 使用方法
  1. 替换application.properties中的YOUR_API_KEY
  2. 运行DeepSeekApplication
  3. 在控制台输入问题
  4. 输入 ‘q’ 退出程序
  5. 查看conversation.txt获取对话记录
6. 性能和可扩展性
  • 使用响应式编程提高并发性能
  • 灵活的配置管理
  • 易于扩展和定制
7. 注意事项
  • 确保正确配置 API Key
  • 处理网络异常
  • 注意内存使用
总结

Spring Boot 实现提供了一个健壮、可扩展的 DeepSeek API 调用方案,利用响应式编程提供高效的流式对话体验。

立即体验

快来体验 DeepSeek:https://cloud.siliconflow.cn/i/vnCCfVaQ

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 18:17:22

FlinkCDC实战:将 MySQL 数据同步至 ES

?? 当前需要处理的业务场景: 将订单表和相关联的表(比如: 商品表、子订单表、物流信息表)组织成宽表, 放入到 ES 中, 加速订单数据的查询. 同步数据到 es. 概述 1. 什么是 CDC 2. 什么是 Flink CDC 3. Flink CDC Connectors 和 Flink 的版本映射 实战 1. 宽表查询 1.1 …

作者头像 李华
网站建设 2026/5/14 2:43:17

DBeaver连接本地MySQL、创建数据库表的基础操作

一、连接本地MySQL 1、新建连接 打开DBeaver,点击左上角的文件或者点击箭头所指的连接按钮。新建数据库连接-选择数据库&#xff08;mysql&#xff09;&#xff0c;点击“下一步”输入服务器地址、端口、用户名、密码(数据库自己选填&#xff0c;不填则连接所有数据库&#xff…

作者头像 李华
网站建设 2026/5/1 17:41:54

基于Django的网络设备租赁系统设计与实现-计算机毕业设计源码+LW文档

摘 要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;网络设备租赁系统利用计算机网络实现信息化管理&#xff0c;使整个网络设备租赁的发展和服务水平有显著提升。在系统开发过程中…

作者头像 李华
网站建设 2026/5/7 1:13:37

docker中配置redis

1、常规操作 docker pull redis&#xff08;默认你的docker中没有redis&#xff09; 2、查看redis是否拉取成功 docker images redis 3、创建目录&#xff0c;在你的宿主机&#xff0c;&#xff08;我是在虚机中建的centos7&#xff09;为了给redis配置文件使用 4、下载redis…

作者头像 李华
网站建设 2026/5/9 14:34:56

docker compose安装redis

一、安装准备 在docker hub查看redis镜像版本。查看地址如下&#xff1a; Docker[这里是图片001]https://hub-stage.docker.com/_/redis/tags 二、拉取docker镜像 我这里用redis:6.2.14版本&#xff0c;先拉取镜像。命令如下&#xff1a; docker pull redis:6.2.14查看刚刚…

作者头像 李华
网站建设 2026/5/14 15:13:28

微信小程序 PHP_uniapp的大学生校园生活服务系统的 二手 自习室 会议 失物招领40ifxo7d

目录微信小程序与PHPUniApp的校园生活服务系统设计项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理微信小程序与PHPUniApp的校园生活服务系统设计 该系统整合二手交易、自习室预约、会议管理及失物招领四大功能模块&#xff0c;采用前后端分离架构…

作者头像 李华