SpringAI介绍及本地模型使用方法
博客原文地址
前言
Spring在Java语言中一直稳居高位,与AI的洪流碰撞后也产生了一些有趣的”化学反应“,当然你要非要说碰撞属于物理反应也可以,
在经历了一系列复杂的反应方程后,Spring家族的新成员——SpringAI,就此诞生。
需要注意的是,springai目前仍处于试验阶段,可能会出现许多不稳定因素,希望各位使用者能放平心态面对BUG(或者去issues里发表自己的见解)
简介
Spring AI 项目为开发 AI 应用程序提供了 Spring 友好的 API 和抽象类。
其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI 领域,并将使用 POJO 作为应用程序的构建块推广到 AI 领域。
github仓库:spring-projects/spring-ai: An Application Framework for AI Engineering
目前该项目已经集成了OpenAI、Azure OpenAI、Hugging Face、Ollama等API。
我们一般对于AI类项目嵌入JAVA的做法为:
-
开发java后端和前端部分代码
-
确定功能需求,如文本生成类项目,即接收部分参数,返回一个String文本
-
确定模型主题,如BERT/T5等等
-
对模型进行训练或微调,并编写使用方法代码
-
使用web框架(如:FastAPI/Flask)开放接口,规范接参收参格式
-
java使用webclient(也可以用别的)请求接口调用AI服务
-
测试联调(你也可以选择一步一测试,都可以)
对于具体的模型对接代码可以参考我的Transformers文章中有详细的对于模型使用和训练的代码:transformer库 | ADulcimer Blog
所以SpringAI也就相当于是集合了大部分厂商的API接口,提供调用,再进行一些java适配和代码优化等等。最终也是通过接惨(文本和key等等)然后传参,被java接收
请注意:springai的API调用并不能让你在离线模式进行大模型的访问,如果你是AI开发人员,那么springai可以让你在java中离线运行本地torch或其他模型,但是相比于python还是较为局限,但如果你只是通过此技术调用大模型API,那么离线模式下是无法实现对话功能的
应该足够清楚的表明了: springAI到底是个什么技术,总结一下:
Spring AI 是一个强大的工具,适合那些已经在使用 Spring 框架的开发者,并且希望将 AI 能力集成到他们的企业级应用中。它的优势在于与 Spring 生态系统的无缝集成和企业级支持,但对于初学者或者需求较简单的 AI 项目来说,它可能过于复杂
Python开AI接口区别
SpringAI在解决复杂问题时,会比传统的AI开接口更加优秀,请注意,这里说的是复杂的业务逻辑,如果是复杂的AI功能,比如,需求不断微调,训练,或者更换模型,对模型进行更改等等等等,Python开接口的方式还是会更加灵活,如果说业务复杂,但AI需求功能单一,则使用SpringAI,如果业务逻辑简单,则都可以使用python接口的方式,因为SpringAI是一个很重的框架
1、企业级架构与可扩展性
-
Spring AI 是构建在 Spring 框架 上的,Spring 本身就是为企业级、分布式、高并发系统设计的框架。因此,如果你的需求涉及到复杂的业务逻辑、大规模的用户交互或者高可用、高并发的环境,Spring AI 提供的 可扩展性 和 可靠性 将使得系统更加稳定。
-
Spring Cloud 和 Spring Boot 等工具,使得它在微服务架构中的表现非常出色,这对于那些需求复杂的系统(如需要多个模块、服务和组件的系统)来说,是一个很大的优势。
2. 集成能力
-
Spring AI 能够无缝集成 Java 生态系统中的其他工具和技术,比如数据库、消息队列、缓存系统、认证与授权、安全等模块。如果你的系统已经在使用 Spring 框架,这使得 Spring AI 能够与现有的基础设施进行更好的集成。
-
如果需要和传统的 Java 后端服务、企业级应用 或 第三方服务(如支付、ERP 系统) 进行集成,Spring 提供的成熟的解决方案和丰富的生态系统使得这种集成更加顺畅。
3. 高并发和高可靠性
-
Spring 框架和相关工具(如 Spring Boot、Spring Cloud)具有极强的 高并发 支持和 高可用 设计。对于大规模用户请求、海量数据处理等需求,Spring 框架能够通过 多线程、异步处理、负载均衡、服务容错、分布式系统管理等技术 来确保系统的稳定性和高效运行。
-
在这些场景下,Spring AI 提供的 性能优化 和 容错机制 使得系统更加可靠,而 Python 写的模型可能需要通过额外的优化和工具来应对这些挑战。
4. 生产环境的成熟度与稳定性
-
Spring 框架已经在 生产环境 中得到了广泛的应用,尤其是在 大型企业级应用 中,具有非常高的稳定性和可靠性。Spring 提供了很多企业级功能,如 事务管理、缓存、日志记录、调试工具 等,这些功能对于复杂需求的应用至关重要。
-
对比之下,传统的 Python 接口通常更多用于 原型开发、快速部署 或 中小规模应用,虽然在灵活性和开发速度上有优势,但在大规模生产环境中的稳定性和可维护性上可能没有 Spring 那么强。
5. 安全性
-
在涉及到 敏感数据、权限管理、认证与授权 的复杂需求时,Spring 提供了丰富的 安全机制。通过 Spring Security 等工具,可以高效地管理和控制用户权限、进行身份验证、数据加密等,确保系统的安全性。
-
Python 虽然也有相关的库(如 Flask-Security、Django Security 等),但在集成和管理方面可能没有 Spring 的安全框架那么成熟和全面。
6. DevOps 支持与自动化部署
-
Spring 在 DevOps 和自动化部署方面也有很强的支持,Spring Boot 和 Spring Cloud 的集成功能使得部署、监控、日志管理和版本管理等任务更加自动化,极大地提高了运维效率。
-
Python 部署方面也可以使用 Docker、Kubernetes 等工具,但由于 Spring 提供的微服务架构和生产环境支持更加丰富,Spring AI 在大规模应用部署和运维上表现更佳。
7. 维护与支持
-
对于 大型团队 和 长期项目,Spring 框架提供了成熟的企业级支持,文档和社区也非常强大。对于一些需求复杂、时间长的项目,使用 Spring AI 可以更容易进行 长期维护 和 团队协作。
-
Python 的开发者社区虽然庞大,但在企业级开发、集成和维护方面,可能不如 Spring 框架在行业中的积淀和支持那么全面。
代码部分
根据官方文档,分为两种方式调用,一种是springboot项目,交给spring管理
参考官方文档:transforms(我们以它为例)
(ONNX)变形金刚 ((ONNX) Transformers) _ Spring AI 1.0.0-SNAPSHOT 中文文档(官方文档中文翻译) —— CADN开发者文档中心
参考maven文档:
repo.spring.io
1、Springboot管理
1、引入依赖:
<repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url><snapshots><enabled>false</enabled></snapshots></repository><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository></repositories><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-transformers-spring-boot-starter</artifactId>
</dependency>
2、编写application.yml配置文件
spring:ai:embedding:transformer:onnx:model-uri: https://huggingface.co/intfloat/e5-small-v2/resolve/main/model.onnxtokenizer:uri: https://huggingface.co/intfloat/e5-small-v2/raw/main/tokenizer.jsoncache:directory: /tmp/ai-embedding-transformerenabled: true
部分的配置详情如下:
Property
Description
spring.ai.embedding.transformer.enabled
启用 Transformer Embedding 模型。
spring.ai.embedding.transformer.tokenizer.uri
Transformer分词器地址
spring.ai.embedding.transformer.tokenizer.options
模型的一些参数,max_length这些
spring.ai.embedding.transformer.cache.enabled
是否启用缓存
spring.ai.embedding.transformer.cache.directory
缓存路径
spring.ai.embedding.transformer.onnx.modelUri
Transformers预训练模型地址
spring.ai.embedding.transformer.onnx.gpuDeviceId
GPU设备ID
这些是一些常用的,具体请参考官方文档
3、搭建controller和service层
import com.adulcimer.ai.service.ToxicityService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
class MyController {@Resourceprivate ToxicityService toxicityService;@PostMapping("/test")public String test() throws Exception {toxicityService.modelTest();return "Hello, World!";}
}import jakarta.annotation.Resource;
import org.springframework.ai.transformers.TransformersEmbeddingModel;
import org.springframework.stereotype.Service;import java.util.Arrays;@Service
public class ToxicityService {@Resourceprivate TransformersEmbeddingModel transformersEmbeddingModel;public void modelTest() throws Exception {float[] embed = transformersEmbeddingModel.embed("Hello World");System.out.println(Arrays.toString(embed));}
}
4、结果
我们已经得到模型的返回值了,成功使用springboot调用了AI模型
具体的业务逻辑也可以轻松嵌入,是不是很轻松?
2、自定义配置
当然你也可以不使用spring的管理
TransformersEmbeddingModel embeddingModel = new TransformersEmbeddingModel();embeddingModel.setTokenizerResource("classpath:/onnx/all-MiniLM-L6-v2/tokenizer.json");embeddingModel.setModelResource("classpath:/onnx/all-MiniLM-L6-v2/model.onnx");embeddingModel.setResourceCacheDirectory("/tmp/onnx-zoo");embeddingModel.setTokenizerOptions(Map.of("padding", "true"));embeddingModel.afterPropertiesSet();List<List<Double>> embeddings = this.embeddingModel.embed(List.of("Hello world", "World is big"));
然后正常使用架构搭建即可
最后
以上部分内容和图片来自于官方文档,本文中已声明原作地址。
相关文章:

