Spring AI 接入 DeepSeek Chat 模型

发布时间:2026/9/30 2:46:33

Spring AI 接入 DeepSeek Chat 模型 本文介绍如何在 Spring Boot 项目中使用 Spring AI 接入 DeepSeek Chat 模型实现一个简单的对话接口。示例包含 Maven 依赖、application.yml配置、ChatClient调用代码以及常见问题排查。示例基于当前 Spring AI 2.0.x 的自动配置方式。Spring AI 和 DeepSeek 的模型名称会随版本变化实际使用时请以对应版本的官方文档为准。一、准备工作开始之前需要准备JDK 17 或更高版本Maven 3.9一个 Spring Boot 项目一个 DeepSeek API Key。DeepSeek API Key 可以在 DeepSeek API Keys 页面 创建。不要把 API Key 直接提交到 Git 仓库。推荐通过环境变量、配置中心或密钥管理服务注入。二、创建项目并添加 Maven 依赖下面给出一个完整的pom.xml关键配置。Spring AI 官方当前稳定版本为 2.0.x示例使用2.0.0BOM如果项目使用其他 Spring AI 版本只需要将 BOM 版本替换为项目实际版本。?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion4.0.0/versionrelativePath//parentgroupIdcom.example/groupIdartifactIdspring-ai-deepseek-demo/artifactIdversion0.0.1-SNAPSHOT/versionnamespring-ai-deepseek-demo/namepropertiesjava.version17/java.versionspring-ai.version2.0.0/spring-ai.version/propertiesdependencyManagementdependenciesdependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-bom/artifactIdversion${spring-ai.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependencies!-- Web 接口 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- Spring AI DeepSeek Chat 自动配置 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-deepseek/artifactId/dependency!-- 测试依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project版本说明Spring AI 2.0.x 对应 Spring Boot 4.0.x/4.1.x如果项目仍然使用 Spring Boot 3.x 请选择与之匹配的 Spring AI 1.x 版本不建议只修改 Spring Boot 或 Spring AI 的单个版本号最好按照 Spring AI 官方兼容矩阵整体调整。三、配置application.yml在src/main/resources/application.yml中添加以下内容server:port:8080spring:application:name:spring-ai-deepseek-demoai:deepseek:# 从环境变量中读取 API Key避免将密钥写入源码api-key:${DEEPSEEK_API_KEY}# DeepSeek OpenAI 兼容接口的基础地址base-url:https://api.deepseek.comchat:# 当前 API 文档推荐使用 deepseek-flash也可以根据账户能力选择其他模型model:deepseek-flash# 编程、数学类任务可以使用较低的 temperaturetemperature:0.7# 是否启用思考模式 按模型和 Spring AI 版本支持情况选择thinking:type:enabled在 Linux 或 macOS 中设置环境变量exportDEEPSEEK_API_KEY你的 DeepSeek API KeyWindows PowerShell$env:DEEPSEEK_API_KEY 你的 DeepSeek API Key关于模型名称不同时间点的 DeepSeek API 和 Spring AI 版本可能使用不同的模型名称。例如新版 DeepSeek API 文档中可见deepseek-flash、deepseek-v4-pro部分旧版示例使用deepseek-chat、deepseek-reasonerSpring AI 某些版本的默认值或示例可能出现deepseek-v4-flash、deepseek-v4-pro。如果启动后出现模型不存在、模型已下线等错误应以 DeepSeek 控制台和当前 API 文档中的可用模型列表为准并修改spring.ai.deepseek.chat.model。四、编写启动类packagecom.example.deepseek;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplicationpublicclassDeepSeekApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DeepSeekApplication.class,args);}}添加spring-ai-starter-model-deepseek后Spring Boot 会自动创建 DeepSeek Chat 模型相关 Bean同时提供可注入的ChatClient.Builder。五、使用ChatClient调用 DeepSeek推荐使用 Spring AI 的ChatClient它提供了简洁的链式 API。packagecom.example.deepseek.controller;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassChatController{privatefinalChatClientchatClient;publicChatController(ChatClient.BuilderchatClientBuilder){this.chatClientchatClientBuilder.build();}GetMapping(/ai/chat)publicStringchat(RequestParam(valuemessage,defaultValue请介绍一下 Spring AI)Stringmessage){returnchatClient.prompt().user(message).call().content();}}启动项目mvn spring-boot:run调用接口curl--gethttp://localhost:8080/ai/chat\--data-urlencodemessageSpring AI 的 ChatClient 有什么作用返回结果就是 DeepSeek 模型生成的文本 。六、设置系统提示词在实际项目中通常需要通过系统提示词约束模型的角色和输出风格。例如让模型始终以 Java 专家的身份回答问题packagecom.example.deepseek.config;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;ConfigurationpublicclassAiConfig{BeanpublicChatClientchatClient(ChatClient.Builderbuilder){returnbuilder.defaultSystem(你是一名资深 Java 专家请使用简洁、准确的中文回答问题。).build();}}此时控制器可以直接注入已经配置好的ChatClientpackagecom.example.deepseek.controller;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassChatController{privatefinalChatClientchatClient;publicChatController(ChatClientchatClient){this.chatClientchatClient;}GetMapping(/ai/java-question)publicStringjavaQuestion(RequestParamStringquestion){returnchatClient.prompt().user(question).call().content();}}七、使用 Service 层封装调用逻辑如果项目规模较大建议不要把所有 AI 调用逻辑写在 Controller 中可以通过 Service 统一封装packagecom.example.deepseek.service;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.stereotype.Service;ServicepublicclassDeepSeekService{privatefinalChatClientchatClient;publicDeepSeekService(ChatClient.Builderbuilder){this.chatClientbuilder.defaultSystem(你是一个专业、严谨的中文智能助手。).build();}publicStringchat(Stringmessage){returnchatClient.prompt().user(message).call().content();}}Controllerpackagecom.example.deepseek.controller;importcom.example.deepseek.service.DeepSeekService;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassDeepSeekController{privatefinalDeepSeekServicedeepSeekService;publicDeepSeekController(DeepSeekServicedeepSeekService){this.deepSeekServicedeepSeekService;}GetMapping(/ai/ask)publicStringask(RequestParamStringmessage){returndeepSeekService.chat(message);}}八、在运行时覆盖模型参数除了在application.yml中设置默认参数也可以针对某一次请求使用运行时选项覆盖模型和温度。不同 Spring AI 版本的选项构造器 API 可能略有变化下面给出常见写法importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.ai.deepseek.DeepSeekChatOptions;publicStringcreativeChat(ChatClientchatClient,Stringmessage){returnchatClient.prompt().user(message).options(DeepSeekChatOptions.builder().model(deepseek-flash).temperature(1.2).build()).call().content();}如果编译器提示DeepSeekChatOptions的构造方法或方法名不匹配请以当前 Spring AI 版本的 JavaDoc 为准因为不同版本可能使用withModel、withTemperature或新的 builder 方法命名。九、异常处理建议生产环境不要把完整异常堆栈直接返回给前端可以统一处理异常并记录请求 IDpackagecom.example.deepseek.handler;importorg.springframework.http.HttpStatus;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.bind.annotation.RestControllerAdvice;importjava.util.Map;RestControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(Exception.class)ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)publicMapString,StringhandleException(Exceptionex){// 实际项目中应使用日志框架记录 ex不建议将详细异常返回给客户端returnMap.of(message,AI 服务调用失败请稍后重试);}}对于网络抖动、临时服务不可用等问题可以结合 Spring AI 的spring.ai.retry配置调整重试策略spring:ai:retry:max-attempts:3backoff:initial-interval:1smultiplier:2max-interval:10s# 是否对客户端 4xx 错误进行重试通常保持 falseon-client-errors:false不要对无效 API Key、参数错误等 4xx 错误进行无限重试否则可能放大问题并增加调用成本。十、常见问题1. 启动时报 API Key 为空确认环境变量已经设置并且启动 Spring Boot 的终端能够读取到该变量echo$DEEPSEEK_API_KEY也可以临时在本地application.yml中配置但不要提交到公共仓库spring:ai:deepseek:api-key:sk-xxxxxxxx2. 返回 401 Unauthorized通常表示 API Key 无效、已撤销或请求使用了错误的账号密钥。重新检查 DeepSeek 控制台中的 Key并确认没有多余的空格和引号。3. 返回模型不存在检查spring.ai.deepseek.chat.model。模型名称会随着 DeepSeek API 版本调整优先使用账户当前可用的模型名。旧教程中的deepseek-chat不一定适用于当前账号或当前 API。4. 找不到ChatClient.Builder确认已添加spring-ai-starter-model-deepseekSpring AI BOM 与 starter 版本一致没有错误地使用旧版模块名项目确实启用了 Spring Boot 自动配置。5. 为什么不直接使用 WebClient 调用接口直接使用 WebClient 当然可以但需要自己处理请求结构、响应解析、重试、模型选项和消息抽象。Spring AI 的价值在于提供统一的 Chat Model 和ChatClient抽象后续切换其他模型时业务代码改动更小。十一、项目目录示例spring-ai-deepseek-demo ├── pom.xml └── src └── main ├── java │ └── com/example/deepseek │ ├── DeepSeekApplication.java │ ├── config │ │ └── AiConfig.java │ ├── controller │ │ └── ChatController.java │ └── service │ └── DeepSeekService.java └── resources └── application.yml十二、总结使用 Spring AI 接入 DeepSeek 的核心步骤只有三步在pom.xml中引入spring-ai-starter-model-deepseek在application.yml中配置spring.ai.deepseek.api-key和模型名称注入ChatClient.Builder通过prompt().user(...).call().content()发起调用。完整调用代码非常简洁returnchatClient.prompt().user(message).call().content();在生产环境中还应进一步完善 API Key 管理、超时控制、重试策略、日志脱敏、调用限流、Token 成本统计以及敏感内容审核等机制。参考资料Spring AI DeepSeek Chat 官方文档Spring AI Getting StartedSpring AI ChatClient 官方文档DeepSeek API 官方文档DeepSeek API Keys
延伸阅读

