Java大模型開發入門 (13/15):擁抱官方標準 - Spring AI框架入門與實踐

在這里插入圖片描述

前言

到目前為止,我們整個系列的旅程都是在功能強大的LangChain4j框架上構建的。它就像一個裝備齊全的“瑞士軍刀”,為我們提供了構建RAG和Agents所需的所有底層和高層工具。

然而,在Java企業級開發的世界里,有一個名字我們永遠無法忽視——Spring。當AI浪潮來襲,Spring官方團隊自然不會缺席。他們推出了自己的解決方案:Spring AI

那么,Spring AI是什么?它和我們已經熟練使用的LangChain4j是什么關系?是競爭者還是協作者?它能為我們帶來什么新的價值?今天,我們將一起探索這個由Spring官方打造的AI框架,體驗它所帶來的“原生”開發感受。

第一部分:什么是Spring AI?

Spring AI是一個應用框架,旨在將AI功能(特別是基于大語言模型的功能)以一種**“Spring原生”**的方式,無縫集成到企業級應用中。

它的核心設計哲學不是從零開始創造一切,而是:

  1. 提供統一的頂層抽象:無論底層模型是來自OpenAI、Google、Azure還是HuggingFace,Spring AI都力求提供一套統一的、面向接口的API,如ChatClientEmbeddingClient
  2. 擁抱Spring生態:充分利用Spring Boot的自動配置、依賴注入和外部化配置等核心特性。你不需要手動創建客戶端,只需要在application.properties中填寫配置,相應的Bean就會被自動創建和注入。
  3. 可移植性:它的目標是讓你的業務代碼與具體的AI模型提供商解耦。理論上,你只需要修改配置文件,就能從OpenAI切換到Azure OpenAI,而無需改動Java代碼。

Spring AI vs. LangChain4j:是什么關系?
它們并非嚴格的競爭關系,而是不同層面的抽象。Spring AI更側重于簡化集成和提升Spring開發者的體驗。事實上,Spring AI的某些模塊底層就是由LangChain4j驅動的!你可以把Spring AI看作是一個更高層次的“門面”,它為你整合了包括LangChain4j在內的多種AI庫,并用一層標準的Spring接口將其包裝起來。

第二部分:在Spring Boot中集成Spring AI

