Spring AI MCP 从使用到操作实战详解
时间: 2025-07-28 19:09:59 浏览: 24
<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]。
阅读全文