SpringAI介绍及本地模型使用方法
博客原文地址 前言 Spring在Java语言中一直稳居高位,与AI的洪流碰撞后也产生了一些有趣的”化学反应“,当然你要非要说碰撞属于物理反应也可以, 在经历了一系列复杂的反应方程后,Spring家族的新成员——SpringAI,就…...

numpy广播性质
一、核心规则 一维数组本质 shape (n,)的数组是无方向向量,既非严格行向量也非列向量 自动广播机制 在矩阵乘法(或np.dot())中,一维数组会自动调整维度: 前乘时视为行向量 shape (1,n)后乘时视为列向量 shape (n,1) 二、运算类型对比 假…...

Flutter_学习记录_实现列表上下拉加载 +实现加载html的数据
1. 效果图 2. 下拉加载的实现RefreshIndicator 在Flutter官方sdk中给我们提供了下拉刷新的组件RefreshIndicator。 // 显示内容列表Widget _showNewsListWidget() {if (_newsDataList.isNotEmpty) {// RefreshIndicator 来实现下拉加载的功能return RefreshIndicator(onRefr…...

基于PaddleNLP使用DeepSeek-R1搭建智能体
基于PaddleNLP使用DeepSeek-R1搭建智能体 最近在学习DeepSeek,找到了PaddleNLP星河社区大模型,跟着敲写了一遍。内容来源:DeepSeek实战训练营:从云端模型部署到应用开发 - 飞桨AI Studio星河社区-人工智能学习与实训社区 本项目基…...

