Spring AI整合MCP协议:让大模型拥有调用工具的能力

9 阅读1分钟

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能力。

进一步学习