Spring AI框架快速入門

??前言:在經歷了八個里程碑式的版本之后(M1~M8),Spring AI 1.0 正式版本,終于在 2025 年 5 月 20 日正式發布,這是另一個新高度的里程碑式的版本,標志著 Spring 生態系統正式全面擁抱人工智能技術,并且意味著 Spring AI 將會給企業帶來穩定 API 支持。Spring AI?? 是 Spring 生態中一個新興的子項目,旨在簡化人工智能(尤其是生成式 AI)在 Java 應用中的集成。它提供了一套標準化 API 和工具,幫助開發者快速接入LLM大語言模型、向量數據庫等 AI 組件,同時與 Spring 的核心特性(如依賴注入、響應式編程)無縫結合。


一、??Spring AI 主要解決哪些痛點?

Spring AI 新架構設計主要旨在解決以下3個關鍵問題:

1.1、 統一的 API 抽象,隱藏底層復雜性

SpringAI 的核心價值在于統一不同 AI 供應商的差異化 API。無論是 OpenAI、Qwen還是 DeepSeek,開發者都通過同一套 ChatClient 接口進行操作。這種設計完美契合六邊形架構思想,將 AI 能力作為可插拔的端口(Port)接入系統,業務核心邏輯則通過適配器(Adapter)與具體實現解耦。

public interface ChatClient { ChatResponse call(ChatRequest request); 
Flux<ChatResponse> stream(ChatRequest request); }

?Spring AI 支持市面上幾乎所有主流的大模型提供商(包括聊天模型和圖像生成模型)以及向量數據庫。統一接口支持多種 AI 服務無論你使用的是 OpenAI 的 GPT、深度求索的 DeepSeek、谷歌的 Gemini、Anthropic 的 Claude,還是 Hugging Face 上的開源模型,Spring AI 都旨在提供一套統一且可移植的 API,讓你能夠輕松調用。對于向量數據庫,比如:Milvus、Pinecone、Redis、PGVector 等,它同樣提供了統一的 API 和查詢方法。這樣,你的代碼就可以更靈活地在不同的 AI 服務和數據庫之間切換,不會被某個特定供應商鎖定。

1.2、簡化 AI 應用開發,廣泛支持模型、向量數據庫、RAG和MCP等

構建一個稍微復雜的 AI 應用,集成向量數據庫(如 Pinecone、Milvus),支持 RAG(檢索增強生成)場景。比如:RAG(檢索增強生成),通常需要涉及數據加載、分割、向量化、存儲、檢索、調用大語言模型(LLM)等多個步驟。Spring AI 提供了 ETL 框架、ChatClient、VectorStore 等組件和抽象,大大簡化了這些流程的實現。對話管理?,封裝?ChatClient?和?ChatModel,管理上下文、消息歷史、提示詞模板。

1.3、配置即連接,深度集成 Spring 生態

這是 Spring 的強項,支持 Spring Boot 自動配置、Spring WebFlux 響應式調用。Spring AI 提供了各種 Spring Boot Starter,使得配置和集成 AI 模型、向量數據庫變得非常簡單,遵循“約定優于配置”的原則,即開箱即用,無需復雜的配置。

通過 Spring Boot 的 application.yaml,特別適合需要動態切換大模型供應商的企業場景。:

spring:ai:openai:api-key: xxxbase-url: xxxchat:options:model: xxx
#  completions-path 屬性用于指定調用 OpenAI 聊天補全接口的具體路徑,默認值:/v1/chat/completions(對應 OpenAI 官方接口路徑)
#        completions-path: /v1/chat/completionstemperature: 0.7

二、Spring AI 涉及的基礎概念

  • 模型(Model)

就是接收用戶行為,以及根據用戶行為生成內容的算法,本質還是算法,這些算法可以接收文本、圖片、音視頻,生成滿足用戶需要的文本、圖片、音頻視頻等內容,其中有一種輸入文本叫嵌入文本(embedding text),輸出多維度的數組,表示AI模型使用的內部數據結構,用來判斷多個樣本之間的相似性。

  • 提示詞(Prompt)