『PostgreSQL』PGSQL备份与还原实操指南
📣读完这篇文章里你能收获到 了解逻辑备份与物理备份的区别及适用场景🔍。掌握全库、指定库、指定表备份还原的命令及参数📝。学会如何根据业务需求选择合适的备份策略📊。熟悉常见备份还原问题的排查与解决方法🔧。 …...

基于单片机的智慧农业大棚系统(论文+源码)
1系统整体设计 经过上述的方案分析,采用STM32单片机为核心,结合串口通信模块,温湿度传感器,光照传感器,土壤湿度传感器,LED灯等硬件设备来构成整个控制系统。系统可以实现环境的温湿度检测,土壤…...
【C语言】数组篇
目录 引言一维数组数组的定义数组的初始化完全初始化部分初始化省略数组长度 数组元素的访问 多维数组二维数组的定义二维数组的初始化完全初始化部分初始化省略第一维长度 二维数组元素的访问 遍历数组元素遍历一维数组遍历二维数组 数组作为函数参数一维数组作为函数参数二维…...
FreeRTOS概述
文章目录 核心文件头文件内存管理文件入口函数数据类型前缀 核心文件 最核心文件:task.c和list.c 文件作用tasks.c必需,任务操作list.c必须,列表queue.c基本必需,提供队列操作、信号量(semaphore)操作timer.c可选,so…...
C++ 使用红黑树的实现及迭代器完成对set和map的封装
一、红黑树的实现以及迭代器 #pragma once // 要实现完整的迭代器需要对红黑树进行改造,有兴趣可参考侯捷《STL源码剖析》 enum Colour {RED,BLACK };template<class T> struct RBTreeNode {RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeN…...

