springAI搭建mcp并实现计算概率

需求背景

需求分析

目前存在一个需求,需要使用ai辅助用户使用特定产品需求,当前已有产品为为传统产品,需改造为使用聊天交互的方式使用。
示例:今天午饭的预算为100,想订一个麻辣烫,预计12点送达。
自动调用我们定制的个性化服务,返回用户想要的数据。

实现的demo

问题:我的投档分数为500,预计的院校要求投档最低分为480,求概率。
智能体回复内容:
在这里插入图片描述

其中,计算的概率为我们应用自行实现,并拒绝除此功能外的回答。

一、mcp搭建

1.1 环境

jdk17、springboot3.2、Trae

1.2 mcp配置

spring AI依赖共计三种方式。

1、支持STDIO(标准流)传输的核心服务器

spring-ai-starter-mcp-server

2、基于Spring MVC的SSE传输实现

spring-ai-starter-mcp-server-webmvc

3、基于Spring WebFlux的SSE传输实现

spring-ai-starter-mcp-server-webflux

二、上代码

talk is cheap, show me your code。

2.1 pom依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.hippo.spring.tools.ai</groupId>
        <artifactId>springboot-ai-demos</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.hippo.spring.tools.ai.springai.mcp</groupId>
    <artifactId>springai-mcp-server-demo</artifactId>
    <packaging>jar</packaging>

    <name>springai-mcp-server-demo</name>
    <url>http://maven.apache.org</url>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>1.0.0-M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>3.2.4</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- 实际要用到的依赖,要放在dependencies内 -->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.hippo.spring.tools.ai.springai.mcp.McpApp</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.2 服务层

/**
 * @desc 执行项服务接口
 */
public interface IJointExecItemService {
    /**
     * @Desc  获取计算结果
     * @param validChainParamsDTO
     * @return JointExamItemResultDTO
     * @author hippo
     */
    ProbExecResult getJointExamItemCalculateResult(ValidChainParamsDTO validChainParamsDTO);
}

服务实现层,使用@Tool定义为MCP工具

@Tool(description = "获取统考计算概率结果值")
    @Override
    public ProbExecResult getJointExamItemCalculateResult(ValidChainParamsDTO validChainParamsDTO) {
        if(null == validChainParamsDTO){
            return null;
        }

        /** 省批次线、院校控制线等校验 **/
        jointScorePassingLineHandle.next(batchLineHandle);
        batchLineHandle.next(schoolControllerLineHandle);
        schoolControllerLineHandle.next(scoreLimitHandle);
        scoreLimitHandle.next(subjectLimitHandle);
        ValidChainResultDTO validChainResultDTO = jointScorePassingLineHandle.doValid(validChainParamsDTO);
        if(null != validChainResultDTO.getLineLimitType()){
            return ProbExecResult.error(validChainResultDTO.getLineLimitType());
        }
        return parallelCalculate.getProbability(validChainParamsDTO);
    }

2.3 配置类

/**
 * @desc 工具配置类
 */
@Configuration
public class ToolConfig {

    /**
     * 通过Spring beans实现工具规范配置
     * 用户信息、计算配置查询 查询tools
     * @param userService
     * @return
     */
    @Bean
    public ToolCallbackProvider userTools(IUserService userService, IJointExecItemService jointExecItemService) {
        return MethodToolCallbackProvider.builder().toolObjects(userService, jointExecItemService).build();
    }

三、mcp配置文件

共计包含内容:
mcpServers:mcp名称
hippo-mcp-server:服务名
command:命令,使用java启动命令,可以指定不同版本jdk,示例为jdk17
args:参数,最后一项为项目打包的jar的地址

{
  "mcpServers": {
    "hippo-mcp-server": {
      "command": "/Library/Java/JavaVirtualMachines/liberica-jdk-17.jdk/Contents/Home/bin/java",
      "args": [
        "-Dspring.ai.mcp.server.stdio=true",
        "-Dspring.main.web-application-type=none",
        "-Dlogging.pattern.console=",
        "-jar",
        "/Users/*/target/springai-mcp-server-demo-1.0-SNAPSHOT.jar"
      ],
      "env": {}
    }
  }
}

四、Trae配置

4.1 配置mcp

进入Trae主界面,右侧的对话上方的设置,点击后,选择MCP,手动添加,将配置贴入并保存。
启动后可以发现注册了三个服务。

4.2 配置智能体

1、选择智能体,创建自定义智能体。
2、选择MCP为自定义的MCP。
3、选择所有工具,保存

4.3 使用自定义智能体

1、选择自定义智能体,选择项目保存位置
2、输入问题:

我的投档分数为500,预计的院校要求投档最低分为480,求概率。

3、智能体回复
首先会按输入内容分析,将问题匹配对应的MCP工具,将参数解析为工具所需参数,调用服务,返回计算结果。


也可以微信搜索公众号:Java程序员那些事
最新文章会在公众号优先发布,感谢关注。
在这里插入图片描述
关注后发送代码获取案例代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夜之雨

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值