prompt是引導AI模型生成特定輸出的輸入,它的設計會顯著影響模型的響應,一開始prompt是簡單的文本輸入,就好比是智能對話中的問題,隨著事件的推移,prompt演變成了包含多個”角色“的結構體,這些角色對消息進行分類,明確了上下文,可以實現歷史問答等的相關功能等。角色有:系統角色(System Role)、用戶角色(User Role)、助手角色(Assistant ?Role)、工具/功能角色(Tool/Function Role)。

  • 提示詞模板(Prompt Template)

就是模板格式,在實際運用中可以提供占位符的格式,使用用戶的輸入替換占位符,增加靈活性。Spring AI采用開源庫StringTemplate來實現。

  • 嵌入(Embedding)

原理就是把輸入的文本、圖像和視頻轉換為稱為向量(Vector)的浮點數數組來表示,數組長度就是向量的維度,可以把多維度的向量數組映射到空間坐標軸中,依次找到他們之間的接近性,這種接近性有助于文本分類、語義搜索,甚至產品推薦等任務。也可以把數組存入到向量數據庫中,提供給RAG使用。

  • Token

token是 AI 模型工作原理的基石。輸入時,模型將單詞轉換為token。輸出時,它們將token轉換回單詞。在英語中,一個token大約對應一個單詞的 75%,實際使用第三方大模型的過程中,也是根據token進行收費的,具體收費情況根據模型和輸入輸出類型而定。

  • 結構化輸出(Structured Output)

就是把從大模型輸出的結果轉換成我們想要類型,可以是json格式、xml格式、或者是java類,這對于我們應用開發者比較重要,可以自定義實體類來接收結果,在應用中使用。

  • 檢索增強生成(RAG)

我理解是一種方法,目的是為大模型提供額外的知識輸入,輔助模型更好的回答問題,當用戶輸入問題時,RAG技術從矢量數據庫查詢出所有“類似”的文檔片段,連同用戶的問題,一起放入發送給 AI 模型的提示中。該方法涉及到:從文檔中讀取非結構化數據、對其進行轉換、然后將其寫入矢量數據庫。

  • 函數調用(Function Calling)

大型語言模型 (LLM) 在訓練后即被凍結,導致知識陳舊,并且無法訪問或修改外部數據。該方式提供了一種方法,解決大模型訓練后知識陳舊的問題,可以引入自定義的功能函數,函數中可以調取外部的API來獲取最新的數據返回給大模型,并最終向用戶提供響應。


三、??Spring AI 的核心組件??

3.1、??ChatModel(模型抽象)??

  • ??作用??:定義生成式 AI 模型的統一接口(如?generate(prompt))。
  • ??實現示例??:
    // 配置 OpenAI 模型
    @Bean
    OpenAiChatModel openAiModel() {return new OpenAiChatModel("sk-xxx");
    }
  • ??調用??:
    String reply = chatModel.generate("Hello, how are you?");

3.2、ChatClient(客戶端封裝)??

  • ??作用??:簡化與模型的交互,支持流式響應和上下文管理。
  • ??示例??:
    @Autowired
    private ChatClient chatClient;// 發送消息并獲取流式響應
    Flux<String> response = chatClient.stream("Explain quantum computing.");

3.3、PromptTemplate(提示詞模板)??

  • ??作用??:動態生成結構化提示詞,支持變量插值。
  • ??示例??:
    PromptTemplate template = new PromptTemplate("Translate '{text}' to French.");
    Prompt prompt = template.create(Map.of("text", "Hello world"));
    String translation = chatModel.generate(prompt);

四、??與 WebFlux 的集成(響應式 AI 服務)??

Spring AI 天然支持與 ??Spring WebFlux?? 結合,構建非阻塞的高并發 AI 服務。

示例:實時聊天 API
@RestController
public class ChatController {@Autowiredprivate ChatClient chatClient;// 流式聊天接口(SSE 協議)@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<String> streamChat(@RequestParam String message) {return chatClient.stream(message);}// 同步聊天接口@PostMapping("/chat")public Mono<String> chat(@RequestBody String message) {return chatClient.generate(message);}
}

?五、快速入門 Spring AI??

