news 2026/4/15 13:13:12

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/15 13:54:16

Flask:后端框架使用

文章目录 1、介绍2、demo演示3、Flask请求和响应 3.1 演示demo3.2 request获取请求体数据3.3 requests发送请求3.4 响应返回和接收 4、特殊路由 4.1 路由重定向4.2 路由拦截器 1、介绍 Flask是由python语言编写的轻量级Web应用框架&#xff0c;主要应用于后端框架&#xff…

作者头像 李华
网站建设 2026/4/14 2:27:23

一次把 RAG 的「整套结构」讲清楚,存一下吧 很难找全的!

这张图&#xff0c;佳哥真是用心了 今天这一篇&#xff0c;我不讲案例、不讲代码、不讲某个框架的用法。 我只做一件事&#xff1a;把这张图&#xff0c;从“看起来复杂”&#xff0c;讲到“你知道它为什么必须长这样”。先说一句狠话 如果你觉得 RAG 是&#xff1a;向量库 Em…

作者头像 李华
网站建设 2026/4/13 0:28:50

基于SpringBoot的停车管理系统(毕设源码+文档)

背景 本课题聚焦基于SpringBoot框架的停车管理系统设计与实现&#xff0c;旨在解决传统停车管理中车位信息不透明、车辆进出效率低、缴费流程繁琐、车位调度混乱及运营数据统计滞后等问题。系统采用B/S架构&#xff0c;依托浏览器即可实现多端便捷访问&#xff0c;适配停车场管…

作者头像 李华
网站建设 2026/4/15 15:33:52

微信小程序 PHP_uniapp的坭兴陶文化传承与创新系统的设计与实现_a8uyn972

目录摘要内容项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要内容 坭兴陶作为中国四大名陶之一&#xff0c;具有深厚的文化底蕴和艺术价值。微信小程序结合PHP和Uniapp技术&#xff0c;设计并实现了一套坭兴陶文化传承与创新系统&#xff0c;…

作者头像 李华
网站建设 2026/4/15 15:39:19

Git合并时忽略文件的6种技巧

有几种方法可以在 git merge 时忽略特定文件的合并&#xff1a;方法一&#xff1a;使用 .gitattributes 文件&#xff08;推荐&#xff09;在项目根目录创建或编辑 .gitattributes 文件&#xff1a;infostation.js mergeours *.js mergeours # 如果需要忽略所有js文件的合并然…

作者头像 李华