当前位置: 首页 > news >正文

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");@Datapublic 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;@Datapublic static class Choice {private Delta delta;}@Datapublic 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("\n请输入您的问题 (输入 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("\n----------------------------------------");fileWriter.println("\n----------------------------------------");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("\n[%s] Question:\n%s\n\n[%s] Answer:\n", 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

相关文章:

DeepSeek API 调用 - Spring Boot 实现

DeepSeek API 调用 - Spring Boot 实现 1. 项目依赖 在 pom.xml 中添加以下依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></depe…...

图数据库Neo4j面试内容整理-节点(Node)

在图数据库中,节点(Node)是图结构中的基本构建块,代表实体或对象。节点通常用于存储数据模型中的主要对象,比如人、商品、地点等。在图数据库中,节点是通过标签(Label)来分类的,并且可以包含属性(Property)来描述它们的详细信息。 1. 节点的组成<...

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理&#xff0c;公式&#xff0c;模式&#xff0c;伸缩因子&#xff0c;旋转方向等&#xff0c;推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现&#xff0c;注意…...

2.14寒假

这几天复习的搜索把之前做过的题目看了一下。 解析&#xff1a;int dx[5]{0,0,1,0,-1}; 和 int dy[5]{0,1,0,-1,0};&#xff1a;这两个数组用于表示上下左右四个方向的偏移量&#xff0c;方便在 DFS 中访问相邻的元素。o 和 p 分别表示当前搜索位置的行和列。边界条件判断&…...

基于逻辑概率的语义信道容量(Semantic Channel Capacity)和语义压缩理论(Semantic Compression Theory)

基于逻辑概率的语义信道容量&#xff08;Semantic Channel Capacity&#xff09;和语义压缩理论&#xff08;Semantic Compression Theory&#xff09;是语义通信&#xff08;Semantic Communication, SemCom&#xff09;的核心研究方向&#xff0c;它们旨在优化通信效率&#…...

DeepSeek R1本地部署教程

尽管许多卖课博主声称能轻松运行满血版DeepSeek R1&#xff0c;但满血版R1模型参数高达671B&#xff0c;仅模型文件就需要404GB存储空间&#xff0c;运行时更需要约1300GB显存。 对于没有卡的普通玩家来说&#xff0c;运行的条件苛刻&#xff0c;且门槛极高。基于此&#xff0…...

CEF132编译指南 MacOS 篇 - 获取 CEF 源码 (五)

1. 引言 在完成了所有必要工具的安装和配置之后&#xff0c;我们正式进入获取 CEF132 源码的阶段。对于 macOS 平台&#xff0c;CEF 的源码获取过程需要特别注意不同芯片架构&#xff08;Intel 和 Apple Silicon&#xff09;的区别以及版本管理。本篇将作为 CEF132 编译指南系…...

TypeScript装饰器 ------- 学习笔记分享

目录 一. 简介 二. 类装饰器 1. 基本语法 2. 应用举例 3. 关于返回值 4. 关于构造类型 5. 替换被装饰的类 三. 装饰器工厂 四. 装饰器组合 五. 属性装饰器 1. 基本语法 2. 关于属性遮蔽 3. 应用举例 六. 方法装饰器 1. 基本语法 2. 应用举例 七. 访问器装饰器 …...

FPGA实现UltraScale GTH光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本博已有的FPGA驱动USB通信方案 3、工程详细设计方案工程设计原理框图输入Sensor之-->OV5640摄像头动态彩条输入视频之-->ADV…...

蓝桥杯篇---实时时钟 DS1302

文章目录 前言特点简介1.低功耗2.时钟/日历功能3.32字节的额外RAM4.串行接口 DS1302 引脚说明1.VCC12.VCC23.GND4.CE5.I/O6.SCLK DS1302 寄存器1.秒寄存器2.分钟寄存器3.小时寄存器4.日寄存器5.月寄存器6.星期寄存器7.年寄存器8.控制寄存器 DS1302 与 IAP25F2K61S2 的连接1.CE连…...

C语言蓝桥杯1003: [编程入门]密码破译

要将"China"译成密码&#xff0c;译码规律是&#xff1a;用原来字母后面的第4个字母代替原来的字母&#xff0e; 例如&#xff0c;字母"A"后面第4个字母是"E"&#xff0e;"E"代替"A"。因此&#xff0c;"China"应译…...

【MySQL在Centos 7环境安装】

文章目录 一. 卸载不必要的环境二. 检查系统安装包三. 卸载这些默认安装包四. 获取mysql官⽅yum源五. 安装mysql yum 源&#xff0c;对⽐前后yum源六. 看看能不能正常⼯作七. 安装mysql服务八. .查看配置⽂件和数据存储位置九. 启动服务并查看服务是否存在十. 登陆⽅法十一. 设…...

科技引领未来,中建海龙C-MiC 2.0技术树立模块化建筑新标杆

在建筑行业追求高效与品质的征程中&#xff0c;中建海龙科技有限公司&#xff08;简称“中建海龙”&#xff09;以其卓越的创新能力和强大的技术实力&#xff0c;不断书写着装配式建筑领域的新篇章。1 月 10 日&#xff0c;由深圳安居集团规划&#xff0c;中建海龙与中海建筑共…...

玩转观察者模式

文章目录 什么是观察者模式解决方案结构适用场景实现方式观察者模式优缺点优点:缺点:什么是观察者模式 观察者模式通俗点解释就是你在观察别人,别人有什么变化,你就做出什么调整。观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个“观察…...

Baklib知识中台构建企业智能运营核心架构

内容概要 在数字化转型的浪潮中&#xff0c;企业对于知识的系统化管理需求日益迫切。Baklib作为新一代的知识中台&#xff0c;通过构建智能运营核心架构&#xff0c;为企业提供了一套从知识汇聚到场景化落地的完整解决方案。其核心价值在于将分散的知识资源整合为统一的资产池…...

Anaconda +Jupyter Notebook安装(2025最新版)

Anaconda安装&#xff08;2025最新版&#xff09; Anaconda简介安装1&#xff1a;下载anaconda安装包2&#xff1a; 安装anaconda3&#xff1a;配置环境变量4&#xff1a;检查是否安装成功5&#xff1a;更改镜像源6&#xff1a;更新包7&#xff1a;检查 Jupyter Notebook一.Jup…...

正成为现代城市发展的必然趋势的智慧交通开源了

智慧交通视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。通过人流密集检测…...

手撕Transformer编码器:从Self-Attention到Positional Encoding的PyTorch逐行实现

Transformer 编码器深度解读 代码实战 1. 编码器核心作用 Transformer 编码器的核心任务是将输入序列&#xff08;如文本、语音&#xff09;转换为富含上下文语义的高维特征表示。它通过多层自注意力&#xff08;Self-Attention&#xff09;和前馈网络&#xff08;FFN&#x…...

Webpack和Vite插件的开发与使用

在现代开发中一般各公司都有自己的监控平台&#xff0c;对前端而言如果浏览器报错的话就可以通过埋点收集错误日志&#xff0c;再结合sourcemap文件可以帮助我们定位到错误代码&#xff0c;帮助我们排查问题。这里就记录一下之前在webpack和vite两个环境中的插件开发&#xff0…...

HTTP的状态码

HTTP 状态码 当浏览者访问一个网页时&#xff0c;浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前&#xff0c;此网页所在的服务器会返回一个包含 HTTP 状态码的信息头&#xff08;server header&#xff09;用以响应浏览器的请求。 常见的HTTP状态码 …...

macOS智能鼠标模拟器:告别远程会话超时,保持连接活跃

1. 项目概述&#xff1a;一个为macOS设计的智能鼠标模拟器如果你和我一样&#xff0c;经常需要远程连接到公司的开发机&#xff0c;或者长时间在虚拟机里跑一些测试任务&#xff0c;那你一定对“会话超时断开”这个烦人的问题深恶痛绝。无论是微软的远程桌面、VNC&#xff0c;还…...

ChatGPT-AutoExpert:构建领域专家提示词,实现AI深度专业协作

1. 项目概述&#xff1a;当ChatGPT学会“自我进化”如果你和我一样&#xff0c;深度依赖ChatGPT进行编程、写作或解决复杂问题&#xff0c;那你一定遇到过这样的困境&#xff1a;面对一个专业领域的问题&#xff0c;你需要反复向ChatGPT解释背景知识、行业术语和具体约束&#…...

用AutoHotkey实现键盘控制鼠标光标:高效自定义方案

1. 项目概述与核心需求解析如果你曾经遇到过鼠标突然失灵、在狭小的办公桌上施展不开、或者笔记本触摸板漂移得让你想砸电脑的情况&#xff0c;那么你大概能理解那种抓狂的感觉。作为一个长期与多显示器、复杂工作流打交道的效率工具爱好者&#xff0c;我发现自己对鼠标的依赖程…...

MySQL-基础篇-函数

函数函数是指一段可以直接被另一段程序调用的程序或代码。字符串函数 MySQL中内置了很多字符串函数&#xff0c;常用的几个如下&#xff1a;- 注意&#xff1a;数据库中使用SUBSTRING时&#xff0c;索引是从1开始的。数值函数 常见的数值函数如下&#xff1a;日期函数 常见的日…...

2026株洲AI床垫带来的超绝体验

床垫国标落地&#xff0c;大家都好奇2026年AI床垫能不能带来智能体验。我之前睡眠质量差&#xff0c;换了HEKA黑卡AI智能床垫后&#xff0c;睡眠改善不少&#xff0c;所以很有发言权。HEKA黑卡研发10年&#xff0c;内置230万组睡眠数据库&#xff0c;精准度有保障。它家成人床垫…...

基于Mirai与Spring Boot的QQ机器人开发实战:从零构建PCR公会战管理工具

1. 项目缘起与重生之路 作为一个在QQ机器人圈子里摸爬滚打了快十年的老玩家&#xff0c;我见证过不少框架的兴起与沉寂。最早自己捣鼓着用酷Q和PicqBotX框架&#xff0c;整合Spring写了个叫WMagicBot的小玩意儿&#xff0c;纯粹是自娱自乐。后来酷Q一夜之间停止服务&#xff0…...

从失效的Cursor试用重置工具看自动化脚本与API逆向工程

1. 项目背景与核心思路解析最近在开发者圈子里&#xff0c;Cursor 这款 AI 驱动的代码编辑器热度一直很高。它集成了强大的 AI 助手&#xff0c;能直接理解代码上下文、生成代码片段甚至重构整个函数&#xff0c;对提升开发效率的帮助是实实在在的。不过&#xff0c;它的高级功…...

基于Next.js 13与OpenAI API构建AI编程助手全栈实践

1. 项目概述&#xff1a;打造一个属于你自己的AI编程助手最近在折腾一个挺有意思的项目&#xff0c;想和大家分享一下。这个项目的核心&#xff0c;就是利用OpenAI的Codex模型&#xff08;也就是ChatGPT背后技术的一个分支&#xff09;&#xff0c;自己动手搭建一个专属于开发者…...

华为CANN/pypto全1张量创建函数

pypto.ones 【免费下载链接】pypto PyPTO&#xff08;发音: pai p-t-o&#xff09;&#xff1a;Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atl…...

基于Docker的AI Agent安全部署实践:Carapace项目深度解析

1. 项目概述&#xff1a;为AI Agent打造一个安全的“家”如果你正在运行一个像OpenClaw这样的AI Agent网关&#xff0c;那么你手里握着的是一把双刃剑。它强大、灵活&#xff0c;能帮你处理各种任务&#xff0c;但同时也意味着你赋予了一个AI程序访问你的Shell、文件系统乃至外…...