SpringAI介绍及本地模型使用方法

news2025/3/12 1:27:43

博客原文地址

前言

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的做法为:

  1. 开发java后端和前端部分代码

  2. 确定功能需求,如文本生成类项目,即接收部分参数,返回一个String文本

  3. 确定模型主题,如BERT/T5等等

  4. 对模型进行训练或微调,并编写使用方法代码

  5. 使用web框架(如:FastAPI/Flask)开放接口,规范接参收参格式

  6. java使用webclient(也可以用别的)请求接口调用AI服务

  7. 测试联调(你也可以选择一步一测试,都可以)

对于具体的模型对接代码可以参考我的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 CloudSpring 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.onnx
          tokenizer:
            uri: https://huggingface.co/intfloat/e5-small-v2/raw/main/tokenizer.json
          cache:
            directory: /tmp/ai-embedding-transformer
            enabled: 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 {
    @Resource
    private 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 {

    @Resource
    private 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"));

然后正常使用架构搭建即可

最后

以上部分内容和图片来自于官方文档,本文中已声明原作地址。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity 基础知识总结(持续更新中...)

引擎基础 Unity有哪几个主要窗口&#xff1f; Scene窗口 用于场景搭建和UI界面拼接 Game窗口 游戏运行预览 Hierarchy窗口 查看和调整场景对象层级结构 Project窗口 游戏工程资源 Inspector创建 属性查看器&#xff0c;属性设置、脚本组件挂载 Unity提供了几种光源…

IDEA接入阿里云百炼中免费的通义千问[2025版]

安装deepseek 上一篇文章IDEA安装deepseek最新教程2025中说明了怎么用idea安装codeGPT插件&#xff0c;并接入DeepSeek&#xff0c;无奈接入的官方api已经不能使用了&#xff0c;所以我们尝试从其他地方接入 阿里云百炼https://bailian.console.aliyun.com/ 阿里云百炼‌是阿…

3.03-3.09 Web3 游戏周报:Sunflower Land 周留存率 74.2%,谁是本周最稳链游?

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.03–3.09】Web3 游戏行业动态 Sui 背后开发公司 Mysten Labs 宣布收购游戏开发平台 ParasolYescoin 创始人因合伙人纠纷被警方带走&#xff0c;案件升级为刑事案件Animoca B…

NVIDIA k8s-device-plugin源码分析与安装部署

在《kubernetes Device Plugin原理与源码分析》一文中&#xff0c;我们从源码层面了解了kubelet侧关于device plugin逻辑的实现逻辑&#xff0c;本文以nvidia管理GPU的开源github项目k8s-device-plugin为例&#xff0c;来看看设备插件侧的实现示例。 一、Kubernetes Device Pl…

langChainv0.3学习笔记(初级篇)

LangChain自0.1版本发布以来&#xff0c;已经历了显著的进化&#xff0c;特别是向AI时代的适应性提升。在0.1版本中&#xff0c;LangChain主要聚焦于提供基本的链式操作和工具集成&#xff0c;帮助开发者构建简单的语言模型应用。该版本适用于处理简单任务&#xff0c;但在应对…

聚焦两会:科技与发展并进,赛逸展2025成创新新舞台

在十四届全国人大三次会议和全国政协十四届三次会议期间&#xff0c;代表委员们围绕多个关键议题展开深入讨论&#xff0c;为国家未来发展谋篇布局。其中&#xff0c;技术竞争加剧与经济转型需求成为两会焦点&#xff0c;将在首都北京举办的2025第七届亚洲消费电子技术贸易展&a…

Ubuntu 24.04 安装与配置 JetBrains Toolbox 指南

&#x1f4cc; 1. JetBrains Toolbox 介绍 JetBrains Toolbox 是 JetBrains 开发的工具管理器&#xff0c;可用于安装、更新和管理 IntelliJ IDEA、PyCharm、WebStorm、CLion 等。本指南记录了 JetBrains Toolbox 在 Ubuntu 24.04 上的 安装、路径调整、权限管理 及 遇到的问题…

【AI】神经网络|机器学习——图解Transformer(完整版)

Transformer是一种基于注意力机制的序列模型,最初由Google的研究团队提出并应用于机器翻译任务。与传统的循环神经网络(RNN)和卷积神经网络(CNN)不同,Transformer仅使用自注意力机制(self-attention)来处理输入序列和输出序列,因此可以并行计算,极大地提高了计算效率…

【VUE2】第二期——生命周期及工程化

目录 1 生命周期 1.1 介绍 1.2 钩子 2 可视化图表库 3 脚手架Vue CLI 3.1 使用步骤 3.2 项目目录介绍 3.3 main.js入口文件代码介绍 4 组件化开发 4.1 组件 4.2 普通组件注册 4.2.1 局部注册 4.2.2 全局注册 1 生命周期 1.1 介绍 Vue生命周期&#xff1a;就是…

贪心算法三

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…

猫耳大型活动提效——组件低代码化

1. 引言 猫耳前端在开发活动的过程中&#xff0c;经历过传统的 pro code 阶段&#xff0c;即活动页面完全由前端开发编码实现&#xff0c;直到 2020 年接入公司内部的低代码活动平台&#xff0c;满足了大部分日常活动的需求&#xff0c;运营可自主配置活动并上线&#xff0c;释…

机器学习 Day02,matplotlib库绘图

1.matplotlib图像结构 容器层&#xff1a;画板&#xff0c;画布&#xff0c;坐标系辅助层&#xff1a;刻度&#xff0c;标题&#xff0c;网格&#xff0c;图例等图像层&#xff1a;折线图&#xff08;主讲&#xff09;&#xff0c;饼图&#xff0c;直方图&#xff0c;柱状图等…

MySQL中有哪几种锁?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL中有哪几种锁&#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL中有哪几种锁&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中&#xff0c;锁是用于确保数据的一致性和并发控制的机…

Unity单例模式更新金币数据

单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。在游戏开发中&#xff0c;单例模式非常适合用于管理全局唯一的数据&#xff0c;比如玩家的金币数量。通过使用单例…

【javaEE】多线程(进阶)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

Vue3实战学习(Element-Plus常用组件的使用(输入框、下拉框、单选框多选框、el-image图片))(上)(5)

目录 一、Vue3工程环境配置、项目基础脚手架搭建、Vue3基础语法、Vue3集成Element-Plus的详细教程。(博客链接如下) 二、Element-Plus常用组件使用。 &#xff08;1&#xff09;el-input。(input输入框) <1>正常状态的el-input。 <2>el-input的disable状态。 <3…

C++ 链表List使用与实现:拷贝交换与高效迭代器细致讲解

目录 list的使用&#xff1a; 构造与赋值 元素访问 修改操作 容量查询 链表特有操作 拼接&#xff08;Splice&#xff09; C11 新增方法 注意&#xff1a; stl_list的模拟实现&#xff1a; 一、链表节点设计的艺术 1.1 结构体 vs 类的选择 二、迭代器实现的精髓 2…

知乎后台管理系统:数据库系统原理实验1——数据库基础概念

实验背景 通过练习绘制语义网络&#xff0c;加深对于基本概念之间关系的理解和掌握。掌握在VISIO中绘制能准确表达基本概念之间关系的语义网络的技能。了解并比较数据模型的Chen’s表示法和UML表示法。理解关系模型设计中的完整性约束的重要性。掌握在Linux操作系统下远程访问…

docker compose 以redis为例

常见docker compose 命令 》》注意这个是旧版本的&#xff0c;新版本 docker 与compose 之间没有 - 新版本的 docker compose 把 version 取消了 &#xff0c;redis 默认是没有配置文件的 &#xff0c;nginx&#xff0c;mysql 默认是有的 services:redis:image: redis:lat…

ES C++客户端安装及使用

1. ES 介绍 Elasticsearch &#xff0c; 简称 ES &#xff0c;它是个开源分布式搜索引擎&#xff0c;它的特点有&#xff1a;分布式&#xff0c;零配 置&#xff0c;自动发现&#xff0c;索引自动分片&#xff0c;索引副本机制&#xff0c; restful 风格接口&#xff0c;多…