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 Flux<String> 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 Resources):MCP 服务器可以连接到的远程资源,如通过 API 提供的数据

开发者只需写一次MCP服务端,所有兼容MCP协议的模型都能调用,MCP让大模型从"被动应答"变为"主动调用工具"。
三、编码案例实现
// <!--注意事项(重要)
// spring-ai-starter-mcp-server-webflux 不i fkartifactId>spring-boot-starter-web</artifactId> #存..
// 否则会使用tomcat启动,而不是netty启动,从而导致mcpserver启动失败,但程序运行是正常的,mcp客户端连接不上。
// >
// 1. 引入pom依赖
<depndency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--mcp-server-webflux-->
<dependency>
<groupId>org.springframeworkframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>
// 2. 写yml配置
# ===mcp-server Config==============
# 指定 MCP 服务器运行模式为异步(非阻塞)
spring.ai.mcp.server.type=async
# 定义 MCP 服务器的唯一名称,用于标识自定义的 MCP 服务实例
spring.ai.mcp.server.name=customer-define-mcp-server
# 定义 MCP 服务器的版本号,便于版本管理和兼容性控制
spring.ai.mcp.server.version=1.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-configuration=classpath:/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工具