博客原文地址
前言
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"));
然后正常使用架構搭建即可
最后
以上部分內容和圖片來自于官方文檔,本文中已聲明原作地址。