讓我們在一個新的分支或項目中,體驗一下Spring AI的配置過程。

  1. 修改pom.xml
    Spring AI有自己的BOM(Bill of Materials)來管理版本。我們需要先引入BOM,再添加具體的Starter。

      <properties><java.version>21</java.version><!-- 定義Spring AI的版本 --><spring-ai.version>1.0.0-M3</spring-ai.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Spring AI OpenAI Starter --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId></dependency><!-- Spring AI Vector Store - Simple (內存向量存儲) --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-transformers-spring-boot-starter</artifactId></dependency><!-- JSON處理 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><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>
    

    注意:請根據Spring AI的最新發布情況調整版本和倉庫配置。

  2. 修改application.properties
    Spring AI有自己的一套配置屬性,命名空間是spring.ai

    
    # ==========================================
    # Spring AI Demo 配置文件
    # ==========================================# 服務器端口配置
    server.port=8080# ==========================================
    # Spring AI OpenAI 配置
    # ==========================================# OpenAI API密鑰 (請設置環境變量 OPENAI_API_KEY)
    spring.ai.openai.api-key=${OPENAI_API_KEY:your-api-key-here}# OpenAI API基礎URL (支持代理服務)
    spring.ai.openai.base-url=${OPENAI_BASE_URL:https://yibuapi.com/}# 聊天模型配置
    spring.ai.openai.chat.options.model=${OPENAI_MODEL:gpt-4o-mini}
    spring.ai.openai.chat.options.temperature=${OPENAI_TEMPERATURE:0.7}
    spring.ai.openai.chat.options.max-tokens=${OPENAI_MAX_TOKENS:2000}# ==========================================
    # 應用程序配置
    # ==========================================# 應用名稱
    spring.application.name=springboot-langchain4j-demo# 日志配置
    logging.level.org.springframework.ai=DEBUG
    logging.level.org.example.demo=DEBUG# ==========================================
    # Web配置
    # ==========================================# 靜態資源配置
    spring.web.resources.static-locations=classpath:/static/
    spring.web.resources.cache.period=3600# 編碼配置
    server.servlet.encoding.charset=UTF-8
    server.servlet.encoding.enabled=true
    server.servlet.encoding.force=true

    僅僅這樣配置,Spring AI的Starter就會為我們自動創建一個配置好的ChatClient Bean。

第三部分:實戰 - 使用ChatModel 進行聊天

現在,我們將創建一個新的Service和Controller,體驗一下ChatModel 的流暢API。

  1. 創建SpringAiService.java

    package com.example.aidemoapp.service;import lombok.RequiredArgsConstructor;
    import org.springframework.ai.chat.model.ChatModel;
    import org.springframework.ai.chat.prompt.Prompt;
    import org.springframework.ai.chat.prompt.PromptTemplate;
    import org.springframework.stereotype.Service;@Service
    @RequiredArgsConstructor
    public class SpringAiService {private final ChatModel chatModel;/*** 簡單聊天對話*/
    public String getSimpleChatResponse(String userPrompt) {return chatModel.call(userPrompt);
    }/*** 使用模板的聊天對話*/
    public String getChatResponseWithTemplate(String topic, String style) {String template = "請用{style}的風格來介紹{topic},內容要詳細且有趣。";PromptTemplate promptTemplate = new PromptTemplate(template);Prompt prompt = promptTemplate.create(Map.of("topic", topic,"style", style));return chatModel.call(prompt).getResult().getOutput().getContent();
    }
    }
    

    代碼解析

    • 我們沒有看到任何OpenAi...相關的類,代碼完全面向ChatModel 這個抽象接口。
    • API調用是鏈式的,非常清晰:定義提示 -> 發起調用 -> 獲取內容。
  2. 創建SpringAiController.java

    package com.example.aidemoapp.controller;import com.example.aidemoapp.service.SpringAiService;
    import lombok.RequiredArgsConstructor;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;@RestController
    @RequestMapping("/api/spring-ai")
    @RequiredArgsConstructor
    public class SpringAiController {private final SpringAiService springAiService;/*** 簡單聊天接口*/@GetMapping("/chat")public Map<String, Object> chat(@RequestParam("query") String query) {try {String response = springAiService.getSimpleChatResponse(query);return Map.of("success", true,"data", response,"message", "聊天成功");} catch (Exception e) {return Map.of("success", false,"data", "","message", "聊天失敗: " + e.getMessage());}}/*** 模板聊天接口*/@PostMapping("/chat/template")public Map<String, Object> chatWithTemplate(@RequestBody Map<String, String> request) {try {String topic = request.get("topic");String style = request.get("style");String response = springAiService.getChatResponseWithTemplate(topic, style);return Map.of("success", true,"data", response,"message", "模板聊天成功");} catch (Exception e) {return Map.of("success", false,"data", "","message", "模板聊天失敗: " + e.getMessage());}}
    }
    
第四步:對比與思考

現在我們可以清楚地看到Spring AI和LangChain4j在設計哲學上的異同:

  • 配置方式:兩者都支持外部化配置,但命名空間不同。Spring AI的spring.ai.*對于Spring開發者來說更具辨識度。
  • 核心抽象
    • Spring AI:核心是ChatModel ,一個非常直接、面向任務的客戶端。它的目標是讓你用最少的代碼完成最常見的任務。
    • LangChain4j:核心是ChatLanguageModel接口和AiServices工廠/注解。它更側重于將一個Java接口映射為一個AI服務,提供了更靈活的、聲明式的編程模型。
  • 易用性
    • 對于簡單的聊天或嵌入任務,Spring AI的ChatClient極其簡單直接,學習成本幾乎為零。
    • 對于構建復雜的RAG或Agent流,LangChain4j通過RetrievalAugmentor@Tool等組件提供了更結構化、更專門的解決方案。

我應該用哪個?

  • 如果你是Spring重度用戶,且需求是快速將聊天、RAG等標準功能集成到應用中,Spring AI是你的不二之選。它的無縫集成和極低的上手門檻會讓你事半功倍。
  • 如果你需要構建高度定制化的AI工作流,或者需要使用一些LangChain4j獨有的高級功能,直接使用LangChain4j會給你更大的靈活性和控制力。

好消息是,你不必二選一。你完全可以在一個Spring AI項目中使用LangChain4j的組件,它們可以和諧共存。

總結

今天,我們探索了Spring官方的AI解決方案——Spring AI。我們了解了它以“Spring原生體驗”為核心的設計思想,并通過ChatClient體驗了其簡潔流暢的API。

我們現在武器庫中又增添了一件利器。我們既有功能全面、靈活強大的LangChain4j,又有與Spring生態無縫集成的Spring AI。作為開發者,我們可以根據項目的具體需求,選擇最合適的工具。

在我們開發之旅接近尾聲時,我們已經探索了多種工具和技術。但無論技術如何,將AI應用推向生產環境,都會面臨一些共通的挑戰。


源碼獲取

本文中所有實戰代碼均已同步更新至Gitee倉庫。建議您git pull拉取最新代碼,對照本文進行學習。

  • Gitee倉庫地址: https://gitee.com/chaocloud/spring-ai-demo

下一篇預告:
Java大模型開發入門 (14/15):生產環境考量 - 成本、安全與性能優化》—— 我們將從編碼轉向工程,探討在生產環境中部署和運維一個LLM應用時,必須考慮的成本控制、安全防護和性能優化等關鍵問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85302.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Github搜索案例

今天的內容是這個案例的實現&#xff0c;以及其中涉及到的內容&#xff0c;需要全部掌握&#xff0c;比如ref&#xff0c;受控組件&#xff0c;props在組件之中的傳遞&#xff0c;以及Pubsub包的使用這些前端React框架有關的內容。現在進入正題 1.github搜索案例&#xff08;a…

Vue3學習(生命周期,hooks,axios的簡單講解)

一&#xff0c;前言 繼續努力&#xff0c;南方見。 二&#xff0c;生命周期 1.對生命周期的理解 例如&#xff1a;人的生命周期&#xff0c;出生&#xff0c;經歷&#xff0c;死亡 組件的話就是&#xff0c;創建&#xff0c;掛載&#xff0c;更新&#xff0c;銷毀。***在特…

Pytorch實戰四 基于 VGG net 搭建一個串聯的神經網絡結構

系列文章目錄 文章目錄 系列文章目錄前言一、VGG類的搭建1.源碼2.初始化類2.1 初始化函數2.2 前向傳播函數 forward(self,x) 二、卷積補充卷積 前言 對于標準的 VGG net 輸入圖像的尺寸是 24 x 24,進行 32 維的下采樣之后得到一個 7 x 7 的特征圖&#xff0c;然后用 FC 層完成分…

大學專業解讀——計算機

我們繼續&#xff0c;講講排名第二流行的新工科專業——計算機。說到計算機&#xff0c;可能所有人都知道&#xff0c;但具體到細分的專業類別&#xff0c;除了計算機科學&#xff0c;其實大多數人都是不了解的。 序&#xff1a; 計算機主要有如下幾個專業&#xff1a; 計算機…

Bootstrap 5學習教程,從入門到精通, Bootstrap 5 列表組(List Group)語法知識點及案例(14)

Bootstrap 5 列表組(List Group)語法知識點及案例 一、列表組基礎語法 列表組是Bootstrap中用于顯示一系列內容的靈活組件&#xff0c;常用于顯示菜單、導航或任何項目列表。 基本列表組結構 <ul class"list-group"><li class"list-group-item&quo…

FPGA基礎 -- Verilog 命名事件

Verilog 的“命名事件&#xff08;Named Events&#xff09;”機制 進行一次系統、專業的培訓。該機制在 Verilog 中是比較冷門但重要的仿真控制特性&#xff0c;主要用于 模塊間同步、行為仿真觸發、事件通信&#xff0c;在復雜的 Testbench、行為模型中尤為重要。 一、命名事…

《Go語言圣經》結構體

《Go語言圣經》結構體 一、結構體指針的高效應用 在處理大型結構體時&#xff0c;為避免內存復制&#xff0c;通常使用指針傳遞和返回結構體&#xff1a; // 通過指針傳入結構體&#xff0c;避免值拷貝 func Bonus(e *Employee, percent int) int {return e.Salary * percen…

Ascend上如何進行帶寬測試

1 工具安裝 1.1 下載鏈接 https://www.hiascend.com/developer/download/community/result?moduledl%2Bcann 1.2 安裝指令&#xff1a; ./Ascend-mindx-toolbox_{version}_linux-{arch}.run --install設置環境變量&#xff1a; source /usr/local/Ascend/toolbox/set_env.…

生產BUG集

磁盤達到閾值導致ES無法刪除數據 method [POST], host [http://xx.xxx.xxx.xxx:9200], URI [/security_event/_delete_by_query?slices1&requests_per_second-1&ignore_unavailablefalse&expand_wildcardsopen&allow_no_indicestrue&ignore_throttledtru…

基于FastAPI與Selenium的智能開關狀態管理系統實踐

引言 在工業物聯網&#xff08;IIoT&#xff09;與自動化控制場景中&#xff0c;設備狀態的實時監控與自然語言指令執行是提升效率的關鍵。本文將介紹一種基于 FastAPI 和 Selenium 的智能設備狀態管理系統&#xff0c;通過大語言模型&#xff08;LLM&#xff09;解析用戶指令…

主體和債項均為“AAA”等級 海爾消金發行10億金融債

6月18日&#xff0c;繼年內發行ABS、落地ESG掛鉤銀團貸后&#xff0c;海爾消費金融&#xff08;以下簡稱“海爾消金”&#xff09;在金融市場上又邁出重要一步&#xff0c;成功簿記發行2025年首期規模達10億元金融債&#xff0c;且主體信用等級仍為“AAA”。這一舉措為海爾消金…

n8n:輕松自動化您的工作流

借助開源自動化利器 n8n&#xff0c;釋放重復勞動的生產力&#xff01; 引言 n8n 是一款免費、開源的工作流自動化工具&#xff0c;致力于幫助開發者和團隊通過連接各種應用和服務&#xff0c;實現重復任務的自動化處理。 它由 Jan Oberhauser 于 2019 年在德國柏林創建&…

Angular--Hello(TODO)

最近有個小錯誤&#xff0c;因為最近還是在看thingsboard&#xff0c;最近終于看到前端的代碼&#xff0c;突然發現怎么全是ts的文件&#xff0c;仔細一看原來并不是之前認為的AngularJS&#xff0c;而是Angular。。。我tm真的無語了&#xff0c;又要去重新學。。。 Angular的…

在 Linux 系統中通過 yum 安裝 Sublime Text

在 Linux 系統中通過 yum 安裝 Sublime Text 的步驟如下&#xff1a; ?步驟 1&#xff1a;導入 GPG 公鑰? sudo rpm -v --import https://download.sublimetext.com/sublimehq-rpm-pub.gpg 這一步用于驗證軟件包的合法性。 ?步驟 2&#xff1a;添加 Sublime Text 的軟件倉…

面向自主多星對地觀測的多智能體強化學習

大家讀完覺的有幫助記得及時關注和點贊&#xff01;&#xff01;&#xff01; 抽象 近地軌道 &#xff08;LEO&#xff09; 衛星的指數級增長徹底改變了地球觀測 &#xff08;EO&#xff09; 任務&#xff0c;解決了氣候監測、災害管理等方面的挑戰。然而&#xff0c;多衛星系統…

flutter 短視頻相關插件選型

?插件名稱??核心優勢??缺點??短視頻場景適用性??推薦指數??video_player? (官方基礎庫)? 官方維護&#xff0c;跨平臺兼容性最佳&#xff08;iOS/Android/macOS&#xff09; ? 輕量級&#xff0c;無額外依賴&#xff0c;啟動速度快 ? 支持本地/網絡視頻、基礎播…

QTableView為例:Qt模型視圖委托(MVD)(Model-View-Delegate)

文章目錄 1. QT中的MVD模式2. View3. Model4. Delegate5. 以TableView為例 1. QT中的MVD模式 模型視圖委托&#xff08;MVD&#xff09;是Qt中特有的設計模式&#xff0c;類似MVC設計模式&#xff0c;將MVC設計模式中的Controller當做MVD中的Delegate&#xff0c;兩者的概念基…

uni-app總結3-項目新建運行調試

一、新建項目 通過HbuilderX新建 在點擊工具欄里的文件 -> 新建 -> 項目&#xff08;快捷鍵CtrlN&#xff0c;MacOS上是CMD N&#xff09;&#xff1a; 左測Tab選擇uni-app類型&#xff0c;輸入工程名&#xff0c;選擇模板&#xff0c;Vue版本選擇3&#xff0c;其他不…

LeetCode 每日一題打卡|若谷的刷題日記 4day--移動零

移動零 題目&#xff1a; 給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。 示例 1&#xff1a; 輸入: nums [0,1,0,3,12] 輸出: [1,3,1…

簡歷模板3——數據挖掘工程師5年經驗

姓名 / Your Name 數據挖掘工程師 | 5年經驗 | 推薦/畫像/反欺詐 &#x1f4de; 138-XXXX-XXXX | ?? your.emailexample.com | &#x1f310; github.com/yourname | &#x1f4cd; 北京 &#x1f3af; 個人簡介 / Summary 5年大廠數據挖掘工程經驗&#xff0c;碩士學歷&am…