spring官宣接入deepseek,真的太香了~
写在前面
经常逛Spring官网(https://docs.spring.io/spring-ai/reference/api/chat/deepseek-chat.html)的小伙伴会发现,
Spring 已经支持接入DeepSeek了。

DeepSeek AI provides the open-source DeepSeek V3 model, renowned for its cutting-edge reasoning and problem-solving capabilities.
Spring AI integrates with DeepSeek AI by reusing the existing OpenAI client. To get started, you’ll need to obtain a DeepSeek API Key, configure the base URL, and select one of the supported models.
翻译过来就是
DeepSeek AI提供了开源的DeepSeek V3模型,该模型以其先进的推理和解决问题的能力而闻名。
Spring AI通过与现有OpenAI客户端复用的方式与DeepSeek AI集成。
要接入DeepSeek,您需要获取一个DeepSeekAPI的API KEY,配置接入地址,并选择一种模型即可
一、调用效果
二、Spring AI 与 DeepSeek 的集成背景
不管是Spring 官网还是DeepSeek API 文档(https://api-docs.deepseek.com/zh-cn/)中都提到 DeepSeek API 使用与 OpenAI 兼容的 API 格式。

所以,我们只需要照抄接入ChatGpt的就可以了~ 而与ChatGPT 或者其他大模型对接是通过Spring AI 来完成的。
Spring AI 是什么呢?
Spring AI 是 Spring 生态中的一个新兴项目,旨在为 Java 集成各类 AI模型提供统一的抽象层。
它通过隐藏底层模型的实现细节,让开发者能够以最少的代码调用各种 AI 服务。
目前,Spring AI 已经支持OpenAI、Azure AI、Hugging Face 等多个 AI 平台,而 DeepSeek 的加入进一步丰富了其功能
三、Java 接入DeepSeek步骤
3.1 获取API KEY
首先,我们需要到DeepSeek 开发平台(https://platform.deepseek.com/api_keys)申请API KEY

这是使用 DeepSeek 服务的关键凭证,必须妥善保管。不要与他人共享你的 API key,或将其暴露在浏览器或其他客户端代码中
3.2 创建spring boot 项目
通过 Spring Initializr 创建一个新的项目

3.3 添加依赖
在 pom.xml 文件中,添加 Spring AI 的依赖。目前,Spring AI 通过 OpenAI 客户端与 DeepSeek 集成,因此需要引入以下依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
3.4 配置 DeepSeek API
在 application.properties 或 application.yml 文件中,配置 DeepSeek 的 API 密钥和请求 URL
deepseek-chat模型已全面升级为 DeepSeek-V3,接口不变。 通过指定model='deepseek-chat'即可调用 DeepSeek-V3。deepseek-reasoner是 DeepSeek 最新推出的推理模型 DeepSeek-R1。通过指定model='deepseek-reasoner',即可调用 DeepSeek-R1。
spring:
ai:
openai:
api-key: sk-your-deepseek-key-here
base-url: https://api.deepseek.com
chat:
options:
model: deepseek-reasoner
3.5 编写接口
@RestController
@RequestMapping("/ai")
public class DeepSeekController {
private final ChatClient chatclient;
// 构造方法,用于构造chatclient 实列
public DeepSeekController (ChatClient.Builder chatClientBuilder){
this.chatclient =chatClientBuilder.build();
}
@GetMapping("/chat")
public String chat(@RequestParam(value = "message") String message) {
return chatclient.prompt(message).call().content();
}
}
3.6 测试一下
启动项目,浏览器中 http://localhost:8080/ai/chat?message=对话内容 按照这个格式即可与deepseek对话
① 讲一个笑话

② 请用Java写一段线程安全的单例模式,并故意埋三个常见错误

③ 简单介绍下程序员晓凡是谁?

四、调用本地部署的DeepSeek
在之前的文章中,已经手把手教小伙伴如何使用ollama将DeepSeek 部署到自己电脑上。
使用该方法部署算是最简单的一种部署方式了,忘记了的小伙伴,可以点击下面链接复习一下~
4.1 ollama 常用命令
我们需要简单知道下ollama 的常用命令,方便我们启停本地大模型
① 查看ollama 版本信息
ollama -v
② 启动ollama服务
ollama serve
③ 查看正在运行的大模型
ollama ps
④ 查看本地大模型列表
ollama list
⑤ 运行大模型
# deepseek-r1:8b 为大模型版本号
# 如果本地不存在该模型,会先拉取
ollama run deepseek-r1:8b
⑥ 删除模型
ollama rm 模型名称
⑦ 停止运行模型
ollama stop
4.2 启动大模型
首先,按照上面的命令启动本地安装的大模型,
ollama ps确认大模型正在运行中

大模型启动之后会占用11434 端口,开放的接口地址是:http://localhost:11434/api/chat
我们可以先通过postman 调用试试
入参如下:
{
"model": "deepseek-r1:8b",
"messages": [
{"role": "user", "content": "用中文解释量子计算原理"}
],
"stream": false,
"options": {
"temperature": 0.7,
"num_ctx": 4096
}
}

4.3 Java项目中调用本地大模型
① 添加依赖
我们这里是同过ollama部署的
deepseek,所以要添加如下依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
② 配置 DeepSeek API
在 application.properties 或 application.yml 文件中,配置 DeepSeek 的请求 URL及模型
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
model: deepseek-r1:8b # 本地部署的大模型
③编写接口
为了模仿官方
deepseek对话模型,这里接口书写方式我们采用流式输出方式
@RestController
@RequestMapping("/ai")
@CrossOrigin(origins = "*")
public class DeepSeekController {
private static final Logger logger = LoggerFactory.getLogger(DeepSeekController.class);
private final ChatClient chatclient;
public DeepSeekController(ChatClient.Builder chatClientBuilder) {
this.chatclient = chatClientBuilder.build();
}
@GetMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE + ";charset=UTF-8")
public ResponseEntity<Flux<String>> chat(@RequestParam(value="message") String message) {
try {
Flux<String> response = chatclient.prompt(message).stream().content();
// 打印响应数据
response.subscribe(data -> logger.info("Response data: {}", data));
return ResponseEntity.ok()
.contentType(MediaType.TEXT_EVENT_STREAM) // 设置内容类型为文本事件流
.header(HttpHeaders.CONTENT_ENCODING, "utf-8") // 设置字符编码
.body(response);
} catch (Exception e) {
return ResponseEntity.badRequest().build();
}
}
}
④ 测试
为了演示流式数据输出调用,晓凡用
element-ui+vue仿照微信聊天界面写了一个简单调用页面,效果如下所示

五、代码下载
以上涉及到的demo 晓凡已经将代码上传到gitee,感兴趣的小伙伴可以
gitee: https://gitee.com/xiezhr/deepseek-chat-demo.git

本期内容到这儿就结束了,希望对您有所帮助!
我们下期再见 ヾ(•ω•`)o (●'◡'●)
spring官宣接入deepseek,真的太香了~的更多相关文章
- Spring官宣网传大漏洞,并提供解决方案
Spring沦陷了!这样的标题这几天是不是看腻了?然而,仔细看看都是拿着之前的几个毫不相干的CVE来大吹特吹.所以,昨天发了一篇关于最近网传的Spring大漏洞的文章,聊了聊这些让人迷惑的营销文.以及 ...
- Spring 官宣发布 Spring Boot 3.0 第一个里程碑 M1,从 Java 8 提升到 Java 17!
Spring官方于2022年1月20日发布Spring Boot 3.0.0-M1版本,预示开启了Spring Boot 3.0的里程碑,相信这是通往下一代Spring框架的激动人心的旅程. 接下来一 ...
- NullPointerException的处理新方式,Java14真的太香了
在Java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上Bug,让你的绩效考核拿到3.25.最近新出的Java14,相信大家都有所耳闻,那么今天就来看看,面对NullPoint ...
- 看了 Spring 官网脚手架真香,也撸一个 SpringBoot DDD 微服务的脚手架!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么我们要去造轮子? 造轮子的核心目的,是为了解决通用共性问题的凝练和复用. 虽然 ...
- 微信清理H5真的太早了?这会是应用号发布的前兆吗
三少爷的剑 2016-04-18 21:05 收藏35 评论7 两天之内,整个 H5 游戏创业陷入了两年狂热期以来最冷的冰点. 每一个正在忙于 H5 小游戏开发的开发者都在忙于砍掉游戏代码中有关 ...
- spring官方文档中文版
转 http://blog.csdn.net/tangtong1/article/details/51326887 spring官方文档:http://docs.spring.io/spring/do ...
- 官宣 ! 52abp_Pro版本低调上线
上线了 官宣!官宣!官宣! 重要的事情说三次. 是的,你没有看错 https://www.52abp.com/ 的官方企业模板:52abp-pro已经正式上线. 至此52abp.com的官方网站就算告 ...
- 转 spring官方文档中文版
转 http://blog.csdn.net/tangtong1/article/details/51326887另附码云地址 https://gitee.com/free/spring-framew ...
- Spring官网阅读(十八)Spring中的AOP
文章目录 什么是AOP AOP中的核心概念 切面 连接点 通知 切点 引入 目标对象 代理对象 织入 Spring中如何使用AOP 1.开启AOP 2.申明切面 3.申明切点 切点表达式 excecu ...
- 干掉visio,这个画图神器太香了
前言 看过我以往文章的小伙伴可能会发现,我的大部分文章都有很多配图.我的文章风格是图文相结合,更便于大家理解. 最近有很多小伙伴发私信问我:文章中的图是用什么工具画的.他们觉得我画的图风格挺小清新的, ...
随机推荐
- 一套以用户体验出发的.NET8 Web开源框架
前言 今天大姚给大家分享一套以用户体验出发的.NET8 Web开源框架:YiFramework. 项目介绍 YiFramework是一个基于.NET8 + Abp.vNext + SqlSugar 的 ...
- Python 2.7 十六进制字符数组 转 字符串 (字符是Unicode字符)
有一串十六进制数据,是Uncode字符. import struct strhex='003100310031' buf = strhex.decode("hex") value= ...
- ArkTs布局入门05——栅格布局(GridRow/GridCol)
1.概述 栅格布局是一种通用的辅助定位工具,对移动设备的界面设计有较好的借鉴作用.主要优势包括: 提供可循的规律:栅格布局可以为布局提供规律性的结构,解决多尺寸多设备的动态布局问题.通过将页面划分为等 ...
- Java 提取字符串中xml格式内容
@ 目录 前言 简介 总结 前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i. 提示:以下是本篇文章正文内容,下面案例可供参考 简介 在Java中,使用正则表达式来提取字符串中的XML格 ...
- HikariCP不断打印WARN日志Failed to validate connection com.mysql.jdbc.JDBC4Connection@xxxxx (...) Possibly consider using a shorter maxLifetime value.
最终解决方案(结论) maxLifeTime参数需要设置为小于min(数据库的wait_timeout,HA代理的超时时间,其他代理的超时时间);也就是说maxLifeTime不仅要像HikariCP ...
- Consul 命令(CLI)
Consul通过一个非常简单易用的命令行界面(CLI)进行控制.Consul只是一个单一的命令行应用程序:Consul. 然后,这个应用程序将取代诸如" agent"或" ...
- Tesseract开源的OCR工具及python pytesseract安装使用
一 .介绍 Tesseract是一款由Google赞助的开源OCR. pytesseract是python包装器,它为可执行文件提供了pythonic API. Tesseract 已经有 30 年历 ...
- 这可能是国内Qt/C++界最受欢迎开源项目之一/5.8Kstar/持续迭代更新
一.前言 本项目大概在2020年开始的,大概在2022年重写了一遍,主要是分门别类存放.本项目主要是QWidget编写的一些开源的demo,支持Qt4.Qt5.Qt6,支持任意系统,预计会有100多个 ...
- Qt编写的项目作品33-斗图神器(雨田哥作品)
一.功能特点 支持HTTP,HTTPS网络表情图片下载,本地缓存. 采用MV模式,支持大量图片表情预览查看. 采用多线程异步下载图片刷新. 图片搜索功能(因网络提供API无信息字段提供,占搜索不了.但 ...
- SuperMap Objects中如何正确获取选择Selection以及提示“遇到一个未知错误,请重新打开窗口。ErrorMessage:尝试读取或写入受保护的内存。这通常指示他内存已损坏”
之前有一个项目中,首先在主线程(即UI线程)中通过Query()选择所需要的点几何对象记录集,然后将记录集转换为选择集,再刷新地图,从而实现将点几何对象选择并高亮显示的效果.随后通过另外一个工作线程在 ...