news 2026/5/1 4:15:49

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/4/26 18:23:15

深入解析DDR内存原理、测试方法及在嵌入式系统中的应用

文章目录摘要1. DDR内存核心技术解析1.1 物理架构与存储原理1.2 关键时序参数2. DDR测试方法与工具链2.1 测试环境搭建2.2 MemTest86测试流程3. 嵌入式系统集成实践3.1 ARM Cortex-A内存控制器配置4. 完整测试代码实现5. 常见问题解决5.1 信号完整性问题6. 成果展示技术图谱摘要…

作者头像 李华
网站建设 2026/4/30 3:42:42

交通仿真软件:Aimsun_(3).Aimsun基本操作

Aimsun基本操作 创建和配置仿真网络 在Aimsun中&#xff0c;创建和配置仿真网络是仿真过程的第一步。仿真网络是交通仿真的基础&#xff0c;它包括道路网络、交叉口、交通信号、交通流等基本元素。本节将详细介绍如何在Aimsun中创建和配置仿真网络&#xff0c;以及如何导入和导…

作者头像 李华
网站建设 2026/4/23 8:09:52

docker下搭建redis集群

1. 环境准备 准备好Linux系统机器&#xff0c;并安装好docker&#xff0c;阅读这篇文章前请先了解清楚docker的基本知识并且会熟悉运用docker的常用命令。学习docker基础知识可以参考这篇博文 安装好并启动docker后就可以开始搭建redis了 2. docker容器下安装redis 本篇文章…

作者头像 李华
网站建设 2026/4/30 18:27:16

docker 安装 mysql

目录 一、下载mysql镜像 1.查看你自己的镜像下载 ?2.运行一个mysql容器 方法一、?直接运行 方法二、创建脚本 直接使用脚本运行 3.连接数据库 一、下载mysql镜像 docker pull mysql:5.71.查看你自己的镜像下载 docker images?2.运行一个mysql容器 方法一、直接运行…

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

二分猜答案

二分前后缀分解lc786二分查找分数值范围&#xff0c;统计小于等于中间值的分数个数&#xff0c;定位第k小的素数分数并返回#include <vector> using namespace std;class Solution { private:vector<int> arr;int n, a, b; public:vector<int> kthSmallestPr…

作者头像 李华
网站建设 2026/5/1 2:23:32

信使(msner)(信息学奥赛一本通- P1376)四种做法

【题目描述】战争时期&#xff0c;前线有n个哨所&#xff0c;每个哨所可能会与其他若干个哨所之间有通信联系。信使负责在哨所之间传递信息&#xff0c;当然&#xff0c;这是要花费一定时间的&#xff08;以天为单位&#xff09;。指挥部设在第一个哨所。当指挥部下达一个命令后…

作者头像 李华