領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多模型上下文協議 (MCP) 是 Spring AI 中的一項強大功能,它使 AI 模型能夠透過標準化介面訪問外部工具和資源。MCP 的一項有趣功能是它能夠在執行時動態更新可用工具。
這篇部落格文章探討了 Spring AI 如何在 MCP 中實現動態工具更新,為 AI 驅動的應用程式提供靈活性和可擴充套件性。
相關示例程式碼可在此處獲取:動態工具更新示例
在深入探討動態工具更新之前,讓我們先了解一下 MCP 是什麼以及它為何重要
模型上下文協議 (MCP) 是一個標準化介面,它允許 AI 應用程式和代理: 訪問外部工具 、 檢索資源 、 使用提示模板 。
MCP 遵循客戶端-伺服器架構: MCP 伺服器 - 暴露工具、資源和提示; MCP 客戶端 - 連線到伺服器並使用其功能; AI 模型 - 透過這些客戶端與世界互動
Spring AI 提供了 MCP 的全面實現,包括客戶端和伺服器元件,使得將 AI 能力整合到 Spring 應用程式中變得輕而易舉。
MCP 的一個強大之處在於能夠在執行時動態更新可用工具。這意味著
動態工具更新過程涉及多個元件協同工作
Spring AI 的 @Tool 註解使得將方法作為 MCP 工具暴露變得容易
public class MathTools {
@Tool(description = "Adds two numbers")
public int sumNumbers(int number1, int number2) {
return number1 + number2;
}
// ...
}
該框架自動
在伺服器端,Spring AI 的 MCP 實現提供了一種直接的方式來在啟動時和執行時動態新增 MCP 工具
@SpringBootApplication
public class ServerApplication {
//1. Tools added at start time by the Spring AI MCP Server Boot starter
@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService) {
return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
}
//2. Runtime tool addition
@Bean
public CommandLineRunner commandRunner(McpSyncServer mcpSyncServer) {
return args -> {
// Wait for some tool update signal
// Add math tools dynamically
List<SyncToolSpecification> newTools = McpToolUtils
.toSyncToolSpecifications(ToolCallbacks.from(new MathTools()));
for (SyncToolSpecification newTool : newTools) {
mcpSyncServer.addTool(newTool);
}
};
}
}
在此示例中
McpSyncServer.addTool() 方法動態註冊新工具McpSyncServer 類提供了工具管理方法
addTool(SyncToolSpecification) - 新增新工具removeTool(String) - 按名稱移除工具notifyToolsListChanged() - 通知客戶端工具更改注意: 您只能在客戶端/伺服器連線初始化後新增和/或移除工具。
MCP 協議包含一個通知系統,允許伺服器告知客戶端可用工具的更改。此通知系統確保客戶端始終擁有伺服器能力的最新檢視。
在客戶端,Spring AI 提供了檢測和響應工具更改的機制
@Bean
McpSyncClientCustomizer customizeMcpClient() {
return (name, mcpClientSpec) -> {
mcpClientSpec.toolsChangeConsumer(tv -> {
logger.info("\nMCP TOOLS CHANGE: " + tv);
latch.countDown();
});
};
}
客戶端註冊一個監聽器,每當伺服器的可用工具發生變化時就會呼叫該監聽器。這使得客戶端能夠
目前 Spring AI 不維護有關更新工具的內部狀態,但您可以使用自定義監聽器來實現智慧工具快取或類似功能。
客戶端可以隨時發現可用工具
List<ToolDescription> toolDescriptions = chatClientBuilder.build()
.prompt("What tools are available?")
.toolCallbacks(tools)
.call()
.entity(new ParameterizedTypeReference<List<ToolDescription>>() {});
Spring AI MCP 實現的一個關鍵洞察是
提示:客戶端實現依賴於 ToolCallbackProvider#getToolCallbacks 對於 MCP 的實現總是從伺服器檢索當前 MCP 工具列表這一事實。
這意味著無論何時客戶端請求可用工具,它都將始終從伺服器獲取最新列表,而無需重啟或重新初始化客戶端。
MCP 中的動態工具更新支援多種強大的用例
您可以實現控制哪些 AI 功能可用的特性標誌
if (featureFlags.isEnabled("advanced-math")) {
mcpSyncServer.addTool(advancedMathTools);
}
根據當前上下文或使用者許可權載入工具
if (userHasPermission(currentUser, "admin-tools")) {
mcpSyncServer.addTool(adminTools);
}
從基本工具開始,並根據需要新增更高階的功能
// Start with basic tools
mcpSyncServer.addTool(basicTools);
// Add advanced tools when the user reaches a certain level
userService.onUserLevelUp(user -> {
if (user.getLevel() >= 5) {
mcpSyncServer.addTool(advancedTools);
}
});
實現一個外掛系統,可以在執行時新增新功能
pluginRegistry.onPluginLoaded(plugin -> {
if (plugin.hasMcpTools()) {
mcpSyncServer.addTool(plugin.getMcpTools());
}
});
Spring AI 對模型上下文協議中動態工具更新的處理提供了一種在執行時擴充套件 AI 能力的機制。此功能使得 AI 應用程式更加靈活、可擴充套件和資源高效。
主要收穫
標準化介面:MCP 提供了一種一致的方式,讓 AI 模型與外部工具和資源進行互動。
動態更新:可以在執行時新增或移除工具,而無需重新啟動應用程式。
自動發現:客戶端可以檢測可用工具的變化,並立即將其提供給 AI 模型。
簡單 API:Spring AI 提供了一個簡潔的、基於註解的 API 來定義和管理 MCP 工具。
透過利用 Spring AI 的 MCP 實現中的動態工具更新,開發人員可以建立更具適應性的 AI 應用程式,這些應用程式可以根據執行時條件、使用者需求和系統要求演進其功能。