更多相关文章

2026/9/30 2:46:33

SPFA 算法简介及经典实例

● SPFA 算法 (1)SPFA 算法,即最短路径快速算法,是基于 Bellman-Ford 算法优化而来的单源最短路径算法,适用于带负权边、无负权环的有向图或无向图,在算法竞赛中应用广泛。 (2)SPFA …

2026/9/30 2:46:33

GCC 参数记不住?这份语法速查 + 多参数组合示例,收藏就够

代码写得没问题,一编译却蹦出一堆 undefined reference to xxx。改了半天,最后发现是命令里库的顺序写反了。今天把 GCC 语法、核心参数、多参数组合,以及最容易踩的链接顺序坑,一篇讲清。 一、gcc 基本语法 一条 gcc 命令长这样…

2026/9/30 2:41:33

Java中toString()方法的正确使用技巧

咱们来详细说说在Java这玩意儿里面括号括起来的那个方法到底是怎么回事儿, 还有为啥这么重要的道理。在 Java 开发中,() 是我们最常用的方法之一。无论是调试程序、输出日志,还是快速查看对象内容,() 方法都起到了至关重要的作用。本篇博客将…

2026/9/30 3:51:37

Model-Optimizer:大模型推理全链路分层优化实践指南

1. 项目概述:Model-Optimizer不是工具名,而是一类工程实践的统称 “Model-Optimizer”这个词在当前技术社区里常被误认为是一个具体软件或开源项目——比如有人搜“Model-Optimizer下载”“Model-Optimizer GitHub”,结果却找不到官方仓库。…

