SpringAI使用总结

部署运行你感兴趣的模型镜像

基本使用

ChatModel和ChatClient

SpringAi支持非常多的模型,为了统一处理,SpringAi声明了ChatModel接口,各个模型的starter中有ChatModel对应的实现。

当我们引入ollama的依赖后

        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-ollama</artifactId>
        </dependency>

可以在程序中搜索到OllamaChatModel在这里插入图片描述

ChatClient是获取与模型进行对话获取响应的入口,需要给ChatClient提供ChatModel,ChatClient也是一个接口,不过SpringAi提供了默认的实现。
在这里插入图片描述
在这里插入图片描述

简单对话

这里调用的是本地的ollama中的模型,需要提前下载对应的模型。当然也可以通过api key调用远程的模型服务。

1、引入ollama starter依赖

        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-model-ollama</artifactId>
        </dependency>

2、配置

spring:
  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        model: deepseek-r1:14b

3、创建ChatClient

@Configuration
public class MyAiConfig {
    
    
    @Bean
    public ChatClient chatClient(ChatModel chatModel) {
        return ChatClient.builder(chatModel).build();
    }
    
}

4、对话controller编写

@RestController
@RequestMapping("/ai-chat")
public class ChatController {



    @Autowired
    private ChatClient chatClient;


    @GetMapping("/chat1")
    public String chat(@RequestParam String message) {
        return chatClient.prompt(message).call().content();
    }
}

5、测试结果,可以看到模型输出了响应。
在这里插入图片描述

流式输出

由于大模型生成响应可能比较慢,为了提高用户体验,所以出现了流式输出,即不等待大模型回答完成后,把输出一次性传输到客户端,而是将输出不断地传输到客户端。

    @GetMapping("/chat2")
    public Flux<String> chat1(@RequestParam String message) {
        return chatClient.prompt().user(message).stream().content();
    }

预设角色

在创建ChatClient的时候,可以给模型设置角色,这样模型会按照设置的角色来回答问题。
通过defaultSystem方法预设角色。

    @Bean
    public ChatClient chatClient(ChatModel chatModel) {
        return ChatClient.builder(chatModel).defaultSystem("你是一名医生,擅长诊断病情并提供对应的治疗方案").build();
    }

prompt(提示词)

SpringAi中主要有以下几类提示词模板:

  1. PromptTemplate:通用的提示词模板类,用于构建包含占位符的提示语句;适用于需要动态替换变量的任意提示内容;
  2. AssistantPromptTemplate:专门用于生成模型助手角色的提示词模板,当需要定义 AI 助手的行为或初始指令时使用;
  3. FunctionPromptTemplate:用于生成与函数调用相关的提示词模板;当需要模型根据特定函数描述进行推理或调用时使用;
  4. SystemPromptTemplate:用于生成系统级别的提示词模板,通常用于设置模型的整体行为;用于生成系统级别的提示词模板,通常用于设置模型的整体行为;

示例

通过@Value注解加载提示词模板

    @Value("classpath:/my-prompt-template.st")
    private Resource systemResource;


    @GetMapping("/chat4")
    public String chat4(@RequestParam String message) {
        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);
        Prompt prompt = systemPromptTemplate.create();
        return chatClient.prompt(prompt).user(message).call().content();
    }

提示词模板内容

你是我的好朋友,请用东北话回答问题,回答问题的时候适当添加表情符号。
今天是 {{current_date}}。

输出:
在这里插入图片描述

function call(工具调用)

使用@Tool注解定义工具

public class DateTimeUtil {


    /**
     * @Tool注解:
     *      1、name:工具的名称。如果未提供,则将使用方法名称。AI 模型在调用工具时使用此名称来识别工具。因此,不允许在同一个类中有两个同名的工具
     *      2、returnDirect:工具结果是应直接返回给客户端还是传递回模型
     *      3、description:工具的描述,模型可以使用它来了解何时以及如何调用工具
     * @return
     */
    @Tool(name = "",
            description = "Get the current date and time in the user's timezone")
    public String getCurrentTime() {
        return LocalDateTime.now().atZone(LocaleContextHolder.getTimeZone().toZoneId()).toString();
    }


