最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2025年07月26日 10:30:48   作者:_沉浮_  
SpringAI1.0.0.M6引入ToolCalling與MCP協(xié)議,提升AI與工具交互的擴展性與標準化,支持信息檢索、行動執(zhí)行等場景,通過統(tǒng)一接口降低開發(fā)成本,實現(xiàn)如星座運勢等復雜功能的靈活集成,本文給大家介紹Spring?AI使用tool?Calling和MCP的示例,感興趣的朋友一起看看吧

深入探索 Spring AI

Spring AI版本1.0.0.M6

在人工智能與軟件開發(fā)深度融合的時代,Spring AI 作為一個強大的框架,持續(xù)為開發(fā)者提供著高效且便捷的工具,以實現(xiàn)與大語言模型(LLM)的無縫交互。Spring AI 的最新版本引入了一系列令人矚目的特性,其中 Function Calling 到 Tool Calling 的轉(zhuǎn)換以及模型上下文協(xié)議(MCP)的應(yīng)用,標志著該框架在 AI 集成領(lǐng)域的又一次重大飛躍。

聊天接口示例

在今天的內(nèi)容之前我們回憶下如何使用SpringAI實現(xiàn)一個簡單的聊天接口,使用千問API實現(xiàn)聊天功能:

  1. 添加依賴
<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter</artifactId>
</dependency> 
  1. 配置
spring:
  ai:
    ## Alibaba
    dashscope:
      api-key: ${DASH_SCOPE_API_KEY}
      chat:
        enable: true
        options:
          model: qwen-max
  1. 實現(xiàn)
@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;
}
/**
 * 調(diào)用
 * @param message
 * @return
 */
public String completion(String message) {
    return chatClient
            .prompt().user(message)
            .call().content();
}

當進行下面的提問時:

現(xiàn)在北京時間幾點了?

很遺憾,我無法直接獲取實時的北京時間。你可以查看設(shè)備上的時間或者通過網(wǎng)絡(luò)搜索來獲取準確的北京時間。如果你使用的是電腦或手機,通常在屏幕的一角會顯示當前的時間。

Function Calling

在早期的 AI 交互中,F(xiàn)unction Calling 是一種常見的機制,允許模型在生成回復時調(diào)用外部函數(shù)以獲取額外信息。然而,這種方式在擴展性和靈活性上存在一定的局限性。而 Spring AI 最新版本引入的 Tool Calling 則是對 Function Calling 的進一步演進。Tool Calling 將函數(shù)調(diào)用抽象為工具調(diào)用,將工具視為可復用的資源,模型可以根據(jù)需求動態(tài)調(diào)用這些工具,以完成更復雜的任務(wù)。在新版本中已經(jīng)被改為Tool Calling。

工具主要用于:

信息檢索

此類工具可用于從外部來源(例如數(shù)據(jù)庫、Web 服務(wù)、文件系統(tǒng)或 Web
搜索引擎)檢索信息。其目標是增強模型的知識,使其能夠回答原本無法回答的問題。因此,它們可用于檢索增強生成 (RAG)
場景。例如,可以使用工具檢索給定位置的當前天氣、檢索最新新聞文章或查詢數(shù)據(jù)庫中的特定記錄。

采取行動

此類別中的工具可用于在軟件系統(tǒng)中采取行動,例如發(fā)送電子郵件、在數(shù)據(jù)庫中創(chuàng)建新記錄、提交表單或觸發(fā)工作流。其目標是自動化原本需要人工干預(yù)或明確編程的任務(wù)。例如,可以使用工具為與聊天機器人交互的客戶預(yù)訂航班、在網(wǎng)頁上填寫表單,或在代碼生成場景中基于自動化測試 (TDD) 實現(xiàn) Java 類。

盡管我們通常將工具調(diào)用稱為模型功能,但實際上工具調(diào)用邏輯是由客戶端應(yīng)用程序提供的。模型只能請求工具調(diào)用并提供輸入?yún)?shù),而應(yīng)用程序負責根據(jù)輸入?yún)?shù)執(zhí)行工具調(diào)用并返回結(jié)果。

Spring AI 提供了便捷的 API 來定義工具、解析來自模型的工具調(diào)用請求以及執(zhí)行工具調(diào)用。

為了解決上面關(guān)于時間問題的解決方案,我們可以定義一個工具,并嵌入到模型中…

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實現(xiàn)了大語言模型(LLM)與外部函數(shù)或工具進行交互的能力。這一機制賦予了 AI 系統(tǒng)更強大的功能和靈活性,使其能夠處理更加復雜和動態(tài)的任務(wù)。

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

MCP

