Spring AI整合MCP协议:让大模型拥有调用工具的能力
引言
随着大语言模型(LLM)的快速发展,如何让模型与外部工具和服务进行交互成为了一个重要的课题。Spring AI作为Spring生态中用于构建AI应用的重要框架,提供了丰富的集成能力。而MCP(模型上下文协议)则是一种用于标准化LLM与工具交互的协议。本文将介绍如何在Spring AI中集成MCP Tool,让你的大模型能够调用外部工具。
什么是MCP协议?
MCP(Model Context Protocol)是一种开放协议,用于在大语言模型和外部工具之间建立标准化的通信方式。它定义了工具的描述、调用格式和返回结果的结构,使得模型可以动态地发现和调用可用工具。
核心概念
- 工具(Tool):一个可执行的功能单元,例如查询天气、发送邮件、查询数据库等。
- 工具描述(Tool Description):使用JSON Schema等格式描述工具的输入输出参数。
- 工具调用(Tool Call):模型根据用户请求生成工具调用请求。
- 工具响应(Tool Response):工具执行后返回的结果,由模型整合到最终回复中。
适用场景
- 增强模型能力:让模型能够执行超出其训练数据范围的任务,如查询实时数据。
- 企业应用集成:将内部系统(如CRM、ERP)暴露为工具,供模型调用。
- 自动化工作流:结合多个工具实现复杂的业务流程自动化。
在Spring AI中集成MCP Tool
环境准备
首先,创建一个Spring Boot项目,并添加Spring AI和MCP相关的依赖。
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>0.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-spring-boot-starter</artifactId>
<version>0.8.0</version>
</dependency>
<!-- 其他必要依赖 -->
</dependencies>
配置MCP工具
创建一个简单的工具示例:查询用户信息的工具。
import org.springframework.ai.mcp.tool.Tool;
import org.springframework.ai.mcp.tool.ToolResponse;
import org.springframework.stereotype.Component;
@Component
public class UserInfoTool {
@Tool(name = "getUserInfo", description = "根据用户ID查询用户信息")
public ToolResponse getUserInfo(@Tool.Param(name = "userId", description = "用户ID") String userId) {
// 模拟查询用户信息
String userInfo = String.format("用户ID: %s, 姓名: 张三, 年龄: 25, 邮箱: zhangsan@example.com", userId);
return ToolResponse.success(userInfo);
}
}
配置Spring AI客户端
在application.yml中配置OpenAI客户端(或其他支持的模型提供商)。
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-4
创建控制器
创建一个REST控制器,用于处理用户请求并调用模型。
import org.springframework.ai.client.AiClient;
import org.springframework.ai.prompt.Prompt;
import org.springframework.ai.prompt.messages.UserMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ChatController {
@Autowired
private AiClient aiClient;
@PostMapping("/chat")
public String chat(@RequestBody String userMessage) {
Prompt prompt = new Prompt(new UserMessage(userMessage));
return aiClient.generate(prompt).getGeneration().getText();
}
}
测试工具调用
启动应用后,可以向 /chat 端点发送请求。例如,发送消息:“查询用户123的信息”。模型将识别需要调用 getUserInfo 工具,并返回查询结果。
高级配置
工具自动发现
Spring AI支持自动扫描带有 @Tool 注解的组件,无需手动注册。
工具权限控制
可以通过实现 ToolPermissionEvaluator 接口来控制哪些工具可以被调用。
错误处理
工具调用可能失败,需要妥善处理异常并返回有意义的错误信息给模型。
总结
通过集成MCP协议,Spring AI使得大语言模型能够灵活调用外部工具,极大地扩展了模型的应用场景。本文介绍了MCP协议的核心概念,并演示了如何在Spring AI中快速集成MCP Tool。希望这篇指南能帮助你在实际项目中更好地利用AI能力。