    /**
     * @ToolParam注解:
     *      1、required:参数是必需的还是可选的。默认情况下,所有参数都被视为必需参数
     *      2、description:description:参数的描述,模型可以使用该描述来更好地了解如何使用它
     * @param time
     */
    @Tool(name = "setAlarm", description = "Set a user alarm for the given time")
    void setAlarm(@ToolParam(description = "Time in ISO-8601 format") String time) {
        LocalDateTime alarmTime = LocalDateTime.parse(time, DateTimeFormatter.ISO_DATE_TIME);
        System.out.println("Alarm set for " + alarmTime);
    }


}

通过tools方法添加工具,模型会自动调用工具

chatClient.prompt().tools(new DateTimeUtil()).user(message).call().content();

由于我使用的是本地的deepseek-r1不支持tool,报错了,这里就不放测试结果了。

 [400] Bad Request - {"error":"registry.ollama.ai/library/deepseek-r1:14b does not support tools"}

参考

  1. Spring文档
  2. Spring Ai视频教程

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

<think>首先,用户的问题是关于如何在Spring AI中实现MCP(Multi-Cluster Provisioning)服务的配置和部署。根据系统指令,我需要使用中文回答,确保行内数学表达式使用$...$格式,独立公式使用$$...$$格式,并正确应用LaTeX语法。同时,我需要生成相关问题。 回顾用户提供的引用: - 引用[1]:描述了Spring AI的MCP模块如何管理AI模型。 - 引用[2]:提到基于Spring AI开发MCP服务,是一个多模块应用。 - 引用[3]:详细介绍了使用Spring AI框架搭建MCP客户端和服务端。 - 引用[4]:讨论了MCP Server的多实例部署。 用户的问题焦点是配置和部署MCP服务。从引用中,MCP似乎指的是Model Control Plane,用于管理AI模型的生命周期。引用[3]提到Spring AI通过MCP协议提供企业级解决方案,支持同步/异步通信,并与Spring Boot集成。 我的回答需要结构清晰,逐步解决问题。参考系统指令,回答应真实可靠,基于提供的引用。 结构化回答: 1. **介绍MCP服务**:简要解释MCP在Spring AI中的作用。 2. **配置步骤**:详细说明如何在Spring AI中配置MCP服务。 3. **部署指南**:提供部署MCP服务的方法,包括多实例部署。 4. **代码示例**:如果可能,添加代码片段来演示配置。 5. **生成相关问题**:在回答末尾添加相关问题。 确保回答中引用的段落末尾自然地添加引用标识,如[^1]。 最后,生成相关问题:基于回答内容,提出3-5个相关问题。 现在,构建回答大纲: - **步骤1: 理解MCP服务** - 解释MCP是什么:Model Control Plane,用于统一管理AI模型。 - 引用[1]:MCP提供“单一事实来源”模型管理。 - **步骤2: 配置MCP服务** - 使用Spring Boot集成。 - 配置模型源(如本地文件系统或云存储)。 - 引用[2]和[3]:模块化设计,声明式配置。 - **步骤3: 部署MCP服务** - 基本部署:作为Spring Boot应用运行。 - 多实例部署:引用[4]:使用负载均衡和多个实例。 - 示例:使用Docker或Kubernetes进行容器化部署。 - **代码示例**:添加一个简单的Spring Boot配置代码片段。 - **总结**:强调优势。 - **相关问题**:生成相关问题。 代码示例:从引用[2]中,项目是spring-ai-mcp-demo,我可以基于描述添加一个伪代码或简单示例。 确保LaTeX正确:用户的问题中没有数学表达式,但如果有涉及,我会使用$...$或$$...$$。这里可能不需要。 回答语言:中文。</think>### 如何在Spring AI中实现MCP服务的配置和部署 Spring AI的MCP(Model Control Plane)模块是一个用于统一管理AI模型生命周期的企业级解决方案,它通过标准化接口简化多模型集成、动态配置和性能监控。MCP的核心是提供“单一事实来源”模型管理,支持本地化部署或多云环境,确保安全、合规和可扩展性[^1]。以下我将逐步指导您如何配置和部署MCP服务,基于Spring AI框架。整个过程分为配置和部署两个阶段,并参考了Spring AI的官方文档和最佳实践。 #### 1. **配置MCP服务** 配置MCP服务涉及设置模型源、定义接口和集成Spring BootSpring AI采用声明式配置和注解驱动模式,极大降低了技术门槛[^3]。以下是关键步骤: - **步骤1: 添加Spring AI依赖** 在您的Maven或Gradle项目中,引入Spring AI MCP模块。例如,在`pom.xml`中添加: ```xml <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-client</artifactId> <version>最新版本</version> <!-- 例如1.0.0 --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 这确保您能使用MCP的客户端和服务端组件,支持同步/异步通信[^2]。 - **步骤2: 定义模型源** MCP需要指定模型存储位置(如本地文件系统、云存储)。在`application.properties`中配置: ```properties spring.ai.mcp.model.source=file:/path/to/models # 本地路径示例 spring.ai.mcp.model.cache.enabled=true # 启用缓存提升性能 ``` 您也可以使用动态配置支持多云环境,例如通过环境变量注入AWS S3或Azure Blob Storage路径[^1]。 - **步骤3: 实现服务端接口** 创建一个Spring Boot服务类,使用`@RestController`注解暴露MCP API。例如,定义模型加载和查询端点: ```java import org.springframework.ai.mcp.server.McpServer; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/mcp") public class McpController { private final McpServer mcpServer; public McpController(McpServer mcpServer) { this.mcpServer = mcpServer; } @GetMapping("/models") public List<Model> listModels() { return mcpServer.getAllModels(); // 获取所有模型 } @PostMapping("/deploy") public String deployModel(@RequestBody ModelRequest request) { return mcpServer.deployModel(request.getModelId()); // 部署指定模型 } } ``` 此代码基于Spring AI的模块化架构,允许您通过标准REST API管理模型生命周期[^2][^3]。 - **步骤4: 配置安全与合规** 添加Spring Security依赖以启用认证和授权: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 在`SecurityConfig`类中定义规则,确保只有授权用户能访问敏感操作,满足企业合规需求[^1]。 #### 2. **部署MCP服务** 部署阶段关注如何将配置好的服务运行在生产环境,支持高可用和扩展性。Spring AISpring Boot无缝集成,简化了容器化和多实例部署[^4]。 - **步骤1: 基础部署** 作为Spring Boot应用运行: ```bash mvn spring-boot:run # 或打包为JAR运行 ``` 服务将启动在默认端口(如8080),您可以通过客户端调用API测试模型管理功能[^3]。 - **步骤2: 多实例部署(负载均衡)** 为处理高并发,引用[^4]建议使用多实例部署。步骤如下: - **容器化**:创建Dockerfile,将应用打包为镜像: ```dockerfile FROM openjdk:17 COPY target/mcp-service.jar /app.jar ENTRYPOINT ["java", "-jar", "/app.jar"] ``` 构建镜像:`docker build -t mcp-service .` - **启动多个实例**:使用Docker Compose或Kubernetes部署多个容器。例如,`docker-compose.yml`: ```yaml version: '3' services: mcp-instance1: image: mcp-service ports: - "8081:8080" mcp-instance2: image: mcp-service ports: - "8082:8080" ``` - **配置负载均衡**:使用Nginx或Spring Cloud Gateway作为入口,分发请求到多个实例。例如,Nginx配置: ```nginx http { upstream mcp_servers { server localhost:8081; server localhost:8082; } server { location / { proxy_pass http://mcp_servers; } } } ``` 这确保了高可用性和性能扩展,尤其适合大型AI应用[^4]。 - **步骤3: 监控与维护** 集成Spring Actuator和Micrometer进行健康检查和性能监控: ```properties management.endpoints.web.exposure.include=health,metrics ``` 结合Prometheus和Grafana可视化指标,确保模型服务稳定运行[^1]。 #### 总结 通过Spring AI实现MCP服务,您能高效管理AI模型生命周期,从配置到部署仅需少量代码。优势包括:统一接口降低复杂度、动态配置适应多云环境、多实例部署支持高并发[^1][^3][^4]。如果您有具体环境(如Kubernetes),我可以提供更详细的定制指南。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值