Java后端拥抱AI开发之个人学习路线 - - Spring AI【第四期】(Tool + MCP)

张开发
2026/4/8 4:47:34 15 分钟阅读

分享文章

Java后端拥抱AI开发之个人学习路线 - - Spring AI【第四期】(Tool + MCP)
Tool Calling工具调用一、概念“工具调用(Tool Calling)“或“函数调用允许大型语言模型(LLM)在必要时调用一个或多个可用的工具这些工具通常由开发者定义。工具可以是任何东西:网页搜索、对外部API的调用或特定代码的执行等。LLM本身不能实际调用工具相反它们会在响应中表达调用特定工具的意图(而不是以纯文本回应)。然后应用程序应该执行这个工具并报告工具执行的结果给模型。当LLM可以访问工具时它可以在合适的情况下决定调用其中一个工具这是一个非常强大的功能。总结就是LLM的外部utils工具类。ToolCalling也称为FunctionCalling它允许大模型与一组API或工具进行交互将LLM的智能与外部工具或API无缝连接从而增强大模型其功能。LLM本身并不执行函数,它只是指示应该调用哪个函数以及如何调用二、Tool Calling的工作流程Tool Calling作用访问实时数据执行某种工具类/辅助类操作工作流程用户 - 程序 - 大模型判断是否要用工具- 程序调用工具- 工具 - 程序根据结果再次调用大模型- 大模型 - 程序接收大模型结果返回给用户- 用户三、编码案例实现// 第一种通过ChatModel实现 RestController public class ToolCallingController { Resource private ChatModel chatModel; GetMapping(/toolcall/chat) public String chat(RequestParam(name msg, defaultValue 你是谁现在几点) String msg) { // 1. 工具注册到工具集合里 // DateTimeTools自己实现的工具类用于返回当前系统时间 ToolCallback[] tools ToolCallbacks.from(new DateTimeTools()); // 2. 将工具集配置进ChatOptions对象 ChatOptions options ToolCallingChatOptions.builder().toolCallbacks(tools).build(); // 3. 构建提示词 Prompt prompt new Prompt(msg, options); // 4. 调用大模型 return chatModel.call(prompt).getResult().getOutput().getText(); } } // 第二种通过ChatClient实现 Resource private ChatClient chatClient; GetMapping(/toolcall/chat2) public FluxString chat2(RequestParam(name msg, defaultValue 你是谁现在几点) String msg) { return chatClient.prompt(msg) .tools(new DateTimeTools()) .stream() .content(); }MCP 模型上下文协议Model Context Protocol一、概念MCP是一种开放协议它标准化了应用程序如何向大型语言模型(LLMs)提供上下文。可以将MCP想象成AI应用的USB-C端口。就像USB-C提供了一种标准化的方式将你的设备连接到各种外围设备和配件一样MCP提供了一种标准化的方式将AI模型连接到不同的数据源和工具。网址mcp.so/zh)二、MCP之CS架构核心成员MCP 主机MCP Hosts发起请求的 AI 应用程序比如聊天机器人、AI 驱动的 IDE 等。MCP 客户端MCP Clients在主机程序内部与 MCP 服务器保持 1:1 的连接。MCP 服务器MCP Servers为 MCP 客户端提供上下文、工具和提示信息。本地资源Local Resources本地计算机中可供 MCP 服务器安全访问的资源如文件、数据库。远程资源Remote ResourcesMCP 服务器可以连接到的远程资源如通过 API 提供的数据开发者只需写一次MCP服务端所有兼容MCP协议的模型都能调用MCP让大模型从被动应答变为“主动调用工具”。三、编码案例实现// !--注意事项(重要) // spring-ai-starter-mcp-server-webflux 不i fkartifactIdspring-boot-starter-web/artifactId #存.. // 否则会使用tomcat启动而不是netty启动从而导致mcpserver启动失败但程序运行是正常的mcp客户端连接不上。 // // 1. 引入pom依赖 depndency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency !--mcp-server-webflux-- dependency groupIdorg.springframeworkframework.ai/groupId artifactIdspring-ai-starter-mcp-server-webflux/artifactId /dependency // 2. 写yml配置 # mcp-server Config # 指定 MCP 服务器运行模式为异步非阻塞 spring.ai.mcp.server.typeasync # 定义 MCP 服务器的唯一名称用于标识自定义的 MCP 服务实例 spring.ai.mcp.server.namecustomer-define-mcp-server # 定义 MCP 服务器的版本号便于版本管理和兼容性控制 spring.ai.mcp.server.version1.0.0 // 3. 核心编码本地版本 Configuration public class McpServerConfig { /** * 将工具方法暴露给外部 mcp client 调用 * param weatherService * return */ Bean public ToolCallbackProvider weatherTools(WeatherService weatherService) { return MethodToolCallbackProvider.builder() .toolObjects(weatherService) .build(); } }调用外部的MCP以调用百度地图MCP为例// 1. 需要有Python环境或者Node环境 // 2. 去百度地图控制台注册账号和获取API-Key密钥 // 3. 依旧是之前的pom依赖和yml配置但是现在yml配置中要多一条声明使用什么协议 // 这个mcp-server.json5里面去配置你要使用的各种MCP协议 spring.ai.mcp.client.stdio.servers-configurationclasspath:/mcp-server.json5 // 4. 这里以百度地图的MCP为例写配置 使用Node.js环境 { // MCP 服务器核心配置节点用于定义所有外部 MCP 服务 mcpServers: { // 自定义服务名称百度地图 MCP 服务 baidu-map: { // 执行命令Windows 系统使用 cmd 启动服务 command: cmd, // 命令参数执行 npx 命令启动百度地图官方 MCP 服务包 args: [/c, npx, -y, baidumap/mcp-server-baidu-map], // 环境变量配置注入百度地图 API 密钥 env: { // 百度地图开放平台 API Key用于鉴权调用地图服务 BAIDU_MAP_API_KEY: XXX... } } } } // 启动后会在控制台看到 STDERR Message received:Baidu Map MCP Server running on stdio // 则表示百度地图的MCP配置成功 // 使用方法和之前本地调用的一样 都会从yml文件中去读取Tool工具

更多文章