写在前面

经常逛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,您需要获取一个DeepSeekAPIAPI 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 AISpring 生态中的一个新兴项目,旨在为 Java 集成各类 AI模型提供统一的抽象层。

它通过隐藏底层模型的实现细节,让开发者能够以最少的代码调用各种 AI 服务。

目前,Spring AI 已经支持OpenAIAzure AIHugging 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.propertiesapplication.yml 文件中,配置 DeepSeekAPI 密钥和请求 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

在之前的文章中,已经手把手教小伙伴如何使用ollamaDeepSeek 部署到自己电脑上。

使用该方法部署算是最简单的一种部署方式了,忘记了的小伙伴,可以点击下面链接复习一下~

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.propertiesapplication.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,真的太香了~的更多相关文章

  1. Spring官宣网传大漏洞,并提供解决方案

    Spring沦陷了!这样的标题这几天是不是看腻了?然而,仔细看看都是拿着之前的几个毫不相干的CVE来大吹特吹.所以,昨天发了一篇关于最近网传的Spring大漏洞的文章,聊了聊这些让人迷惑的营销文.以及 ...

  2. 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框架的激动人心的旅程. 接下来一 ...

  3. NullPointerException的处理新方式,Java14真的太香了

    在Java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上Bug,让你的绩效考核拿到3.25.最近新出的Java14,相信大家都有所耳闻,那么今天就来看看,面对NullPoint ...

  4. 看了 Spring 官网脚手架真香,也撸一个 SpringBoot DDD 微服务的脚手架!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么我们要去造轮子? 造轮子的核心目的,是为了解决通用共性问题的凝练和复用. 虽然 ...

  5. 微信清理H5真的太早了?这会是应用号发布的前兆吗

    三少爷的剑  2016-04-18 21:05 收藏35 评论7   两天之内,整个 H5 游戏创业陷入了两年狂热期以来最冷的冰点. 每一个正在忙于 H5 小游戏开发的开发者都在忙于砍掉游戏代码中有关 ...

  6. spring官方文档中文版

    转 http://blog.csdn.net/tangtong1/article/details/51326887 spring官方文档:http://docs.spring.io/spring/do ...

  7. 官宣 ! 52abp_Pro版本低调上线

    上线了 官宣!官宣!官宣! 重要的事情说三次. 是的,你没有看错 https://www.52abp.com/ 的官方企业模板:52abp-pro已经正式上线. 至此52abp.com的官方网站就算告 ...

  8. 转 spring官方文档中文版

    转 http://blog.csdn.net/tangtong1/article/details/51326887另附码云地址 https://gitee.com/free/spring-framew ...

  9. Spring官网阅读(十八)Spring中的AOP

    文章目录 什么是AOP AOP中的核心概念 切面 连接点 通知 切点 引入 目标对象 代理对象 织入 Spring中如何使用AOP 1.开启AOP 2.申明切面 3.申明切点 切点表达式 excecu ...

  10. 干掉visio,这个画图神器太香了

    前言 看过我以往文章的小伙伴可能会发现,我的大部分文章都有很多配图.我的文章风格是图文相结合,更便于大家理解. 最近有很多小伙伴发私信问我:文章中的图是用什么工具画的.他们觉得我画的图风格挺小清新的, ...

随机推荐

  1. 2024-12-14:K 周期字符串需要的最少操作次数。用go语言,给定一个长度为n的字符串 word 和一个整数k,k是n的因数。每次操作可以选择两个下标i和j,使得i和j都可以被k整除,然后用从j

    2024-12-14:K 周期字符串需要的最少操作次数.用go语言,给定一个长度为n的字符串 word 和一个整数k,k是n的因数.每次操作可以选择两个下标i和j,使得i和j都可以被k整除,然后用从j ...

  2. 大咖论道|金融AI下一阶段的发展思考

    回顾过去十年,人工智能(AI)技术的发展速度让人惊叹,金融行业是现今AI应用最具潜力和最为活跃的领域之一.通过多年渗透,AI不间断从技术驱动迈向场景驱动,已广泛与金融业务深度融合,衍生出众多新业态.新 ...

  3. Jackson ObjectMapper - 指定对象属性的序列化顺序

    注释很有用,但在任何地方应用起来都会很痛苦.您可以配置整个 ObjectMapper 以这种方式工作 当前杰克逊版本: objectMapper.configure(MapperFeature.SOR ...

  4. macOS 终端可用的 Hex 查看与编辑器

    在 Windows 下我们可以使用 WinHex,而在 macOS 平台上,有什么不错的十六进制查看器.编辑器呢? 准备首先,我们创建一个文件用于测试. echo 'welcome' > fil ...

  5. Mac netstat 查看端口报错 netstat: option requires an argument -- p 解决

    netstat -anvp |grep 10001 查询端口的时候报错提示 意思是缺少协议. 解决方案在Mac上正确使用的方法是:即-f需要加上地址族,-p需要加上协议TCP或者UDP等 a)如果需要 ...

  6. [转]Windows10+VS2013+OpenCV3.0开发环境搭建配置

    首先要说明一下:不管VS(Visual Studio)的版本是什么,也不管OpenCV的版本是什么,配置都大同小异.所以如果您希望在Window下配置OpenCV的开发环境,那么仔细阅读学习这篇文章即 ...

  7. 如何查看一个域名所对应的IP地址?

    具体步骤如下: 1.点击电脑左下角开始菜单,打开"运行"选项. 2.然后输入"cmd"并打开. 3.在弹出的页面输入ping+你想要查看的域名,比如新浪网,pi ...

  8. 查询 maven 依赖 的最新版本号

    如何通过maven官网查询相关依赖的具体代码和版本? 通过官网:http://mvnrepository.com/,或者:https://search.maven.org/ 在搜索栏中输入想要引入的依 ...

  9. [转]Java Swing组件编程之JTable表格用法实例详解

    原文链接: Java Swing组件编程之JTable表格用法实例详解

  10. 浅谈网页端IM技术及相关测试方法实践(包括WebSocket性能测试)

    本文由转转QA赵里京分享,原题"浅谈IM与相关测试方法",下文进行了排版和内容优化. 1.引言 目前转转的所有业务都在快速增长,支撑其用户服务的客服系统也同样在快速发展,以承接用户 ...