【Java从入门到起飞】面向对象编程(高级)
文章目录 1. 抽象类1.1 概述1.1.1 抽象类引入 1.2 abstract使用格式1.2.1 抽象方法1.2.2 抽象类1.2.3 抽象类的使用 1.3 抽象类的特征1.4 抽象类的细节1.5 抽象类存在的意义 2. 接口2.1 概述2.2 定义格式2.3 接口成分的特点2.3.1.抽象方法2.3.2 常量2.3.3 案例演示 2.4 基本的实…...

内网安全-横向移动PTH 哈希PTT 票据PTK 密匙Kerberos密码喷射
一.域横向pth,mimkatz,NTLM windwos server 2012 R2之前可能是NTLM和LM,之后为NTLM 1.mimkatz ptk 使用mimkatz进行横向移动 mimikatz sekurlsa::pth /user:administrator(目标本地用户名) /domain:192.168.3.32&a…...

【VMware安装Ubuntu实战分享】
在当今数字化时代,虚拟机技术已成为许多开发者、系统管理员以及技术爱好者的得力助手。VMware作为一款功能强大且广泛应用的虚拟化软件,为我们提供了便捷的环境来运行各种操作系统,而Ubuntu凭借其开源、稳定和易用性,深受广大用户…...
【推荐项目】 043-停车管理系统
043-停车管理系统 介绍 使用 springboot vuejs mysql 技术搭建框架。 智能停车管理系统描述 后端框架:采用Spring Boot与MySQL的强强联合,为系统提供稳健、高效的服务支撑。 前端框架:前端选用Vue.js,打造流畅、美观的用户交…...
【深入解析 epoll 的底层实现原理】
IO多路复用的简介select的工作原理和缺点epoll的引入和底层实现(数据结构、系统调用)epoll的优势和改进epoll的工作模式(LT和ET)在Java中的应用或相关API 需要确保每个部分逻辑清晰,逐步深入,帮助用户建立…...

Ubuntu 22.04 官方下载安装 Gradle 记录
Ubuntu 22.04 官方下载安装 Gradle 记录 Gradle 是一个强大的自动化构建工具,广泛用于 Java、Android 等项目的构建中。下面详细介绍如何在 Ubuntu 22.04 中使用官网下载安装 Gradle。 一、准备工作 首先,确保你的系统已安装 Java JDK(推荐…...

HTTPS加密原理详解
目录 HTTPS是什么 加密是什么 HTTPS的工作流程 1.使用对称加密 2.引入非对称加密 3.引入证书机制 客户端验证证书真伪的过程 签名的加密流程 整体工作流程 总结 HTTPS是什么 HTTPS协议也是一个应用程协议,是在HTTP的基础上加入了一个加密层,由…...

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战
文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课,而如何在Linux系统上高效地访…...
Unity入门学习笔记(Day01)
一.认识unity工作面板 1.1.project window(项目面板) 显示当前项目中的所有文件和目录,包含了项目里面所有的资源文件 1.2.console window(输出面板) 显示当前游戏开发中生成的警告错误 1.3.hierarchy window&…...
HTML中的块元素与行内元素
1.块级标签 块级元素会独占一行,通常用于构建页面的结构。常见的块级元素包括: <div>:通用的块级容器。没有任何语意。可以创建网页的不同部分,导航栏侧边栏等。 <body><div class"nav"><a hre…...
postgreSQL window function高级用法
正常使用:相当于对每个row做一次子查询 SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;order by 区别window frame and partition 没有order by, window function是对整个partition起作用, part…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...