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

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

  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.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语言中一直稳居高位&#xff0c;与AI的洪流碰撞后也产生了一些有趣的”化学反应“&#xff0c;当然你要非要说碰撞属于物理反应也可以&#xff0c; 在经历了一系列复杂的反应方程后&#xff0c;Spring家族的新成员——SpringAI&#xff0c;就…...

numpy广播性质

一、核心规则 一维数组本质 shape (n,)的数组是无方向向量&#xff0c;既非严格行向量也非列向量 自动广播机制 在矩阵乘法(或np.dot())中&#xff0c;一维数组会自动调整维度&#xff1a; 前乘时视为行向量 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&#xff0c;找到了PaddleNLP星河社区大模型&#xff0c;跟着敲写了一遍。内容来源&#xff1a;DeepSeek实战训练营&#xff1a;从云端模型部署到应用开发 - 飞桨AI Studio星河社区-人工智能学习与实训社区 本项目基…...

『PostgreSQL』PGSQL备份与还原实操指南

&#x1f4e3;读完这篇文章里你能收获到 了解逻辑备份与物理备份的区别及适用场景&#x1f50d;。掌握全库、指定库、指定表备份还原的命令及参数&#x1f4dd;。学会如何根据业务需求选择合适的备份策略&#x1f4ca;。熟悉常见备份还原问题的排查与解决方法&#x1f527;。 …...

基于单片机的智慧农业大棚系统(论文+源码)

1系统整体设计 经过上述的方案分析&#xff0c;采用STM32单片机为核心&#xff0c;结合串口通信模块&#xff0c;温湿度传感器&#xff0c;光照传感器&#xff0c;土壤湿度传感器&#xff0c;LED灯等硬件设备来构成整个控制系统。系统可以实现环境的温湿度检测&#xff0c;土壤…...

【C语言】数组篇

目录 引言一维数组数组的定义数组的初始化完全初始化部分初始化省略数组长度 数组元素的访问 多维数组二维数组的定义二维数组的初始化完全初始化部分初始化省略第一维长度 二维数组元素的访问 遍历数组元素遍历一维数组遍历二维数组 数组作为函数参数一维数组作为函数参数二维…...

FreeRTOS概述

文章目录 核心文件头文件内存管理文件入口函数数据类型前缀 核心文件 最核心文件&#xff1a;task.c和list.c 文件作用tasks.c必需&#xff0c;任务操作list.c必须&#xff0c;列表queue.c基本必需&#xff0c;提供队列操作、信号量(semaphore)操作timer.c可选&#xff0c;so…...

C++ 使用红黑树的实现及迭代器完成对set和map的封装

一、红黑树的实现以及迭代器 #pragma once // 要实现完整的迭代器需要对红黑树进行改造&#xff0c;有兴趣可参考侯捷《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&#xff0c;mimkatz&#xff0c;NTLM windwos server 2012 R2之前可能是NTLM和LM&#xff0c;之后为NTLM 1.mimkatz ptk 使用mimkatz进行横向移动 mimikatz sekurlsa::pth /user:administrator&#xff08;目标本地用户名&#xff09; /domain:192.168.3.32&a…...

【VMware安装Ubuntu实战分享】

在当今数字化时代&#xff0c;虚拟机技术已成为许多开发者、系统管理员以及技术爱好者的得力助手。VMware作为一款功能强大且广泛应用的虚拟化软件&#xff0c;为我们提供了便捷的环境来运行各种操作系统&#xff0c;而Ubuntu凭借其开源、稳定和易用性&#xff0c;深受广大用户…...

【推荐项目】 043-停车管理系统

043-停车管理系统 介绍 使用 springboot vuejs mysql 技术搭建框架。 智能停车管理系统描述 后端框架&#xff1a;采用Spring Boot与MySQL的强强联合&#xff0c;为系统提供稳健、高效的服务支撑。 前端框架&#xff1a;前端选用Vue.js&#xff0c;打造流畅、美观的用户交…...

【深入解析 epoll 的底层实现原理】

IO多路复用的简介select的工作原理和缺点epoll的引入和底层实现&#xff08;数据结构、系统调用&#xff09;epoll的优势和改进epoll的工作模式&#xff08;LT和ET&#xff09;在Java中的应用或相关API 需要确保每个部分逻辑清晰&#xff0c;逐步深入&#xff0c;帮助用户建立…...

Ubuntu 22.04 官方下载安装 Gradle 记录

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

HTTPS加密原理详解

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

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战

文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课&#xff0c;而如何在Linux系统上高效地访…...

Unity入门学习笔记(Day01)

一.认识unity工作面板 1.1.project window&#xff08;项目面板&#xff09; 显示当前项目中的所有文件和目录&#xff0c;包含了项目里面所有的资源文件 1.2.console window&#xff08;输出面板&#xff09; 显示当前游戏开发中生成的警告错误 1.3.hierarchy window&…...

HTML中的块元素与行内元素

1.块级标签 块级元素会独占一行&#xff0c;通常用于构建页面的结构。常见的块级元素包括&#xff1a; <div>&#xff1a;通用的块级容器。没有任何语意。可以创建网页的不同部分&#xff0c;导航栏侧边栏等。 <body><div class"nav"><a hre…...

postgreSQL window function高级用法

正常使用&#xff1a;相当于对每个row做一次子查询 SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;order by 区别window frame and partition 没有order by&#xff0c; window function是对整个partition起作用&#xff0c; part…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...