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

Spring 项目接入 DeepSeek,分享两种超简单的方式!

⭐自荐一个非常不错的开源 Java 面试指南:JavaGuide (Github 收获148k Star)。这是我在大三开始准备秋招面试的时候创建的,目前已经持续维护 6 年多了,累计提交了 5600+ commit ,共有 550+ 多位贡献者共同参与维护和完善。

DeepSeek 作为一款卓越的国产 AI 模型,越来越多的公司考虑在自己的应用中集成。对于 Java 应用来说,我们可以借助 Spring AI 集成 DeepSeek,非常简单方便!

相关文章推荐:

  • DeepSeek 的这波回答我给满分!
  • IDEA 接入 DeepSeek,太酷了!

Spring AI 是什么?

Spring AI 从著名的 Python 项目(例如 LangChain 和 LlamaIndex)中汲取灵感,解决了 AI 集成中的核心挑战:将企业数据和 API 与 AI 模型连接起来。

你可以将 Spring AI 看作是一个适配器或者高层封装,用来帮你更方便地集成和使用不同的 AI 模型。它的核心目标是简化开发流程,降低使用多种 AI 服务时的复杂性,同时提升代码的可维护性和灵活性。

Spring AI 的主要功能包括:

  • 统一 API: Spring AI 提供了一套统一的接口,用来调用不同的 AI 模型(例如 OpenAI、Hugging Face、DeepSeek、Gemini 等)。开发者只需要学习 Spring AI 的 API,就能无缝对接各种 AI 服务,而无需深入了解各家服务的底层实现和差异。
  • 简化配置: Spring AI 提供了自动化的配置管理,例如 API 密钥、模型参数等。你只需要简单地在配置文件中定义所需的参数,Spring AI 就会自动完成初始化和连接,避免繁琐的手动配置。
  • 易于切换: Spring AI 的抽象设计使得更换 AI 提供商变得非常简单。开发者只需要修改少量配置,而不用修改业务代码,从而实现灵活的 AI 服务切换,适应不同场景需求。

Spring AI 集成 DeepSeek

这里介绍两种方式:

  1. spring-ai-openai starter:伪装成 OpenAI,DeepSeek 提供了 OpenAI 兼容模式。
  2. spring-ai-ollama-spring-boot-starter:通过 Ollama 本地部署一个 DeepSeek R1 蒸馏版。

伪装成 OpenAI

DeepSeek 其实提供了 OpenAI 兼容模式,只要在请求头里加个api_key,就能假装自己在调 OpenAI。Spring AI 的 openai starter 本质上是通过 RestTemplate 发请求,我们只需要改改 URL 和认证方式。

1、添加依赖:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>0.8.1</version>
</dependency>

2、修改配置文件 application.yml

spring:ai:openai:base-url: https://api.deepseek.com/v1  # DeepSeek的OpenAI式端点api-key: sk-your-deepseek-key-herechat.options:model: deepseek-chat  # 指定DeepSeek的模型名称

3、DeepSeek API KEY 可以在 DeepSeek 开放平台中自行创建,地址:https://platform.deepseek.com/api_keys

4、在代码中调用:

@RestController
@RequestMapping("/ai")
@Slf4j
public class ChatController {private final ChatClient chatClient;// 构造方法注入 ChatClient.Builder,用于构建 ChatClient 实例public ChatController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}@GetMapping("/chat")public String generate(@RequestParam(value = "message") String message) {log.info("Generating response");// 调用 ChatClient 的 prompt 方法生成响应// 1. prompt(message): 创建一个包含用户输入消息的 Prompt 对象// 2. call(): 调用 ChatClient 与 AI 模型交互以获取响应// 3. content(): 提取响应的内容部分return chatClient.prompt(message).call().content();}}

在运行时,你可以通过在 Prompt 调用中添加新的、针对请求的选项来覆盖默认配置。例如,要为特定请求覆盖默认模型和温度,可以这样实现:

ChatResponse response = chatModel.call(new Prompt("Generate the names of 5 famous pirates.",OpenAiChatOptions.builder().withModel("deepseek-chat").withTemperature(0.4).build()));

本地化部署

如果想要把 DeepSeek 部署在内网服务器,或者你想在本地跑个小模型,可以采用这种方式来在本地部署一个 DeepSeek R1 蒸馏版。

1、从官方网站下载并安装 Ollama:https://ollama.com

Ollama 可以让你轻松在自己的电脑上运行各种强大的 AI 模型,就像运行普通软件一样简单。

2、通过 Ollama 拉取 DeepSeek 模型:

ollama pull deepseek-r1:1.5b
ollama list deepseek

更多版本可以在这里查看:https://ollama.com/library/deepseek-r1

3、添加依赖:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId><version>0.8.1</version>
</dependency>

4、修改配置:

spring:ai:ollama:base-url: http://localhost:11434chat:model: deepseek-r1:1.5b  # 与本地模型名称对应

4、在代码中调用:

@RestController
@RequestMapping("/ai")
public class ChatController {private final ChatClient chatClient;// 构造方法注入 ChatClient.Builder,用于构建 ChatClient 实例public ChatController(ChatClient.Builder chatClient) {this.chatClient = chatClient.build();}@GetMapping("/chat")public ResponseEntity<Flux<String>> chat(@RequestParam(value = "message") String message) {try {// 调用 ChatClient 生成响应,并以 Flux<String>(响应流)形式返回Flux<String> response = chatClient.prompt(message).stream().content();return ResponseEntity.ok(response);} catch (Exception e) {return ResponseEntity.badRequest().build();}}
}

Spring Cloud Alibaba AI 中也支持这种方式,并且官网上提供了详细的方法:https://java2ai.com/blog/spring-ai-alibaba-ollama-deepseek/

总结

这篇文章主要介绍了 Spring AI 以及如何通过 Spring AI 集成 DeepSeek:

