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…...

当中国“智算心跳”与全球共振:九章云极DataCanvas首秀MWC 2025
3月3日,西班牙巴塞罗那,全球通信与科技领域的盛会“2025世界移动通信大会(MWC 2025)”正式拉开帷幕。中国人工智能基础设施领军企业九章云极DataCanvas公司以全球化战略视野与硬核技术实力,全方位、多维度地展示了在智…...

机器视觉检测显卡与工控机选型指南
在机器视觉检测项目中,深度学习显卡和工控机的选择直接影响算法性能、系统稳定性和长期维护成本。以下是关键注意事项及建议: 一、深度学习显卡选择 核心需求分析 任务类型:检测任务复杂度(如YOLO、ResNet等模型的参数量)决定显存需求。 高分辨率图像(如4K以上)需大显存…...

配置安全网站
配置网站 确定是Debian系统 更新索引:apt update 安装包:apt upgrade -y 查看nginx状态:systemctl status nginx 安装:nginx:apt install nginx 启动:systemctl start nginx 在/var/www/里面创建一个…...

ds回答 什么是数据召回
数据召回(Data Recall)在不同领域有不同的具体含义,但核心都指向“从大量信息中筛选出相关数据”的过程。以下是其在不同场景下的定义和关键要点: 一、技术领域的定义(信息检索与推荐系统) 1. 基本概念 数…...

复现无人机的项目,项目名称为Evidential Detection and Tracking Collaboration
项目名称为Evidential Detection and Tracking Collaboration,主要用于强大的反无人机系统,涉及新问题、基准和算法研究。下面介绍项目的复现步骤: 安装环境:使用Anaconda创建并激活名为edtc的虚拟环境,Python版本为3…...

mac本地部署Qwq-32b记录
导语 昨天看到阿里开源了Qwq-32b,号称性能可以媲美Deepseek-R1。今天晚上有空就在Mac上折腾了一下,使用ollma进行了部署,效果感觉还不错,特此记录。 环境 硬件 型号:Macbook M1 Pro 14寸内存:512G 环境…...

实验三 Python 数据可视化 Python 聚类-K-means(CQUPT)
一、实验目的 Python 数据可视化: 1、学习使用 jieba、wordcloud 等类库生成词云图。 2、学习使用 Matplotlib 库进行数据可视化。 Python 聚类-K-means: 1、理解聚类非监督学习方法的基本原理。 2、掌握 Python、numpy、pandas、sklearn 实现聚类…...

通义万相2.1:开启视频生成新时代
摘要:文章开篇便点明了通义万相2.1在视频生成领域的重大突破,强调其作为阿里云通义系列AI模型的重要成员,不仅是简单的模型升级,更是视频生成技术迈向更智能、高效、精准的重要里程碑。其核心技术包括自研的高效VAE和DiT架构&…...

爬虫案例十一js逆向数位观察网
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、网站分析二、代码总结 前言 提示:这里可以添加本文要记录的大概内容: 爬虫案例十一js逆向数位观察网 提示:以下是本篇…...

WSL安装及问题
1 概述 Windows Subsystem for Linux(简称WSL)是一个在Windows 10\11上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,开发人员可以在 Windows 计算机上同时访问 Windows 和…...