Spring AI MCP 架构详解

Spring AI MCP 架构详解

1.什么是MCP?

MCP 是一种开放协议,它对应用程序向大语言模型(LLMs)提供上下文信息的方式进行了标准化。可以把 MCP 想象成人工智能应用程序的 USB-C 接口。就像 USB-C 为将设备连接到各种外围设备和配件提供了一种标准化方式一样,MCP 将人工智能模型连接到不同的数据源和工具提供了一种标准化方式。

MCP 可帮助你在 LLM 之上构建智能体和复杂的工作流。LLM 通常需要与数据和工具集成,而 MCP 可提供:

  1. 在 LLM 提供商和供应商之间切换的灵活性。
  2. 不断扩充的预构建集成列表,你的大语言模型可以直接接入其中;
  3. 保护基础设施内数据的最佳实践

MCP协议官网 https://modelcontextprotocol.io/

2.整体架构

MCP 的核心是客户端-服务器架构,其中主机应用程序可以连接到多个服务器:

在这里插入图片描述

MCP Hosts:想要通过 MCP 访问数据的程序(例如 Claude Desktop、IDE 或 AI 工具)

**MCP Clients:**与服务器保持 1:1 连接的协议客户端

**MCP Servers:**每个轻量级程序都通过标准化模型上下文协议公开提供特定功能

**Local Data Sources:**MCP 服务器可以安全访问您的计算机的文件、数据库和服务

**Remote Services:**MCP 服务器可以连接到互联网上的外部系统(例如通过 API)

Spring AI MCP

MCP Java SDK 提供了模型上下文协议的 Java 实现,支持通过同步和异步通信模式与 AI 模型和工具进行标准化交互。

Spring AI MCP 通过 Spring Boot 集成扩展了 MCP Java SDK,提供客户端和服务器启动器。使用 Spring Initializer 通过 MCP 支持引导您的 AI 应用程序。

MCP Java SDK Architecture

Java MCP 实现遵循三层架构:

在这里插入图片描述

客户端 / 服务器层:McpClient 处理客户端操作,而 McpServer 管理服务器端的协议操作。两者都使用 McpSession 来进行通信管理。

会话层(McpSession):通过 DefaultMcpSession 实现来管理通信模式和状态。

传输层(McpTransport):处理 JSON-RPC 消息的序列化和反序列化,支持多种传输实现方式。

MCP Client

在这里插入图片描述

MCP 客户端是模型上下文协议 (MCP) 架构中的关键组件,负责建立和管理与 MCP 服务器的连接。它实现了协议的客户端:

  1. 协议版本协商,确保与服务器的兼容性

  2. 能力协商以确定可用功能

  3. 消息传输和 JSON-RPC 通信

  4. 工具发现和执行

  5. 资源访问和管理

  6. Prompt系统交互

  7. 可选特性:Roots管理,采样支持

  8. 同步和异步操作

  9. 传输可选项:

         基于标准输入输出(Stdio)的传输,用于基于进程的通信
    
         基于 Java HttpClient 的 SSE 客户端传输
    
         反应式 HTTP 流的 WebFlux SSE 客户端传输
    

MCP Server

在这里插入图片描述

MCP 服务端是模型上下文协议 (MCP) 架构中的基础组件,为客户端提供工具、资源和功能。它实现协议的服务端,负责:

  1. 服务端协议操作实现
  • 工具暴露与发现
  • 基于统一资源标识符(URI)访问的资源管理
  • 提示词模板的提供与处理
  • 与客户端进行能力协商
  • 结构化日志记录与通知
  1. 客户端并发连接管理
  2. 同步和异步 API 支持
  3. 传输实现方式:
  • 基于标准输入输出(Stdio)的传输,用于基于进程的通信
  • 基于 Servlet 的服务器发送事件(SSE)服务器传输
  • 响应式 HTTP 流的基于 WebFlux 的服务器发送事件(SSE)服务器传输
  • Servlet 的 HTTP 流基于 WebMVC 的服务器发送事件(SSE)服务器传输

Spring AI MCP 集成

Spring AI 通过以下 Spring Boot Starters提供 MCP 集成:

Client Starters

  • spring-ai-starter-mcp-client - 核心starter,提供基于标准输入输出(STDIO)和基于HTTP的服务器发送事件(SSE)
  • spring-ai-starter-mcp-client-webflux - 基于 WebFlux 的服务器发送事件(SSE)传输实现

Server Starters

  • spring-ai-starter-mcp-server - 核心server,基于标准输入输出(STDIO)传输支持
  • spring-ai-starter-mcp-server-webmvc - 基于Spring MVC的 SSE 传输实现
  • spring-ai-starter-mcp-server-webflux - 基于WebFlux SSE 传输实现