2026/9/30 3:51:37

SFINAE 机制全解析:从 enable_if 到 void_t 的模板实战

有些话说在前头:模板编程里最让人上头的部分,多半不是怎么把类型算出来,而是怎么让编译器“在你不想要的时候别报错,在你想选的时候刚好选对”。SFINAE 就是这一整套把戏的核心发动机。如果你玩 C 模板玩到一定阶段,一…

2026/9/30 3:51:37

大模型推理加速工程实践:TensorRT与vLLM协同部署指南

1. 项目概述:Model-Optimizer不是工具名,而是工程范式的代号“Model-Optimizer”这个标题乍看像某个开源库或GUI软件的名称,但结合NVIDIA、TensorRT-LLM、vLLM、PT文件转换、Docker镜像部署等高频热词,它实际指向的是一整套面向生…

2026/9/30 3:51:37

TensorFlow 2024实战:安装避坑、Keras 3与模型部署全流程

2024年聊起TensorFlow,注定不是一句"PyTorch已经赢了"能概括的。过去一年我在好几个生产项目里来回切换框架,发现一个特别有意思的错位:社交媒体上讨论最多的永远是PyTorch生态、LoRA微调、扩散模型,可当我拉开服务器上…

2026/9/30 3:51:37

自动化脚本实战指南:从Shell到UI、接口与CI部署

这些搜索词扔给我的一瞬间,我基本就明白了——问“自动化与脚本”的人,十个里有八个不是想听理论,而是正被某个具体的活儿追着跑:要么是测试任务重复到吐,要么是部署流程卡得人想骂人,再要么就是成天在不同…

2026/9/30 3:46:37

模型优化实战:从ONNX到TensorRT的量化、剪枝与部署加速指南

算力需求暴涨、落地 deadline 卡得死死的——“模型是训出来了,但根本跑不动”这种话我这两年听了太多。模型结构和训练效果只是第一步,真正考验工程能力的,是把一个训练好的模型安全、高效、低损耗地塞进生产环境。就在这个环节,…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