  1. 伪装成 OpenAI: DeepSeek 可以假装自己是 OpenAI,直接用 Spring AI 的 OpenAI starter 就行,改改配置就好,就像换个链接一样简单。
  2. 本地部署: 如果你想把 DeepSeek 放在自己服务器上,或者想在电脑上跑个小模型玩玩,可以用 Ollama。先下载 Ollama,再下载 DeepSeek 模型,然后用 Spring AI 的 Ollama starter,也超级简单。Spring Cloud Alibaba AI 也支持这种玩法,官网有教程。

相关文章:

Spring 项目接入 DeepSeek,分享两种超简单的方式!

⭐自荐一个非常不错的开源 Java 面试指南&#xff1a;JavaGuide &#xff08;Github 收获148k Star&#xff09;。这是我在大三开始准备秋招面试的时候创建的&#xff0c;目前已经持续维护 6 年多了&#xff0c;累计提交了 5600 commit &#xff0c;共有 550 多位贡献者共同参与…...

docker 进阶命令(基于Ubuntu)

数据卷 Volume: 目录映射, 目录挂载 匿名绑定: 匿名绑定的 volume 在容器删除的时候, 数据卷也会被删除, 匿名绑定是不能做到持久化的, 地址一般是 /var/lib/docker/volumes/xxxxx/_data 绑定卷时修改宿主机的目录或文件, 容器内的数据也会同步修改, 反之亦然 # 查看所有 vo…...

机器学习数学基础:29.t检验

t检验学习笔记 一、t检验的定义和用途 t检验是统计学中常用的假设检验方法&#xff0c;主要用于判断样本均值与总体均值间&#xff0c;或两个样本均值间是否存在显著差异。 在实际中应用广泛&#xff0c;例如在医学领域可用于比较两种药物的疗效&#xff1b;在教育领域&…...

HarmonyNext上传用户相册图片到服务器

图片选择就不用说了&#xff0c;直接用 无须申请权限 。 上传图片&#xff0c;步骤和android对比稍微有点复杂&#xff0c;可能是为了安全性考虑&#xff0c;需要将图片先拷贝到缓存目录下面&#xff0c;然后再上传&#xff0c;当然你也可以转成Base64&#xff0c;然后和服务…...

WebAssembly 3.0发布:浏览器端高性能计算迎来新突破!

“WebAssembly 3.0来了&#xff0c;浏览器端的高性能计算将彻底改变&#xff01;”2025年&#xff0c;WebAssembly&#xff08;Wasm&#xff09;迎来了重大更新——WebAssembly 3.0正式发布。这次更新不仅支持多线程和SIMD指令集&#xff0c;还优化了内存管理&#xff0c;让浏览…...

计算机组成原理—— 外围设备(十三)

记住&#xff0c;伟大的成就往往诞生于无数次尝试和失败之后。每一次跌倒&#xff0c;都是为了让你学会如何更加坚定地站立&#xff1b;每一次迷茫&#xff0c;都是为了让你找到内心真正的方向。即使前路漫漫&#xff0c;即使困难重重&#xff0c;心中的火焰也不应熄灭。它代表…...

面试题之Vuex,sessionStorage,localStorage的区别

Vuex、localStorage 和 sessionStorage 都是用于存储数据的技术&#xff0c;但它们在存储范围、存储方式、应用场景等方面存在显著区别。以下是它们的详细对比&#xff1a; 1. 存储范围 Vuex&#xff1a; 是 Vue.js 的状态管理库&#xff0c;用于存储全局状态。 数据存储在内…...

window中git bash使用conda命令

window系统的终端cmd和linux不一样&#xff0c;运行不了.sh文件&#xff0c;为了在window中模仿linux&#xff0c;可以使用gui bash模拟linux的终端。为了在gui bash中使用python环境&#xff0c;由于python环境是在anaconda中创建的&#xff0c;所以需要在gui bash使用conda命…...

象棋掉落动画(局部旋转动画技巧)

1.被撞击阶段&#xff1a;根据被撞击速度&#xff0c;合理设置被撞距离 2.倒地阶段&#xff1a;象棋倒地的同时稍微前移 3.滚地阶段&#xff1a;象棋滚地后停止&#xff0c;在最后5帧内稍微回转一下。这里启用“PRS参数”的旋转来制作局部旋转动画...

Pycharm 2024在解释器提供的python控制台中运行py文件

2024版的界面发生了变化, run with python console搬到了这里:...

课题推荐:高空长航无人机多源信息高精度融合导航技术研究

高空长航无人机多源信息高精度融合导航技术的研究&#xff0c;具有重要的理论意义与应用价值。通过深入研究多源信息融合技术&#xff0c;可以有效提升无人机在高空复杂环境下的导航能力&#xff0c;为无人机的广泛应用提供强有力的技术支持。希望该课题能够得到重视和支持&…...

《DeepSeek训练算法:开启高效学习的新大门》

在人工智能的浪潮中&#xff0c;大语言模型的发展日新月异。DeepSeek作为其中的佼佼者&#xff0c;凭借其独特的训练算法和高效的学习能力&#xff0c;吸引了众多目光。今天&#xff0c;就让我们深入探究DeepSeek训练算法的独特之处&#xff0c;以及它是如何保证模型实现高效学…...

promise用法总结以及手写promise

JavaScript中的 Promise 是用于处理异步操作的对象&#xff0c;它代表了一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。Promise 是异步编程的一种更简洁和更可读的方式&#xff0c;避免了回调地狱的问题。 Promise 的基本概念 一个 Promise 是一个表示异步…...

春招项目=图床+ k8s 控制台(唬人专用)

1. 春招伊始 马上要春招了&#xff0c;一个大气的项目&#xff08;冲击波项目&#xff09;直观重要&#xff0c;虽然大家都说基础很重要&#xff0c;但是一个足够新颖的项目完全可以把你的简历添加一个足够闪亮的点。 这就不得不推荐下我的 k8s 图床了&#xff0c;去年折腾快…...

Android 11.0 系统settings添加ab分区ota升级功能实现二

1.概述 在11.0的系统rom定制化开发中,在进行系统ota升级的功能中,在10.0以前都是使用系统 RecoverySystem的接口实现升级的,现在可以实现AB分区模式来进行ota升级的,但是 必须需要系统支持ab分区升级的模式才可以的,接下来分析下看怎么样进行ota升级功能实现 2.系统sett…...

【Spring+MyBatis】_图书管理系统(上篇)

目录 1. MyBatis与MySQL配置 1.1 创建数据库及数据表 1.2 配置MyBatis与数据库 1.2.1 增加MyBatis与MySQL相关依赖 1.2.2 配置application.yml文件 1.3 增加数据表对应实体类 2. 功能1&#xff1a;用户登录 2.1 约定前后端交互接口 2.2 后端接口 2.3 前端页面 2.4 单…...

什么是3D视觉无序抓取?

3D视觉无序抓取是一种结合三维视觉技术、机器人控制与智能算法的工业自动化解决方案,旨在实现机器人对散乱、无序堆放的物体进行自主识别、定位和抓取的操作。其核心是通过3D视觉系统获取物体的三维空间信息,结合路径规划与避障算法,引导机械臂完成高精度抓取任务,无需依赖…...

【Java】理解字符串拼接与数值运算的优先级

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java 文章目录 &#x1f4af;前言&#x1f4af;代码分析1. 第一句输出2. 第二句输出3. 第三句输出 &#x1f4af;关键概念与深入分析1. 字符串拼接的优先级2. 运算符的优先级与结合性3. 字符串拼接与数值运算的结合 &…...

[250217] x-cmd 发布 v0.5.3:新增 DeepSeek AI 模型支持及飞书/钉钉群机器人 Webhook 管理

目录 X-CMD 发布 v0.5.3&#x1f4c3;Changelog&#x1f9e9; deepseek&#x1f9e9; feishu|dingtalk&#x1f4e6; x-cmd✅ 升级指南 X-CMD 发布 v0.5.3 &#x1f4c3;Changelog &#x1f9e9; deepseek 新增 deepseek 模块&#xff0c;用户可通过 deepseek 直接请求使用 …...

渗透利器:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)

Burp Suite 联动 XRAY 图形化工具.&#xff08;主动扫描被动扫描&#xff09; Burp Suite 和 Xray 联合使用&#xff0c;能够将 Burp 的强大流量拦截与修改功能&#xff0c;与 Xray 的高效漏洞检测能力相结合&#xff0c;实现更全面、高效的网络安全测试&#xff0c;同时提升漏…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...