MCP(Model Context Protocol,模型上下文協(xié)議) 是的一種開放協(xié)議,旨在統(tǒng)一大語言模型(LLM)與外部數(shù)據(jù)源、工具和服務(wù)之間的交互標準,推動 AI 應(yīng)用的標準化和去中心化發(fā)展。
MCP 提供了一種統(tǒng)一的接口,使得不同的工具和服務(wù)可以以標準化的方式與模型進行交互。

核心功能

  • 標準化交互
  • MCP 提供了一套通用的通信協(xié)議、數(shù)據(jù)格式和規(guī)則,使 LLM 能夠以統(tǒng)一的方式與外部資源(如數(shù)據(jù)庫、API、文件系統(tǒng)等)進行交互,無需為每個工具單獨開發(fā)適配接口。
  • 增強模型能力
  • 通過 MCP,LLM 可以動態(tài)調(diào)用外部工具或數(shù)據(jù)源,例如實時獲取天氣信息、查詢數(shù)據(jù)庫、調(diào)用第三方服務(wù)等,從而擴展模型的功能邊界。
  • 安全與合規(guī)
  • MCP 內(nèi)置了安全機制,確保數(shù)據(jù)傳輸?shù)陌踩裕⒅С旨毩6鹊臋?quán)限控制,避免數(shù)據(jù)泄露和濫用。
  • 降低開發(fā)成本
  • 開發(fā)者無需重復造輪子,可直接基于 MCP 協(xié)議構(gòu)建 AI 應(yīng)用,顯著減少開發(fā)時間和成本。

在1.0.0-M6版本中引入了MCP,使得可以基于Spring AI實現(xiàn)各種擴展

此時聊天應(yīng)用作MCP服務(wù)的調(diào)用者,也就是客戶端,需要調(diào)用外部的MCP服務(wù),首先對聊天服務(wù)改造:

  1. 添加必要的依賴:
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
</dependency>
  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(進程內(nèi))和/或SSE(遠程)傳輸同時連接到一個或多個 MCP 服務(wù)器。SSE 連接使用基于 HttpClient 的傳輸實現(xiàn)。每個與 MCP 服務(wù)器的連接都會創(chuàng)建一個新的 MCP 客戶端實例。

STDIO

其實就是通過本地命令進行調(diào)用的實現(xiàn),需要注意的是,返回的數(shù)據(jù)結(jié)果必須遵循MCP規(guī)范,我們可以基于Spring開發(fā)一個可執(zhí)行的jar程序包,然后由客戶端調(diào)用。

  • 添加依賴
<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId>
</dependency> 
  • 實現(xiàn)Tool并注冊
@Service
public class TranslationService {
    @Tool(description = "將內(nèi)容翻譯成英文")
    public String translate(String content) {
        return "hello";
    }
}
@Bean
public ToolCallbackProvider weatherTools(TranslationService translationService) {
   return MethodToolCallbackProvider.builder().toolObjects(translationService).build();
}
  • 添加配置,注意這里要關(guān)掉所有日志相關(guān)的輸出
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
  • 修改聊天應(yīng)用配置,并且重啟
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": {}
      }
   }
}

提問: 翻譯單詞運勢

回答: 看起來在處理您的請求時發(fā)生了一些混淆。單詞"運勢"的正確英文翻譯應(yīng)為 “fortune” 而非 “hello”。如果您需要關(guān)于星座運勢的信息,請告訴我您的星座名稱。如果是其他類型的運勢,請?zhí)峁└嗟募毠?jié)。

因為我沒有實現(xiàn),全部返回的是hello,看樣子模型對我們的結(jié)果進一步做了處理

SSE

這里提供一個簡單的示例,主要實現(xiàn)星座運勢獲取的Mcp,這是一個單獨的基于Spring開發(fā)的應(yīng)用,與上面的聊天應(yīng)用隔離:

  • 引入相關(guān)依賴
<dependency>
   <groupId>org.springframework.ai</groupId>
   <artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId>
</dependency>
  1. 定義Tool實現(xiàn)
@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 
  • 啟動應(yīng)用,訪問:http://localhost:8081
  • 修改聊天應(yīng)用配置,并且重啟
spring:
  ai:
    mcp:
      client:
        type: SYNC
        sse:
           connections:
              constellation:
                 url: http://localhost:8081

提問: 白羊座的運勢

回答: 今天白羊座的運勢如下: - 綜合指數(shù):80% - 愛情指數(shù):70% - 工作指數(shù):55% - 財運指數(shù):65% - 健康指數(shù):80% - 幸運顏色:藍色 - 幸運數(shù)字:5 - 貴人星座:射手座 今日概述:今天你可能會忍不住向另一半抱怨工作上遇到的問題,但這樣也會給對方帶來困擾。在感情中,要注意不要過多地向?qū)Ψ桨l(fā)泄負面情緒,而應(yīng)該把溫暖和幸福帶給他們。

結(jié)束語

