spring官宣接入deepseek,真的太香了~

news/2025/2/24 21:19:50/文章来源:https://www.cnblogs.com/xiezhr/p/18734902

写在前面

经常逛Spring官网(https://docs.spring.io/spring-ai/reference/api/chat/deepseek-chat.html)的小伙伴会发现,

Spring 已经支持接入DeepSeek了。

官宣接入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,配置接入地址,并选择一种模型即可

一、调用效果

https://live.csdn.net/v/465047

二、Spring AI 与 DeepSeek 的集成背景

不管是Spring 官网还是DeepSeek API 文档(https://api-docs.deepseek.com/zh-cn/)中都提到 DeepSeek API 使用与 OpenAI 兼容的 API 格式。

与OpenAPI兼容的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

申请api key

这是使用 DeepSeek 服务的关键凭证,必须妥善保管。不要与他人共享你的 API key,或将其暴露在浏览器或其他客户端代码中

3.2 创建spring boot 项目

通过 Spring Initializr 创建一个新的项目

创建springboot 项目

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-herebase-url: https://api.deepseek.comchat: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写一段线程安全的单例模式,并故意埋三个常见错误

请用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 }
}

postman 调用本地大模型

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:11434chat: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

gitee地址

本期内容到这儿就结束了,希望对您有所帮助!

我们下期再见 ヾ(•ω•`)o (●'◡'●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889204.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

离线环境安装nodejs及npm库i5ting_toc(超详细,手把手教学一通百通)

一、离线环境先安装nodejs 1、在可联网的电脑上下载特定版本的 Node.js:访问 Node.js 官方下载页面(https://nodejs.org/download/release/)。 选择您需要的版本,下载适合您服务器操作系统的二进制文件(通常是 tar.gz 或 zip 2、将下载的文件传输到服务器上。用文件传输…

P2085 最小函数值——小顶堆、贪心、重载运算符

题目描述 有 \(n\) 个函数,分别为 \(F_1,F_2,\dots,F_n\)。定义 \(F_i(x)=A_ix^2+B_ix+C_i(x\in\mathbb N*)\)。给定这些 \(A_i\)、\(B_i\) 和 \(C_i\),请求出所有函数的所有函数值中最小的 \(m\) 个(如有重复的要输出多个)。 输入格式 第一行输入两个正整数 \(n\) 和 \(m\…

Chapter1

Chapter 1 Introduction 引言数据库管理系统(DataBase Management System, DBMS) 互相关联的数据集合和一组用以访问这些数据的程序组成。 提供方便,高效的存取数据信息。1.1 应用联机事务处理。(online transaction processing)大量用户使用数据库,每个用户检索相对少量的数…

0224

关于中州养老入住办理的业务分析 1.原型如下如上可以将入住办理的业务总体看为5个表格,总体分为两部分: ​ 1:所有老人入住详情表:>1. 搜索:老人姓名为模糊搜索,老人身份证号为精准搜索;>2. 列表数据:列表中所展示的数据是入住成功且未退住的老人信息>3. 发起入住…

生成式AI之旅

还记得ChatGPT刚出来时,体验后的感觉是:知识渊博,无所不通;智慧在线,逻辑清晰,简直可以用“高端,大气,上档次”形容,但也不失“低调,奢华,有内涵”。使用GPT经历过几个阶段:最开始是娱乐阶段:以聊天,写诗之类为主;之后经历了漫长的搜索引擎阶段:搜索知识点,技…

2025省选模拟15

2025省选模拟15\(T1\) P1045. 数 \(100pts\)原题: SP6408 KKKCT2 - Counting Triangles 2 | SP5464 CT - Counting triangles考虑枚举直角顶点 \((i,j),0 \le i \le x,0 \le j \le y\),然后分为了 \(8\) 种贡献情况。设 \(\begin{cases} a=\min(i,y-j) \\ b=\min(x-i,j) \\ c…

独立开发之五个月干到4万$+

写文章的起因 本来在群里跟大伙聊天的时候,然后就聊产品终于赚钱,我说要不我写个小册或者出个课把,就写我们这种穷逼独立开发怎么做产品变现,然后我认真想了一下可能我花1个月写小册的时间的性价比不是很高。 然后本来这个话题都完结了,有小伙伴就私聊我,直接发了我个红包…

Prompt入门

Prompt,,提示词,是使用生成式AI的必备前提,好的提示词能让生成式AI给出更精准的结果,不仅能节省时间,还能节省tokens(这可是美金呀),所以在生成式AI出来后,就有Prompt Engineer提示工程师之说。于是,就有很多分享提示的文章,还有很多网站,专门收集各种场合的提示词…

SEO完全指南 从原理到实战的搜索引擎优化手册 第三章SEO与内容优化

第三章:SEO与内容 1. 基于算法的内容优化策略 搜索引擎算法的主要目标是为用户提供最相关、最有价值的内容。这些算法使用复杂的机器学习模型来理解和评估网页内容。它们考虑多个因素,包括关键词的使用、内容的深度和质量、用户交互数据以及网站的整体结构和权威性。要在搜索…

【攻防世界】CatchCat

上网一查发现是GPS数据文件 到这个GPS绘图网址上传.txt文件即可 还有一种方法,先转为KML文件txt2kml网址kml绘图

智能化客户行为轨迹分析:AI视频监控在大型商场的技术方案介绍(part7)

项目背景:为了提升顾客体验并支持精准营销,卖场或商场需要通过智能化手段分析客户在商场内的行为路线。一、具体需求 1、行为路径分析:跟踪顾客在商场内的移动轨迹,了解顾客的购物习惯和偏好。 2、高频活动区域识别:通过分析顾客停留和活动频率,识别出顾客聚集的区域。 3…

在Android源码中为APK编译系统权限

在Android源码中为APK编译系统权限,授权使用 android:sharedUserId="android.uid.system" 系统权限,可以在Android开发中授予更多功能,以瑞芯微3568平台为例系统权限获取 打包为APK进行系统签名对于 部分功能的访问需要使用到系统权限,需要 添加 android:shared…