5.1、添加Maven依賴??

   <!-- Spring AI --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>1.0.0-M6</version></dependency>

    5.2、??配置 API 密鑰??(application.yml

    spring:ai:openai:api-key: xxxbase-url: xxxchat:options:model: xxx
    #  completions-path 屬性用于指定調用 OpenAI 聊天補全接口的具體路徑,默認值:/v1/chat/completions(對應 OpenAI 官方接口路徑)
    #        completions-path: /v1/chat/completionstemperature: 0.7

      5.3、OpenAiChatClientController實現流式調用和同步調用

      package com.hs.demo.controller;import io.swagger.v3.oas.annotations.Operation;
      import io.swagger.v3.oas.annotations.tags.Tag;
      import jakarta.servlet.http.HttpServletResponse;
      import org.springframework.ai.chat.client.ChatClient;
      import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor;
      import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
      import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
      import org.springframework.ai.chat.memory.InMemoryChatMemory;
      import org.springframework.ai.openai.OpenAiChatOptions;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.http.MediaType;
      import org.springframework.http.codec.ServerSentEvent;
      import org.springframework.validation.annotation.Validated;
      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;
      import reactor.core.publisher.Flux;/*** 實現調用邏輯,可以設置默認的系統Prompt,定義模型的參數** 使用InMemoryChatMemory聊天記錄的存儲,可以讓模型記住對話記錄,結合上下文去回答,chatId就是會話窗口的id,在這個id不變的情況下,它會自定義的去在總結100條對話記錄,然后再回答你的問題*/
      @RestController
      @RequestMapping("/openai/chat")
      @Tag(name = "AI對話")
      public class OpenAiChatClientController {private final ChatClient openAiChatClient;private static final String DEFAULT_PROMPT = "你是一個聊天助手,請根據用戶提問回答!";public OpenAiChatClientController(ChatClient.Builder chatClientBuilder) {this.openAiChatClient = chatClientBuilder.defaultSystem(DEFAULT_PROMPT)// 實現 Chat Memory 的 Advisor              // 在使用 Chat Memory 時,需要指定對話 ID,以便 Spring AI 處理上下文。.defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))// 實現 Logger 的 Advisor.defaultAdvisors(new SimpleLoggerAdvisor())// 設置 ChatClient 中 ChatModel 的 Options 參數.defaultOptions(OpenAiChatOptions.builder().topP(0.7).build()).build();}/*** ChatClient 簡單調用*/@GetMapping("/simple/chat")@Operation(summary = "ChatClient 簡單調用")public String simpleChat(@RequestParam String message) {String str = openAiChatClient.prompt(message).advisors(new SimpleLoggerAdvisor()).call().content();System.out.println("輸出結果"+str);return str;}/*** ChatClient 簡單調用* 默認使用 InMemoryChatMemory** @param message 消息* @param chatId  會話ID*/@GetMapping("/simple/chat/conversaion")@Operation(summary = "ChatClient 簡單調用附帶會話")public String simpleChat(@RequestParam String message, @RequestParam String chatId) {return openAiChatClient.prompt(message).advisors(a -> a.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY, chatId) // 設置聊天會話ID.param(AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)) // 設置聊天記錄檢索數量.call().content();}/*** ChatClient 流式調用*/@GetMapping("/stream/chat")@Operation(summary = "ChatClient 流式調用")public Flux<String> streamChat(@RequestParam String message,HttpServletResponse response) {response.setCharacterEncoding("UTF-8");return openAiChatClient.prompt(message).stream().content();}/*** ChatClient 流式響應*/@GetMapping(value = "/stream/response", produces = MediaType.TEXT_EVENT_STREAM_VALUE)@Operation(summary = "ChatClient 流式調用1")public Flux<ServerSentEvent<String>> streamChat(@RequestParam String message) {return openAiChatClient.prompt().user(message).stream().content().map(content -> ServerSentEvent.<String>builder().data(content).build());}}

        ?總結??:Spring AI 通過標準化接口和 Spring 原生集成,顯著降低了 Java 應用中集成 AI 能力的門檻。開發者可以更專注于業務邏輯,而非底層協議實現。對于需要快速迭代且依賴 Spring 生態的項目,它是比手動封裝?ChatClient/ChatModel?更高效的選擇。


        參考鏈接:

        Spring AI 1.0.0 發布!支持 MCP 很炸裂!!

        SpringAI實踐(一)

        接入SpringAI實現流式對話

        Spring AI 1.0 正式發布!AI 開發從未如此簡單,不懂它的三層開發模式你就輸麻了!

        Spring AI 1.0 正式發布!AI 開發從未如此簡單,不懂它的三層開發模式你就輸麻了!

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

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

        相關文章

        Python實戰:打造高效通訊錄管理系統

        &#x1f4cb; 編程基礎第一期《8-30》–通訊錄管理系統 &#x1f4d1; 項目介紹 在信息化時代&#xff0c;高效管理個人或團隊聯系人信息變得尤為重要。本文將帶您實現一個基于Python的通訊錄管理系統&#xff0c;該系統采用字典數據結構和JSON文件存儲&#xff0c;實現了聯系…

        89. Java 數字和字符串 - Math 類深入解析

        文章目錄 89. Java 數字和字符串 - Math 類深入解析一、引言二、常量與基本方法2.1 Math 類常量2.2 絕對值和舍入絕對值方法舍入方法最小值和最大值 三、指數與對數方法四、三角函數方法五、總結 89. Java 數字和字符串 - Math 類深入解析 一、引言 在 Java 中&#xff0c;除…

        STM32之SG90舵機控制(附視頻講解)

        目錄 前言&#xff1a; 一、硬件準備與接線 1.1 硬件清單 1.2 接線 二、 SG90舵機簡介 1.1 外觀 1.2 基本參數 1.3 引腳說明 1.4 控制原理 1.5 特點 1.6 常見問題 三、 單片機簡介 四、 程序設計 4.1 定時器配置 4.2 角度控制函數 4.3 主函數調用 五、 總結 …

        netstat命令Windows與Linux雙平臺

        深入解析netstat命令:Windows與Linux雙平臺實戰指南 netstat(Network Statistics)是網絡診斷中最經典的工具之一,能夠幫助用戶查看網絡連接、端口監聽狀態、路由表等信息。然而,Windows和Linux系統下的netstat在參數和輸出格式上存在差異,容易讓人混淆。本文將詳細對比兩…

        攻防世界-ics-07

        進入環境 進入項目管理 點擊進行訪問 是一堆代碼進行審計 <?php session_start();if (!isset($_GET[page])) {show_source(__FILE__);die(); }if (isset($_GET[page]) && $_GET[page] ! index.php) {include(flag.php); }else {header(Location: ?pageflag.php);…

        基于 Node.js 的 Express 服務是什么?

        Express 是基于 ?Node.js? 的一個輕量級、靈活的 Web 應用框架&#xff0c;用于快速構建 ?HTTP 服務?&#xff08;如網站、API 接口等&#xff09;&#xff0c;以下是詳細解析&#xff1a; ?一、Express 的核心作用? ?簡化 Node.js 原生開發? Node.js 原生 http 模塊雖…

        linux安裝vscode以及配置vscode

        vscode配置 1&#xff0c;準備工作2&#xff0c;VsCode安裝插件3&#xff0c;cmake Tools 的使用 1&#xff0c;準備工作 所謂的準備工作&#xff0c;就是要讓linux具備 vim gcc g編譯器&#xff0c;可使用cmake&#xff0c;makefile等開發的條件。 首先我么以及有一個以安裝好…

        基于AI的智能農業病蟲害識別系統實戰指南

        引言 在農業現代化進程中&#xff0c;病蟲害防治始終是保障糧食安全的核心挑戰。傳統人工識別方式存在效率低、誤判率高、響應滯后等問題。本文將通過完整的技術實現流程&#xff0c;展示如何利用Python生態構建智能病蟲害識別系統&#xff0c;實現從圖像采集到防治建議輸出的…

        【MySQL】第11節|MySQL 8.0 主從復制原理分析與實戰(一)

        一、MySQL主從復制基礎 1. 核心概念 定義&#xff1a; MySQL主從復制是將主庫&#xff08;Source/Master&#xff09;的數據變更同步到一個或多個從庫&#xff08;Replica/Slave&#xff09;的機制&#xff0c;默認采用異步復制&#xff0c;支持全庫、指定庫或表的同步。 角…

        【RabbitMQ】記錄 InvalidDefinitionException: Java 8 date/time type

        目錄 1. 添加必要依賴 2. 配置全局序列化方案&#xff08;推薦&#xff09; 3. 配置RabbitMQ消息轉換器 關鍵點說明 1. 添加必要依賴 首先確保項目中包含JSR-310支持模塊&#xff1a; <dependency><groupId>com.fasterxml.jackson.datatype</groupId>&l…

        【機器學習基礎】機器學習入門核心算法:K-近鄰算法(K-Nearest Neighbors, KNN)

        機器學習入門核心算法&#xff1a;K-近鄰算法&#xff08;K-Nearest Neighbors, KNN&#xff09; 一、算法邏輯1.1 基本概念1.2 關鍵要素距離度量K值選擇 二、算法原理與數學推導2.1 分類任務2.2 回歸任務2.3 時間復雜度分析 三、模型評估3.1 評估指標3.2 交叉驗證調參 四、應用…

        在h5端實現錄音發送功能(兼容內嵌微信小程序) recorder-core

        本文將通過一個實際的 Vue3 組件示例&#xff0c;帶你一步步實現“按住錄音&#xff0c;松開發送&#xff0c;上滑取消”的語音錄制功能。 我們將使用強大且小巧的開源庫 recorder-core&#xff0c;支持 MP3、WAV、AAC 等編碼格式&#xff0c;兼容性較好。 &#x1f527; 項目…

        深入掌握Node.js HTTP模塊:從開始到放棄

        文章目錄 一、HTTP模塊入門&#xff1a;從零搭建第一個服務器1.1 基礎概念解析1.2 手把手創建服務器 二、核心功能深入解析2.1 處理不同請求類型2.2 實現文件下載功能 三、常見問題解決方案3.1 跨域問題處理3.2 防止服務崩潰3.3 調試技巧 四、安全最佳實踐4.1 請求頭安全設置4.…

        SSM整合:Spring+SpringMVC+MyBatis完美融合實戰指南

        前言 在Java企業級開發領域&#xff0c;SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架組合一直占據著重要地位。這三個輕量級框架各司其職又相互配合&#xff0c;為開發者提供了高效、靈活的開發體驗。本文將深入探討SSM框架的整合過程&#xff0c;揭示整合背后的原…

        [AI]大模型MCP快速入門及智能體執行模式介紹

        [AI]大模型MCP快速入門及智能體執行模式介紹 一、MCP入門 介紹 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文協議&#xff09;是一種由Anthropic公司于2024年提出的開放標準協議&#xff0c;旨在為大型語言模型&#xff08;LLM&#xff09;提供統一接口&am…

        Mac M1 安裝 ffmpeg

        1.前言 官網那貨沒有準備m系列的靜態包&#xff0c;然后我呢&#xff0c;不知道怎么想的就從maven項目中的 javacv-platform&#xff0c;且版本為1.5.11依賴里面將這個靜態包把了出來&#xff0c;親測能用&#xff0c;感覺比那些網上說的用什么wget編譯安裝、brew安裝快多了。…

        unity控制相機圍繞物體旋轉移動

        記錄一下控制相機圍繞物體旋轉與移動的腳本&#xff0c;相機操作思路分為兩塊&#xff0c;一部分為旋轉&#xff0c;一部分為移動&#xff0c;旋轉是根據當前center中心點的坐標&#xff0c;根據距離設置與默認的旋轉進行位置移動&#xff0c;移動是根據相機的左右和前后進行計…

        python打卡day38@浙大疏錦行

        知識點回顧&#xff1a; Dataset類的__getitem__和__len__方法&#xff08;本質是python的特殊方法&#xff09;Dataloader類minist手寫數據集的了解 作業&#xff1a;了解下cifar數據集&#xff0c;嘗試獲取其中一張圖片 一、首先加載CIFAR數據集 import torch import torchvi…

        用戶配置文件(Profile)

        2.4.5 用戶配置文件&#xff08;Profile&#xff09; 用戶配置文件由以下組件構成&#xff1a; 一個運營商安全域&#xff08;MNO-SD&#xff09; 輔助安全域&#xff08;SSD&#xff09;和CASD Applets 應用程序&#xff08;如NFC應用&#xff09; 網絡接入應用&#xff…

        如何給自研MCP加上安全驗證

        前言 剛過去兩個月,市面的 MCP 服務,如雨后春筍一般不斷涌現出來,包括;百度、高德、網盤、支付寶。這些 MCP 服務,可以讓我們基于 Spring AI 框架構建的 Agent 具備非常豐富的使用功能。同時這也說明,程序員???????,應該具備開發 MCP 服務的能力,Spring AI 讓 J…