Spring AI使用tool Calling和MCP的示例详解

SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等场景,通过统一接口降低开发成本,实现如星座运势等复杂功能的灵活集成,本文给大家介绍Spring AI使用tool Calling和MCP的示例,感兴趣的朋友一起看看吧

目录
  • 深入探索 Spring AI
    • 聊天接口示例
    • Function Calling
    • MCP
      • STDIO
      • SSE
    • 结束语

    深入探索 Spring AI

    Spring AI版本1.0.0.M6

    在人工智能与软件开发深度融合的时代,Spring AI 作为一个强大的框架,持续为开发者提供着高效且便捷的工具,以实现与大语言模型(LLM)的无缝交互。Spring AI 的最新版本引入了一系列令人瞩目的特性,其中 Function Calling 到 Tool Calling 的转换以及模型上下文协议(MCP)的应用,标志着该框架在 AI 集成领域的又一次重大飞跃。

    聊天接口示例

    在今天的内容之前我们回忆下如何使用SpringAI实现一个简单的聊天接口,使用千问API实现聊天功能:

    1. 添加依赖
        com.alibaba.cloud.ai
        spring-ai-alibaba-starter
     
    1. 配置
    spring:
      ai:
        ## Alibaba
        dashscope:
          api-key: ${DASH_SCOPE_API_KEY}
          chat:
            enable: true
            options:
              model: qwen-max
    1. 实现
    @Bean
    public ChatClient chatClient(ChatClient.Builder chatClientBuilder) throws IOException {
        var chatClient = chatClientBuilder
                .defaultSystem("You are a helpful assistant.")
                .defaultAdvisors(new SimpleLoggerAdvisor()) // LOG
                .build();
        return chatClient;
    }
    /**
     * 调用
     * @param message
     * @return
     */
    public String completion(String message) {
        return chatClient
                .prompt().user(message)
                .call().content();
    }

    当进行下面的提问时:

    现在北京时间几点了?

    很遗憾,我无法直接获取实时的北京时间。你可以查看设备上的时间或者通过网络搜索来获取准确的北京时间。如果你使用的是电脑或手机,通常在屏幕的一角会显示当前的时间。

    Function Calling

    在早期的 AI 交互中,Function Calling 是一种常见的机制,允许模型在生成回复时调用外部函数以获取额外信息。然而,这种方式在扩展性和灵活性上存在一定的局限性。而 Spring AI 最新版本引入的 Tool Calling 则是对 Function Calling 的进一步演进。Tool Calling 将函数调用抽象为工具调用,将工具视为可复用的资源,模型可以根据需求动态调用这些工具,以完成更复杂的任务。在新版本中已经被改为Tool Calling。

    工具主要用于:

    信息检索

    此类工具可用于从外部来源(例如数据库、Web 服务、文件系统或 Web
    搜索引擎)检索信息。其目标是增强模型的知识,使其能够回答原本无法回答的问题。因此,它们可用于检索增强生成 (RAG)
    场景。例如,可以使用工具检索给定位置的当前天气、检索最新新闻文章或查询数据库中的特定记录。

    采取行动

    此类别中的工具可用于在软件系统中采取行动,例如发送电子邮件、在数据库中创建新记录、提交表单或触发工作流。其目标是自动化原本需要人工干预或明确编程的任务。例如,可以使用工具为与聊天机器人交互的客户预订航班、在网页上填写表单,或在代码生成场景中基于自动化测试 (TDD) 实现 Java 类。

    尽管我们通常将工具调用称为模型功能,但实际上工具调用逻辑是由客户端应用程序提供的。模型只能请求工具调用并提供输入参数,而应用程序负责根据输入参数执行工具调用并返回结果。

    Spring AI 提供了便捷的 API 来定义工具、解析来自模型的工具调用请求以及执行工具调用。

    为了解决上面关于时间问题的解决方案,我们可以定义一个工具,并嵌入到模型中…

    public class TimeTools {
        private static final Logger logger = LoggerFactory.getLogger(TimeTools.class);
        @Tool(description = "Get the time of a specified city.")
        public String getCityTimeMethod(@ToolParam(description = "Time zone id, such as Asia/Shanghai") String timeZoneId) {
            logger.info("The current time zone is {}", timeZoneId);
            return String.format("The current time zone is %s and the current time is " + "%s", timeZoneId, ZoneUtils.getTimeByZoneId(timeZoneId));
        }
    }
    public ChatClient chatClient(ChatClient.Builder chatClientBuilder) throws IOException {
        // ...
        chatClientBuilder.defaultTools(timeTool);
        // ...
    }

    Function Calling实现了大语言模型(LLM)与外部函数或工具进行交互的能力。这一机制赋予了 AI 系统更强大的功能和灵活性,使其能够处理更加复杂和动态的任务。

    注意不是所有模型都支持FunctionCalling

    MCP

    MCP(Model Context Protocol,模型上下文协议) 是的一种开放协议,旨在统一大语言模型(LLM)与外部数据源、工具和服务之间的交互标准,推动 AI 应用的标准化和去中心化发展。
    MCP 提供了一种统一的接口,使得不同的工具和服务可以以标准化的方式与模型进行交互。

    核心功能

    • 标准化交互
    • MCP 提供了一套通用的通信协议、数据格式和规则,使 LLM 能够以统一的方式与外部资源(如数据库、API、文件系统等)进行交互,无需为每个工具单独开发适配接口。
    • 增强模型能力
    • 通过 MCP,LLM 可以动态调用外部工具或数据源,例如实时获取天气信息、查询数据库、调用第三方服务等,从而扩展模型的功能边界。
    • 安全与合规
    • MCP 内置了安全机制,确保数据传输的安全性,并支持细粒度的权限控制,避免数据泄露和滥用。
    • 降低开发成本
    • 开发者无需重复造轮子,可直接基于 MCP 协议构建 AI 应用,显著减少开发时间和成本。

    在1.0.0-M6版本中引入了MCP,使得可以基于Spring AI实现各种扩展

    此时聊天应用作MCP服务的调用者,也就是客户端,需要调用外部的MCP服务,首先对聊天服务改造:

    1. 添加必要的依赖:
        org.springframework.ai
        spring-ai-mcp-client-spring-boot-starter
    
    1. 通过配置ChatClient完成集成:
        @Bean
        public ChatClient chatClient(ToolCallbackProvider toolsProvider) throws IOException {
            var chatClient = chatClientBuilder
                    // ...
                    .defaultTools( toolsProvider.getToolCallbacks() ) //mcp
                    // ...
                    .build();
            return chatClient;
        }

    SpringAI中,MCP 客户端支持两种传输方式:STDIO 和 SSE。
    标准启动器通过STDIO(进程内)和/或SSE(远程)传输同时连接到一个或多个 MCP 服务器。SSE 连接使用基于 HttpClient 的传输实现。每个与 MCP 服务器的连接都会创建一个新的 MCP 客户端实例。

    STDIO

    其实就是通过本地命令进行调用的实现,需要注意的是,返回的数据结果必须遵循MCP规范,我们可以基于Spring开发一个可执行的jar程序包,然后由客户端调用。

    • 添加依赖
      org.springframework.ai
      spring-ai-mcp-server-spring-boot-starter
     
    • 实现Tool并注册
    @Service
    public class TranslationService {
        @Tool(description = "将内容翻译成英文")
        public String translate(String content) {
            return "hello";
        }
    }
    @Bean
    public ToolCallbackProvider weatherTools(TranslationService translationService) {
       return MethodToolCallbackProvider.builder().toolObjects(translationService).build();
    }
    • 添加配置,注意这里要关掉所有日志相关的输出
    spring:
       main:
          web-application-type: none
          banner-mode: off
       ai:
          mcp:
             server:
                name: translation-server
                version: 0.0.1
    logging:
       level:
          root: off 
    • 打包,记得使用spring-boot-maven-plugin插件打包,下面的mcpServers引用的就是这里的jar
    • 修改聊天应用配置,并且重启
    spring:
      ai:
        mcp:
          client:
            type: SYNC
            stdio:
              servers-configuration: classpath:mcp-stdio-servers.json

    mcp-stdio-servers.json

    {
       "mcpServers": {
          "weather": {
             "command": "java",
             "args": [
                "-Dspring.ai.mcp.server.stdio=true",
                "-Dspring.main.web-application-type=none",
                "-Dlogging.pattern.console=",
                "-jar",
                "your_jar_path/mcp-stdio-server-1.0.1-SNAPSHOT.jar"
             ],
             "env": {}
          }
       }
    }

    提问: 翻译单词运势

    回答: 看起来在处理您的请求时发生了一些混淆。单词"运势"的正确英文翻译应为 “fortune” 而非 “hello”。如果您需要关于星座运势的信息,请告诉我您的星座名称。如果是其他类型的运势,请提供更多的细节。

    因为我没有实现,全部返回的是hello,看样子模型对我们的结果进一步做了处理

    SSE

    这里提供一个简单的示例,主要实现星座运势获取的Mcp,这是一个单独的基于Spring开发的应用,与上面的聊天应用隔离:

    • 引入相关依赖
       org.springframework.ai
       spring-ai-mcp-server-webmvc-spring-boot-starter
    
    1. 定义Tool实现
    @Service
    public class HoroscopeService {
        private String url = "https://apis.tianapi.com/star/index?key=%s&astro=%s";
        private String key = "xx";
        private RestTemplate restTemplate = new RestTemplate();
        private ObjectMapper objectMapper = new ObjectMapper();
        @Tool(description = "Get constellation fortune by consName")
        public String getFortune(String consName) {
            Map map = restTemplate.getForObject(String.format(url, key, consName), Map.class);
            try {
                return objectMapper.writeValueAsString(map.get("result"));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
                return "获取失败:"+ e.getMessage();
            }
        }
    }
    • 配置文件
    spring:
       ai:
          mcp:
             server:
                name: webmvc-mcp-server
                version: 1.0.0
                type: SYNC
                sse-message-endpoint: /mcp/messages
    server:
       port: 8081
       servlet:
          encoding:
             charset: utf-8
             enabled: true
             force: true 
    • 启动应用,访问:http://localhost:8081
    • 修改聊天应用配置,并且重启
    spring:
      ai:
        mcp:
          client:
            type: SYNC
            sse:
               connections:
                  constellation:
                     url: http://localhost:8081

    提问: 白羊座的运势

    回答: 今天白羊座的运势如下: - 综合指数:80% - 爱情指数:70% - 工作指数:55% - 财运指数:65% - 健康指数:80% - 幸运颜色:蓝色 - 幸运数字:5 - 贵人星座:射手座 今日概述:今天你可能会忍不住向另一半抱怨工作上遇到的问题,但这样也会给对方带来困扰。在感情中,要注意不要过多地向对方发泄负面情绪,而应该把温暖和幸福带给他们。

    结束语

    现阶段的AI技术,恰似一台功能强大却需精心调校的计算机系统。它并非“即插即用”的万能工具,而是需要开发者如同配置硬件般,根据特定业务场景的需求,按需增加“认知模块”与“计算资源”。这种灵活扩展的能力,与模块化计算平台(MCP,Modular Computing Platform)的设计理念不谋而合——通过标准化接口与可组合架构,让AI系统既能像积木般自由拼接算法能力,又能像云计算般弹性调度算力资源。开发者需像搭建乐高城堡般,将自然语言处理、视觉识别、决策推理等模块按需组合,再通过数据管道与反馈机制持续优化,最终让AI在医疗诊断、智能制造、智慧城市等垂直领域中,展现出接近专家水平的场景化智能

    到此这篇关于Spring AI使用tool Calling和MCP的示例详解的文章就介绍到这了,更多相关spring ai tool calling和mcp内容请搜索骃骐网以前的文章或继续浏览下面的相关文章希望大家以后多多支持骃骐网!

    您可能感兴趣的文章:

    • spring boot hutool整合email的详细过程
    • springboot使用小工具之Lombok、devtools、Spring Initailizr详解

    相关推荐:

    Python数据标准化用哪个方案好_StandardScaler与MinMaxScaler详解

    StandardScaler不适用于明显偏态或含大量异常值的数据,因其依赖的均值和标准差易被离群点污染,导致正常数据被压缩到极窄范围,影响模型性能;必须训练集fit_transform、测试集transform,避免数据泄露。 StandardScaler 什么时候不能用 当你的数据明显偏离正态分布,或者存在大量异常值时,StandardScaler 的效果会变差。它依赖均值和标准差,而这两个统计...

    怎么理解CSS浮动_CSS浮动原理与清除浮动方法详解教程

    浮动通过脱离文档流实现元素左/右对齐,导致父元素高度塌陷;常用清除方法包括clear属性、overflow设置和伪元素clearfix;现代布局中,float仍适用于文本环绕图片等简单场景,而复杂布局推荐使用Flexbox或Grid。 CSS浮动,说白了,就是让一个元素脱离常规的文档流,像浮在水面上一样,沿着其父容器的左侧或右侧移动,直到遇到父容器的边缘或者另一个浮动元素。它最早是为了实现文本环绕...

    实现带平滑过渡效果的悬停Logo图片:CSS技巧详解

    本教程详细介绍了如何利用CSS的绝对定位和不透明度属性,为网页头部(header)的Logo图片实现平滑的悬停切换效果。通过将两张图片叠加并控制其中一张的透明度与过渡时间,我们能够创建出专业的视觉交互,避免生硬的图片替换,提升用户体验。问题分析 在网页设计中,为logo或其他交互元素添加悬停效果是提升用户体验的常见做法。当需要在鼠标悬停时将一个logo图片替换为另一个logo图片,并且希望这个替换...

    《生化奇兵》之父新作《犹大》新情报 朋友交恶新系统

    由《生化奇兵》系列缔造者Ken Levine领衔的Ghost Story Games,于2022年揭晓了其全新力作《犹大》(Judas)。近日,官方再度释出关于这款备受期待作品的最新情报,重点介绍了一项名为“Villainy”的创新机制,引发玩家广泛关注。 本作开发代号为“Project Replay”,核心设计理念围绕高度重玩价值展开。早在2015年,Levine便提出了“叙事乐高”(Narra...

    Golang数据类型详解 基本类型与零值

    Golang基本类型包括整型、浮点型、布尔型、字符串型和复数类型,各自零值为0、0.0、false、""、(0+0i),理解零值可避免未初始化错误、确保条件判断正确及数据结构安全初始化。 Golang的数据类型可以分为基本类型和复合类型。基本类型包括整型、浮点型、布尔型和字符串型,每种类型都有其默认的零值。了解这些零值对于编写健壮的Golang程序至关重要。 Golang数据类型详解:基本类型与零...

    与任天堂叫板? 索尼或将于9月举办Showcase或State of Play演示

    索尼互动娱乐或将于2025年9月举办playstation showcase大型发布会或state of play直播发布会。 在最新一期《Giant Bomb》的"Game Mess晨间播客"中,知名游戏业爆料人、联合主持人杰夫·格鲁布透露,他相当肯定索尼互动娱乐正筹划在2025年9月底举办State of Play或PlayStation Showcase活动。格鲁布认为,Haven工作室开发...

    SOAP over FTP可能吗?非HTTP传输示例?

    SOAP可通过FTP传输,因其实质为XML文本,但需封装成文件并轮询处理,效率低;而HTTP具备请求-响应模型、状态码、头部元数据、HTTPS加密及广泛工具支持,与SOAP天然契合,故成首选;非HTTP场景下,SMTP适用于异步离线通信,JMS/MQ用于高可靠解耦系统,但均面临缺乏标准响应机制、安全性弱、开发复杂等挑战。 SOAP消息通过FTP传输,从技术上讲是可行的,因为SOAP本质上就是XML...

    《孤岛惊魂》版生存射击?《Lost Rift》发售日公布

    前几天我突然冒出一个念头:“要是能玩到一款像《孤岛惊魂1》那样的生存游戏就好了。”你懂的,那种充满郁郁葱葱热带岛屿、开放世界、雇佣兵枪战的2004年Crytek开山之作,但同时你还能从自己亲手建造的基地出发,规划并执行任务。我也说不清为啥会突然想到这个。大概是因为我最近沉迷于《非生物因素(Abiotic Factor)》吧,后者是一款背景设定在巨大地下研究所、受《半条命》启发的生存游戏——于是脑子...

    SOAP消息示例?一个完整请求响应过程?

    SOAP请求响应过程始于客户端构造包含操作和参数的XML消息并发送至服务端,服务端解析后执行业务逻辑,再返回包含结果或错误信息的SOAP响应,客户端接收后解析并处理结果或异常。 SOAP消息是基于XML的,用于在分布式环境中交换结构化信息的协议,通常通过HTTP承载。一个完整的SOAP请求响应过程,简单来说,就是客户端按照特定格式构造XML消息发送给服务端,服务端处理后,再以XML消息格式返回结果...

    《撞车嘉年华2》抢先体验三号大更新将于8月份推出

    《撞车嘉年华2》在thq nordic最新发布会上确认:开发进展顺利,正沿着抢先体验路线图稳步前行。 随着一段全新预告片的发布,大量激烈的赛车竞速与碰撞场面曝光,玩家也得以更深入地了解本作未来的更新规划。 此前,第一波内容更新已于5月实装,第二波更新紧接在6月上线,而备受期待的第三波更新——包含全新赛道与车辆——计划于今年8月正式推出。开发商Bugbear Entertainment持续积极收集玩...