現(xiàn)階段的AI技術(shù),恰似一臺功能強大卻需精心調(diào)校的計算機系統(tǒng)。它并非“即插即用”的萬能工具,而是需要開發(fā)者如同配置硬件般,根據(jù)特定業(yè)務(wù)場景的需求,按需增加“認知模塊”與“計算資源”。這種靈活擴展的能力,與模塊化計算平臺(MCP,Modular Computing Platform)的設(shè)計理念不謀而合——通過標準化接口與可組合架構(gòu),讓AI系統(tǒng)既能像積木般自由拼接算法能力,又能像云計算般彈性調(diào)度算力資源。開發(fā)者需像搭建樂高城堡般,將自然語言處理、視覺識別、決策推理等模塊按需組合,再通過數(shù)據(jù)管道與反饋機制持續(xù)優(yōu)化,最終讓AI在醫(yī)療診斷、智能制造、智慧城市等垂直領(lǐng)域中,展現(xiàn)出接近專家水平的場景化智能

到此這篇關(guān)于Spring AI使用tool Calling和MCP的示例詳解的文章就介紹到這了,更多相關(guān)spring ai tool calling和mcp內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot結(jié)合JSR303對前端數(shù)據(jù)進行校驗的示例代碼

    SpringBoot結(jié)合JSR303對前端數(shù)據(jù)進行校驗的示例代碼

    這篇文章主要介紹了SpringBoot結(jié)合JSR303對前端數(shù)據(jù)進行校驗的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 詳解Lombok的坑

    詳解Lombok的坑

    這篇文章主要介紹了詳解Lombok的坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • RabbitMQ延時隊列詳解與Java代碼實現(xiàn)

    RabbitMQ延時隊列詳解與Java代碼實現(xiàn)

    這篇文章主要介紹了RabbitMQ延時隊列詳解與Java代碼實現(xiàn),RabbitMQ 延時隊列是指消息在發(fā)送到隊列后,并不立即被消費者消費,而是等待一段時間后再被消費者消費。這種隊列通常用于實現(xiàn)定時任務(wù),需要的朋友可以參考下
    2023-04-04
  • java判定數(shù)組或集合是否存在某個元素的實例

    java判定數(shù)組或集合是否存在某個元素的實例

    下面小編就為大家?guī)硪黄猨ava判定數(shù)組或集合是否存在某個元素的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java中char數(shù)組(字符數(shù)組)與字符串String類型的轉(zhuǎn)換方法

    Java中char數(shù)組(字符數(shù)組)與字符串String類型的轉(zhuǎn)換方法

    這篇文章主要介紹了Java中char數(shù)組(字符數(shù)組)與字符串String類型的轉(zhuǎn)換方法,涉及Java中toCharArray與valueOf方法的使用技巧,需要的朋友可以參考下
    2015-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)之單鏈表的實現(xiàn)與面試題匯總

    Java數(shù)據(jù)結(jié)構(gòu)之單鏈表的實現(xiàn)與面試題匯總

    由于順序表的插入刪除操作需要移動大量的元素,影響了運行效率,因此引入了線性表的鏈式存儲——單鏈表。本文為大家介紹了單鏈表的實現(xiàn)與面試題匯總,感興趣的可以了解一下
    2022-10-10
  • Java實現(xiàn)Markdown圖片批量本地化處理工具

    Java實現(xiàn)Markdown圖片批量本地化處理工具

    在日常使用Markdown時,我們常通過遠程URL引用圖片,所以本文小編就為大家詳細介紹一下如何使用Java實現(xiàn)Markdown圖片批量本地化處理吧
    2025-07-07
  • 微信支付java版本之查詢訂單

    微信支付java版本之查詢訂單

    這篇文章主要為大家詳細介紹了微信支付java版本之查詢訂單,為大家分享了微信支付訂單的查詢接口,感興趣的小伙伴們可以參考一下
    2016-08-08
  • MyBatis一二級緩存

    MyBatis一二級緩存

    這篇文章主要介紹了MyBatis一二級緩存的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-06-06
  • java 文件大數(shù)據(jù)Excel下載實例代碼

    java 文件大數(shù)據(jù)Excel下載實例代碼

    這篇文章主要介紹了java 文件大數(shù)據(jù)Excel下載實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04

最新評論

西藏| 木里| 清远市| 双辽市| 凤冈县| 珲春市| 新源县| 丰镇市| 库伦旗| 杨浦区| 全南县| 兴宁市| 临高县| 奉新县| 福建省| 东至县| 扬中市| 沽源县| 广汉市| 临湘市| 萍乡市| 开原市| 林甸县| 乌鲁木齐市| 利辛县| 尉犁县| 治县。| 托克托县| 沙雅县| 平邑县| 赞皇县| 清镇市| 鲁山县| 潞城市| 静宁县| 芒康县| 商水县| 平泉县| 诸城市| 陵川县| 宜州市|