先行一步
VMware 提供培訓和認證,為您的進步加速。
瞭解更多模型上下文協議 (MCP) 是 Spring AI 中一個強大的功能,它使 AI 模型能夠透過標準化介面訪問外部工具和資源。MCP 的一個有趣能力是它能夠在執行時動態更新可用工具。
本篇部落格文章將探討 Spring AI 如何在 MCP 中實現動態工具更新,從而為 AI 驅動的應用程式提供靈活性和可擴充套件性。
相關示例程式碼可在此處獲取:動態工具更新示例
在深入探討動態工具更新之前,讓我們先了解 MCP 是什麼以及它為何重要
模型上下文協議 (MCP) 是一個標準化介面,允許 AI 應用和 Agent 執行以下操作:訪問外部工具 、檢索資源 、使用提示模板 。
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 實現的一個關鍵見解是
提示:客戶端實現依賴於以下事實:MCP 的 ToolCallbackProvider#getToolCallbacks 實現將始終從伺服器檢索當前 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 應用,這些應用可以根據執行時條件、使用者需求和系統要求來發展其能力。