文章目錄
- 背景:什么是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如何實現呢?
- 第一種方式是自己手寫代碼實現(這個比較復雜,可以調用Python的FastMCP庫去實現);
- 第二種方法是去找別人寫好的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 的奧秘》