【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的關系是什么?

文章目錄

  • 背景:什么是Agent?
  • 背景:為什么需要Function Calling或者MCP?
  • Function Calling和MCP在用戶請求中的整體流程
  • Function Calling(函數/工具調用)
  • MCP (Model Context Protocol)
  • ReAct (Reasoning and Action)
  • 參考資料

背景:什么是Agent?

在《LLM Powered Autonomous Agents》中有這樣一張圖,描述了Agent和tool、planning、action、memory的關系。
Agent是一個智能體,具備自主決策和執行任務的能力。比如Agent可以根據用戶的需求,自動選擇合適的工具和數據源來完成特定的任務。Agent也可以被看作是一個“項目經理”,負責協調和管理各種資源和工具,確保任務能夠高效地完成。比如一個旅游規劃Agent可以利用MCP 調用航班查詢、酒店預訂、天氣API等服務,為用戶規劃個性化的旅行行程。
在這里插入圖片描述

背景:為什么需要Function Calling或者MCP?

預訓練大模型是具有知識的時效性的,所以超過其知識范圍的問題會無法回答。此時如果允許去調用外界的函數(比如在線查詢天氣),那大模型就具有了回答這些問題的能力。
在這里插入圖片描述

Function Calling和MCP在用戶請求中的整體流程

總體流程如下,用戶提出請求,傳到服務器,服務器會將用戶請求&可用工具列表一起發送給大模型(或API),大模型會返回選擇調用的工具給服務器,然后服務器會進一步調用該工具,返回工具執行結果給大模型做最后的答案整理。
值得注意的是,下面藍框是Function Calling,紅框是MCP:

  • Function Calling:指大模型具有“解析工具列表、挑選工具名稱并給出工具參數、解析工具執行結果”的這一系列能力!所以說Function Calling是定義了大模型的一種能力。
  • MCP:定義了一套規范的、可以更好地讓大模型調用工具的協議,與大模型無關

當然紅框中也可以不用MCP,這里直接用https協議或者SDK去聯網查詢天氣信息即可。MCP將在后文中講解。
在這里插入圖片描述

Function Calling(函數/工具調用)

Function Calling的基礎實現如下,整個流程和上述一致,注意所有的上下文信息都被存儲到了self.history這個列表中。

def process_user_query(self, query):self.history.append({"role": "user", "content": query})first_model_response = self.call_model()first_model_message = first_model_response["choices"][0]["message"]self.history.append(first_model_message)# 檢查模型是否需要調用工具if "tool_calls" in first_model_message and first_model_message["tool_calls"]:tool_call = first_model_message["tool_calls"][0]tool_name = tool_call["function"]["name"]tool_args = json.loads(tool_call["function"]["arguments"])result = self.execute_tool(tool_name, tool_args)self.history.append({"role": "tool","tool_call_id": tool_call["id"],"name": tool_name,"content": result})second_response_data = self.call_model_after_tool_execution()final_message = second_response_data["choices"][0]["message"]self.history.append(final_message)return {"tool_name": tool_name,"tool_parameters": tool_args,"tool_executed": True,"tool_result": result,"final_response": final_message["content"],}else:return {"final_response": first_model_message["content"],}

MCP (Model Context Protocol)

MCP實現的效果也是讓大模型具有借助外界工具解決問題的能力。
在這里插入圖片描述
在這里插入圖片描述

在MCP中,有一個實體叫做“MCP Host”(比如Cursor、Cline),還有一個實體叫做“MCP Server”(不是服務器!而是一個程序,其中包含了一系列可以使用的工具)。在下面的例子中,MCP Host用的Cline,MCP Server是天氣程序,提供了天氣預測和預警的兩個工具。
在這里插入圖片描述
所以可以看到,我們希望MCP具有什么外部功能,是由MCP Server這個程序所決定的,其中包含了具體可調用的工具。那么MCP Server如何實現呢?

  1. 第一種方式是自己手寫代碼實現(這個比較復雜,可以調用Python的FastMCP庫去實現);
  2. 第二種方法是去找別人寫好的MCP Server,直接安裝即可!下面給了三個常用的MCP Server網站,可以實現想要的功能(比如查詢天氣、網頁內容抓取):
    • https://mcp.so/
    • https://mcpmarket.com/zh
    • https://smithery.ai/

到這里我們更加可以意識到一個事情:MCP協議是和大模型無關的,或者說大模型無需感知到MCP協議的。而Function Calling則是定義的大模型可以去挑選工具的一種能力,是和大模型自身息息相關的。(如果理解有誤,請大家指正出來🙏)

ReAct (Reasoning and Action)

