最新版 Spring AI 實踐
深入探索 Spring AI 1.0.0-M6
在人工智能與軟件開發深度融合的時代,Spring AI 作為一個強大的框架,持續為開發者提供著高效且便捷的工具,以實現與大語言模型(LLM)的無縫交互。Spring AI 的最新版本引入了一系列令人矚目的特性,其中 Function Calling 到 Tool Calling 的轉換以及模型上下文協議(MCP)的應用,標志著該框架在 AI 集成領域的又一次重大飛躍。
聊天接口示例
在今天的內容之前我們回一下如何使用SpringAI實現一個簡單的聊天接口,使用千問API實現聊天功能:
- 添加依賴
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter</artifactId>
</dependency>
- 配置
spring:
ai:
## Alibaba
dashscope:
api-key: ${DASH_SCOPE_API_KEY}
chat:
enable: true
options:
model: qwen-max
- 實現
@Bean
public ChatClient chatClient(ChatClient.Builder chatClientBuilder) throws IOException {
var chatClient = chatClientBuilder
.defaultSystem("You are a helpful assistant.")
.defaultAdvisors(new SimpleLoggerAdvisor()) // LOG
.build();
return chatClient;
}
/**
* 調用
* @param message
* @return
*/
public String completion(String message) {
return chatClient
.prompt().user(message)
.call().content();
}
當進行下面的提問時:
現在北京時間幾點了?
[引用]
Function Calling
圖片
在早期的 AI 交互中,Function Calling 是一種常見的機制,允許模型在生成回復時調用外部函數以獲取額外信息。然而,這種方式在擴展性和靈活性上存在一定的局限性。而 Spring AI 最新版本引入的 Tool Calling 則是對 Function Calling 的進一步演進。Tool Calling 將函數調用抽象為工具調用,將工具視為可復用的資源,模型可以根據需求動態調用這些工具,以完成更復雜的任務。在新版本中已經被改為Tool Calling。
工具主要用于:
信息檢索
此類工具可用于從外部來源(例如數據庫、Web 服務、文件系統或 Web 搜索引擎)檢索信息。其目標是增強模型的知識,使其能夠回答原本無法回答的問題。因此,它們可用于檢索增強生成 (RAG) 場景。例如,可以使用工具檢索給定位置的當前天氣、檢索最新新聞文章或查詢數據庫中的特定記錄。
采取行動
此類別中的工具可用于在軟件系統中采取行動,例如發送電子郵件、在數據庫中創建新記錄、提交表單或觸發工作流。其目標是自動化原本需要人工干預或明確編程的任務。例如,可以使用工具為與聊天機器人交互的客戶預訂航班、在網頁上填寫表單,或在代碼生成場景中基于自動化測試 (TDD) 實現 Java 類。
盡管我們通常將工具調用稱為模型功能,但實際上工具調用邏輯是由客戶端應用程序提供的。模型只能請求工具調用并提供輸入參數,而應用程序負責根據輸入參數執行工具調用并返回結果。
Spring AI 提供了便捷的 API 來定義工具、解析來自模型的工具調用請求以及執行工具調用。
為了解決上面關于時間問題的解決方案,我們可以定義一個工具,并嵌入到模型中...
public class TimeTools {
private static final Logger logger = LoggerFactory.getLogger(TimeTools.class);
@Tool(description = "Get the time of a specified city.")
public String getCityTimeMethod(@ToolParam(description = "Time zone id, such as Asia/Shanghai") String timeZoneId) {
logger.info("The current time zone is {}", timeZoneId);
return String.format("The current time zone is %s and the current time is " + "%s", timeZoneId, ZoneUtils.getTimeByZoneId(timeZoneId));
}
}
public ChatClient chatClient(ChatClient.Builder chatClientBuilder) throws IOException {
// ...
chatClientBuilder.defaultTools(timeTool);
// ...
}
Function Calling實現了大語言模型(LLM)與外部函數或工具進行交互的能力。這一機制賦予了 AI 系統更強大的功能和靈活性,使其能夠處理更加復雜和動態的任務。
注意不是所有模型都支持FunctionCalling。
MCP
圖片
MCP(Model Context Protocol,模型上下文協議) 是的一種開放協議,旨在統一大語言模型(LLM)與外部數據源、工具和服務之間的交互標準,推動 AI 應用的標準化和去中心化發展。 MCP 提供了一種統一的接口,使得不同的工具和服務可以以標準化的方式與模型進行交互。
核心功能
- 標準化交互 MCP 提供了一套通用的通信協議、數據格式和規則,使 LLM 能夠以統一的方式與外部資源(如數據庫、API、文件系統等)進行交互,無需為每個工具單獨開發適配接口。
- 增強模型能力 通過 MCP,LLM 可以動態調用外部工具或數據源,例如實時獲取天氣信息、查詢數據庫、調用第三方服務等,從而擴展模型的功能邊界。
- 安全與合規 MCP 內置了安全機制,確保數據傳輸的安全性,并支持細粒度的權限控制,避免數據泄露和濫用。
- 降低開發成本 開發者無需重復造輪子,可直接基于 MCP 協議構建 AI 應用,顯著減少開發時間和成本。
在1.0.0-M6版本中引入了MCP,使得可以基于Spring AI實現各種擴展
此時聊天應用作MCP服務的調用者,也就是客戶端,需要調用外部的MCP服務,首先對聊天服務改造:
- 添加必要的依賴:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
</dependency>
- 通過配置ChatClient完成集成:
@Bean
public ChatClient chatClient(ToolCallbackProvider toolsProvider) throws IOException {
var chatClient = chatClientBuilder
// ...
.defaultTools( toolsProvider.getToolCallbacks() ) //mcp
// ...
.build();
return chatClient;
}
SpringAI中,MCP 客戶端支持兩種傳輸方式:STDIO 和 SSE。 標準啟動器通過STDIO(進程內)和/或SSE(遠程)傳輸同時連接到一個或多個 MCP 服務器。SSE 連接使用基于 HttpClient 的傳輸實現。每個與 MCP 服務器的連接都會創建一個新的 MCP 客戶端實例。
STDIO
其實就是通過本地命令進行調用的實現,需要注意的是,返回的數據結果必須遵循MCP規范,我們可以基于Spring開發一個可執行的jar程序包,然后由客戶端調用。
- 添加依賴
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
</dependency>
- 實現Tool并注冊
@Service
public class TranslationService {
@Tool(description = "將內容翻譯成英文")
public String translate(String content) {
return "hello";
}
}
@Bean
public ToolCallbackProvider translationTools(TranslationService translationService) {
return MethodToolCallbackProvider.builder().toolObjects(translationService).build();
}
- 添加配置,注意這里要關掉所有日志相關的輸出
spring:
main:
web-application-type:none
banner-mode:off
ai:
mcp:
server:
name:translation-server
version:0.0.1
logging:
level:
root:off
- 打包,記得使用spring-boot-maven-plugin插件打包,下面的mcpServers引用的就是這里的jar
- 修改聊天應用配置,并且重啟
spring:
ai:
mcp:
client:
type: SYNC
stdio:
servers-configuration: classpath:mcp-stdio-servers.json
mcp-stdio-servers.json
{
"mcpServers": {
"weather": {
"command": "java",
"args": [
"-Dspring.ai.mcp.server.stdio=true",
"-Dspring.main.web-application-type=none",
"-Dlogging.pattern.cnotallow=",
"-jar",
"your_jar_path/mcp-stdio-server-1.0.1-SNAPSHOT.jar"
],
"env": {}
}
}
}
提問: 翻譯單詞運勢
[引用]
因為我沒有實現,全部返回的是hello,看樣子模型對我們的結果進一步做了處理。
SSE
這里提供一個簡單的示例,主要實現星座運勢獲取的Mcp,這是一個單獨的基于Spring開發的應用,與上面的聊天應用隔離:
- 引入相關依賴
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId>
</dependency>
- 定義Tool實現
@Service
publicclass HoroscopeService {
private String url = "https://apis.tianapi.com/star/index?key=%s&astro=%s";
private String key = "xx";
private RestTemplate restTemplate = new RestTemplate();
private ObjectMapper objectMapper = new ObjectMapper();
@Tool(description = "Get constellation fortune by consName")
public String getFortune(String consName) {
Map map = restTemplate.getForObject(String.format(url, key, consName), Map.class);
try {
return objectMapper.writeValueAsString(map.get("result"));
} catch (JsonProcessingException e) {
e.printStackTrace();
return"獲取失敗:"+ e.getMessage();
}
}
}
- 配置文件
spring:
ai:
mcp:
server:
name:webmvc-mcp-server
version:1.0.0
type:SYNC
sse-message-endpoint:/mcp/messages
server:
port:8081
servlet:
encoding:
charset:utf-8
enabled:true
force:true
- 啟動應用,訪問:http://localhost:8081
- 修改聊天應用配置,并且重啟
spring:
ai:
mcp:
client:
type: SYNC
sse:
connections:
constellation:
url: http://localhost:8081
提問: 白羊座的運勢
[引用]
結束語
現階段的AI技術,恰似一臺功能強大卻需精心調校的計算機系統。它并非“即插即用”的萬能工具,而是需要開發者如同配置硬件般,根據特定業務場景的需求,按需增加“認知模塊”與“計算資源”。這種靈活擴展的能力,與模塊化計算平臺(MCP,Modular Computing Platform)的設計理念不謀而合——通過標準化接口與可組合架構,讓AI系統既能像積木般自由拼接算法能力,又能像云計算般彈性調度算力資源。開發者需像搭建樂高城堡般,將自然語言處理、視覺識別、決策推理等模塊按需組合,再通過數據管道與反饋機制持續優化,最終讓AI在醫療診斷、智能制造、智慧城市等垂直領域中,展現出接近專家水平的場景化智能。