<think>我们正在讨论SpringAI中的多模型控制器(MCP)的使用。根据用户的问题,他想要一个使用指南和操作实战教程。我们将结合之前的引用内容,特别是引用[1]中提到的MCPStarter的依赖配置,以及引用[2]中关于环境准备的信息。首先,我们需要明确MCP(Multi-modelController)的作用:它允许开发者在同一个应用中轻松切换和调用不同的AI模型(如DeepSeek、OpenAI等),而无需修改核心业务代码。接下来,我们将按照以下步骤进行:1.环境准备2.添加依赖3.配置MCP和模型API密钥4.编写代码示例5.运行和测试###环境准备根据引用[2],我们需要:-Java17或更高(推荐Java21)-SpringBoot3.2.x或更高-DeepSeekAPI密钥(或其他支持的模型API密钥)###添加依赖在项目的`pom.xml`中添加MCPStarter依赖(如引用[1]所示):```xml<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-spring-boot-starter</artifactId><version>1.0.0</version></dependency>```###配置MCP和模型API密钥在`application.yml`(或`application.properties`)中配置MCP和模型。这里以DeepSeek为例:```yamlspring:ai:mcp:enabled:trueproviders:deepseek:api-key:YOUR_DEEPSEEK_API_KEY#其他模型特定配置(可选)#全局配置(可选)```###编写代码示例使用MCP的核心是注入`AiClient`,然后通过它来调用模型。MCP会根据配置自动路由到指定的模型。创建一个简单的控制器:```javaimportorg.springframework.ai.client.AiClient;importorg.springframework.ai.client.AiResponse;importorg.springframework.ai.prompt.Prompt;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;@RestControllerpublicclassAiController{privatefinalAiClientaiClient;publicAiController(AiClientaiClient){this.aiClient=aiClient;}@GetMapping("/ask")publicStringask(@RequestParamStringquestion){Promptprompt=newPrompt(question);AiResponseresponse=aiClient.generate(prompt);returnresponse.getGeneration().getText();}}```###运行和测试启动SpringBoot应用,访问`http://localhost:8080/ask?question=你的问题`,即可看到模型返回的回答。###多模型切换如果想在同一个应用中使用多个模型,可以在配置中指定多个提供者,并在代码中通过`AiClient`的特定方法(如指定模型名称)来调用。例如:```yamlspring:ai:mcp:providers:deepseek:api-key:YOUR_DEEPSEEK_API_KEYopenai:api-key:YOUR_OPENAI_API_KEY```然后在代码中,可以通过设置提示的选项来指定模型:```javaPromptprompt=newPrompt(question,Map.of("model","deepseek"));//或"openai"```###注意事项-确保API密钥正确,并且网络可以访问模型服务。-MCPStarter会自动配置`AiClient`,因此无需手动创建。-详细配置和高级用法可参考SpringAI官方文档。§§相关问题§§1.如何在SpringAI中同时配置多个AI模型提供者?2.如何通过MCP实现模型调用的负载均衡或故障转移?3.在使用DeepSeek模型时,有哪些特殊的配置参数需要注意?</think>### Spring AI 多模型控制器(MCP)使用指南与实战 #### 一、MCP 核心概念 多模型控制器(MCP)是 Spring AI 的核心组件,它提供统一的接口管理多个 AI 模型(如 DeepSeek、OpenAI 等),支持动态切换模型、请求路由和负载均衡。其核心优势在于**解耦业务代码与模型实现**,只需通过标准 API 调用,无需关注底层模型差异[^1]。 #### 二、环境配置(实战步骤) ##### 1. 添加 MCP 依赖 ```xml <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-spring-boot-starter</artifactId> <version>1.0.0</version> </dependency> ``` ##### 2. 配置模型密钥 在 `application.yml` 中配置 DeepSeek 和其他模型: ```yaml spring: ai: mcp: providers: deepseek: api-key: YOUR_DEEPSEEK_API_KEY # 官网申请 endpoint: https://api.deepseek.com/v1 openai: api-key: sk-xxxxxxxxxxxxxxxx default-provider: deepseek # 设置默认模型 ``` #### 三、代码实战 ##### 场景1:基础对话服务 ```java @RestController public class ChatController { @Autowired private AiClient aiClient; // MCP 自动注入的统一客户端 @PostMapping("/chat") public String generate(@RequestBody String prompt) { // 调用当前激活的模型(默认DeepSeek) return aiClient.generate(prompt); } } ``` **测试请求**: ```bash curl -X POST http://localhost:8080/chat -d "用Java实现快速排序" ``` ##### 场景2:动态切换模型 ```java @Service public class ModelService { @Autowired private ModelRouter modelRouter; public String switchModel(String modelId, String prompt) { // 动态切换到指定模型 AiResponse response = modelRouter.route(modelId) .generate(new Prompt(prompt)); return response.getGeneration().getContent(); } } ``` **调用示例**: ```java switchModel("openai", "解释量子计算"); // 实时切换至OpenAI ``` ##### 场景3:多模型负载均衡 ```yaml # 在配置中启用负载均衡 spring: ai: mcp: routing-strategy: load_balance # 轮询策略 ``` ```java // 自动均衡请求到不同模型 aiClient.generate("多模型负载测试"); ``` #### 四、高级功能 1. **请求拦截器** 自定义预处理逻辑: ```java @Bean public AiClientInterceptor loggingInterceptor() { return (prompt, attributes) -> { System.out.println("发送请求: " + prompt.getContents()); return prompt; }; } ``` 2. **模型性能监控** ```java @Autowired private ModelMetrics modelMetrics; public void printMetrics() { modelMetrics.getProviderStats("deepseek") .forEach((k, v) -> System.out.println(k + ": " + v)); } ``` 输出示例:`response_time_ms: 420 | tokens_used: 1050` #### 五、调试技巧 1. **查看激活模型** ```bash curl http://localhost:8080/actuator/aimodels ``` 2. **强制指定模型** 请求头添加:`X-AI-Provider: openai` > **最佳实践**:生产环境中建议配置**模型降级策略**,当主模型不可用时自动切换备用模型[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laopeng301

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值