ReAct框架是基于思維鏈(CoT)實現的,總共有三個流程:Reasoning => Action => Observation。最基本的要求是這個大模型要具備CoT的能力。
通過在prompt中告訴大模型有哪些工具可以調用(工具列表),以及每一個工具的作用是什么(工具說明書),然后要求大模型在輸出的時候一步一步思考,是否需要調用提供的工具,如果需要調用工具,那么要求模型輸出固定的格式,再通過編寫代碼的方式來調用。
下圖對比了不同的大模型的設計模式,ReAct算是過程最完整的一種模式:
在這里插入圖片描述
我理解ReAct是一種大模型的設計模式,整個過程中都是這個大模型在進行持續的Reasoning => Action => Observation過程,而沒有被打斷后重新去調用大模型的情況。核心就是要在prompt中提前定義清楚工具列表和工具說明書,讓大模型在思考過程中去自主使用,并且action也是基于生成的代碼去執行。而Function Calling和MCP應該會因為調用工具所以被打斷調用,需要得到工具執行結果后重新調用大模型。最后,ReAct和Function Calling、MCP可以兼容使用。
(上面這段理解我很不確定,需要check,如有錯誤,歡迎指出🙏)

7.5更正:上面的說法應該不太對,ReAct雖然可以不斷地Reasoning => Action => Observation去reflect,但是一旦調用了外部的工具,那肯定還是會被打斷的,也就是需要將工具執行的結果拼接到上下文中,重新輸入給大模型去推理。或者說是interleaved的間斷過程。但如果說考慮另一種情況,某個工具只是單純想讓模型根據函數的代碼內容去執行一些簡單邏輯(比如文本匹配),這個工具就只需要定義清楚參數和功能,prompt里給清楚這個工具的說明,當模型挑選到這個工具時,就可以直接通過模型自身去執行了,這種情況不會被打斷,上下文是存在了KV cache中。
(這么說正確嗎?還需要check這里的后一種情況)

參考資料

  • MCP 與 Function Calling 到底什么關系
  • MCP終極指南 - 從原理到實戰,帶你深入掌握MCP(基礎篇)
  • 《一文讀懂大模型三大核心技術:ReAct、Function Call 與 MCP 的奧秘》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90322.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CANDENCE 17.4 進行元器件緩存更新

在我從立創商城導入CANDENCE元器件后,在ORCAD放置元器件時出現了下面的錯誤解決辦法:1、在左邊找到 Design Cache文件夾,在文件夾上鼠標右擊選擇 Cleanup Cache2、再放置該元器件,不管這個,點擊確定3、這時候成功放上…

深入理解Kafka冪等性:原理、邊界與最佳實踐

一、什么是真正的消息冪等性? 消息系統的冪等性經常被誤解,我們需要明確其精確含義和能力邊界: 1. 正確定義 Kafka冪等性保證的是:在消息傳輸過程中,無論因網絡重試、生產者重啟等故障導致的消息重復發送,B…

【RTSP從零實踐】8、多播傳輸H264碼流的RTSP服務器——最簡單的實現例子(附帶源碼)

😁博客主頁😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客內容🤑:🍭嵌入式開發、Linux、C語言、C、數據結構、音視頻🍭 🤣本文內容🤣&a…

【Linux】基礎開發工具(3)

1. 版本控制器Git1.1 Git的簡史Git 的歷史可以追溯到 2005 年1。當時 Linux 內核項目的開發團隊一直使用 BitKeeper 進行版本管理,但由于一位 Linux 開發成員寫了一個連接 BitKeeper 倉庫的外掛,BitMover 公司決定中止 Linux 免費使用 BitKeeper 的授權1…

synchronized 的使用和特性

synchronized 鎖對象 普通方法 synchronized 鎖普通方法時,其鎖的對象是調用該方法的實例 public synchronized void method() { // 方法體 } 靜態方法 靜態方法的鎖對象是所屬的 class,全局只有一個。 public static synchronized void staticMetho…

Gin Web 層集成 Viper 配置文件和 Zap 日志文件指南(下)

在微服務架構中,Gin 常被用作 Web 層框架,而 Viper 用于管理配置文件,Zap 則提供高性能的日志記錄功能。下面將詳細介紹如何在 Gin Web 層集成 Viper 配置文件和 Zap 日志文件。 1. 項目概述 假設我們有一個基于 Go 語言的微服務項目&#…

IoTDB:專為物聯網場景設計的高性能時序數據庫

什么是IoTDB?IoTDB(Internet of Things Database)是一款開源的時序數據庫管理系統,專為物聯網(IoT)場景設計,由清華大學軟件學院團隊自研,天謀科技團隊負責維護。它針對物聯網數據的…

[netty5: MessageAggregator HttpObjectAggregator]-源碼解析

在閱讀這篇文章前,推薦先閱讀 [netty5: ByteToMessageCodec & MessageToByteEncoder & ByteToMessageDecoder]-源碼分析[netty5: HttpObject]-源碼解析 100-continue 100-continue 是 HTTP/1.1 協議中的一種機制,用于客戶端在發送大體積請求體…

前端學習1--行內元素 vs 塊級元素(基礎概念+案例實操)

一、內外邊距學習:(1)簡單理解:padding為內邊距。padding不會影響元素的位置,只會調整元素的內容(文字)與邊框之間的間距。margin為外邊距。margin會影響元素在流式布局中的位置,改變…

Express + mysql2 + jwt 實現簡單的登錄鑒權

目前項目中使用Express 實現簡單API功能,需要提供一套登錄鑒權方案。這邊是API側實現 相關路由的登錄鑒權。大體思路:就是,登錄接口中通過jwt加密 token返回前端,前端其他接口把加密好的放入請求頭Authorization中。中間件通過請求…

ReAct (Reason and Act) OR 強化學習(Reinforcement Learning, RL)

這個問題觸及了現代AI智能體(Agent)構建的兩種核心思想。 簡單來說,ReAct 是一種“調用專家”的模式,而強化學習 (RL) 是一種“從零試錯”的模式。 為了讓你更清晰地理解,我們從一個生動的比喻開始,然后進行…

iTwinjs 4.10-4.11 更新

撤銷更改 目前,撤銷一個有缺陷的變更集的唯一方法是從 iModel Hub 中移除它,這可能會導致許多副作用(無法撤銷)。一個更好的方法是在時間線中撤銷變更集,并將其作為新的變更集引入。盡管這種方法仍然具有侵入性&#…

【CSS-15】深入理解CSS transition-duration:掌握過渡動畫的時長控制

在現代網頁設計中,平滑的過渡效果是提升用戶體驗的關鍵因素之一。CSS transitions 為我們提供了一種簡單而強大的方式來實現元素在不同狀態之間的平滑過渡,而 transition-duration 屬性則是控制這些過渡效果時長的核心工具。本文將全面探討 transition-d…

mysql-筆記

1. 安裝mysql # 使用brew安裝 brew install mysql# 查看是否安裝成功 mysql -V 相關文檔: mac:macOS下MySQL 8.0 安裝與配置教程 - KenTalk - 博客園 Linux安裝:linux安裝mysql客戶端_linux mysql 客戶端-CSDN博客 2. 啟動mysql 每次使…

Spring Boot啟動優化7板斧(延遲初始化、組件掃描精準打擊、JVM參數調優):砍掉70%啟動時間的魔鬼實踐

Spring Boot啟動優化7板斧:砍掉70%啟動時間的魔鬼實踐1. 延遲初始化:按需加載的智慧2. 組件掃描精準打擊:告別無差別掃描3. JVM參數調優:啟動加速的隱藏開關4. 自動配置瘦身:砍掉Spring Boot的"贅肉"5. 類加…

從0開始學習計算機視覺--Day08--卷積神經網絡

之前我們提到,神經網絡是通過全連接層對輸入做降維處理,將輸入的向量通過矩陣和激活函數進行降維,在神經元上輸出激活值。而卷積神經網絡中,用卷積層代替了全連接層。 不同的是,這里的輸入不再需要降維,而…

解決阿里云ubuntu內存溢出導致vps死機無法訪問 - 永久性增加ubuntu的swap空間 - 阿里云Linux實例內存溢出(OOM)問題修復方案

效果圖報錯通過對實例當前截屏的分析發現,實例因 Linux實例內存空間不足,導致操作系統出現內存溢出(OOM) 無法正常啟動。請您根據 Code:1684829582,在文檔中查詢該問題對應的修復方案,并通過VNC…

Serverless JManus: 企業生產級通用智能體運行時

作者:叢霄、陸龜 概述:本文介紹如何使用 JManus 框架構建通用智能體應用,部署并運行在 Serverless 運行時,構建企業級高可用智能體應用的實踐經驗。基于阿里云 Serverless 應用引擎SAE 運行穩定高可用的智能體應用, 基…

MySQL的數據目錄

導讀:根據前面的所學知識,我們知道了InnoDB存儲引擎存儲數據的數據結構、存儲過程,而被組織好的數據則被存儲在操作系統的磁盤上,當我們在對表數據進行增刪改查時,其實就是InnoDB存儲引擎與磁盤的交互。此外&#xff0…

Web前端開發: :has功能性偽類選擇器

:has功能性偽類選擇器::has() 是 CSS 中的一個功能性偽類選擇器,它允許開發者根據元素的后代元素、兄弟元素或后續元素的存在或狀態來選擇目標元素。它本質上是一個“父選擇器”或“關系選擇器”,解決了 CSS 長期以來無法根據子元素反向選擇父元素的痛點…