:規(guī)劃、記憶與工具使用的鐵三角》)
在上一篇文章中我們理解了 AI Agent 的本質(zhì)——它是一個以目標為輸入、在“決策—執(zhí)行—觀察”閉環(huán)中往復(fù)運行的程序。但這個閉環(huán)具體是怎么運轉(zhuǎn)的Agent 怎么知道該做什么、怎么記住之前做了什么、怎么調(diào)用外部能力答案藏在規(guī)劃Planning、記憶Memory、工具使用Tool Use 這三個核心模塊里。它們相互融合、相互依賴共同對任務(wù)進行拆解得到可驗證的子步驟。 本文深入拆解這三者并通過一個完整的代碼實戰(zhàn)幫你理解 Agent 的內(nèi)部運作機制。一、規(guī)劃模塊任務(wù)拆解與推理規(guī)劃是 Agent 的“大腦中樞”。 復(fù)雜任務(wù)通常不能一步到位。以“制定一份新能源汽車市場分析報告”為例Agent 需要自己判斷怎么拆先收集市場數(shù)據(jù)再分析主要廠商然后梳理技術(shù)路線最后整合成報告。這個拆解過程不是靠寫死流程而是靠規(guī)劃模塊動態(tài)生成。目前業(yè)界廣泛采用的規(guī)劃方法之一是 ReActReasoning Acting 。它的核心思路是讓模型在一個循環(huán)中交替輸出“思考”Thought、“行動”Action、“觀察”O(jiān)bservation然后根據(jù)觀察結(jié)果繼續(xù)思考形成閉環(huán)。這種方式允許模型在執(zhí)行過程中根據(jù)反饋修正自己的計劃。ReAct 循環(huán)的完整流程textThought: 我需要先了解當前的數(shù)據(jù)情況Action: query_database(“SELECT * FROM sales WHERE quarter ‘Q3’”)Observation: 返回了 150 條銷售記錄Thought: 數(shù)據(jù)已獲取現(xiàn)在需要分析下降原因Action: analyze_trend(data)Observation: 發(fā)現(xiàn)華東地區(qū)銷售額下降了 30%Thought: 問題定位在華東地區(qū)需要進一步分析…其他常見的規(guī)劃方法還包括 Chain-of-ThoughtCoT 和 Tree-of-ThoughtToT 但在實際工程中ReAct 的模式更接近真實執(zhí)行場景因為它天然對接了工具調(diào)用。二、記憶模塊短期、工作與長期記憶沒有記憶的 Agent 每次都在“從零開始”。 Agent 的認知包括對話歷史、工具輸出以及在前面步驟中檢索到的任何數(shù)據(jù)。記憶是實現(xiàn)一致性的關(guān)鍵當用戶說“實際上這是錯誤的顏色”時Agent 知道“它”指的是前面討論的項目。Agent 的記憶系統(tǒng)分為三個層次短期記憶通常由框架自動管理。以 GitHub Copilot SDK 為例它通過跟蹤會話中的聊天歷史記錄自動管理短期內(nèi)存。對于可能超過模型上下文窗口的會話SDK 的“無限會話”功能會壓縮較舊的上下文以防止令牌溢出同時保留基本信息。長期記憶需要顯式實現(xiàn)。常見方案是將重要信息嵌入為向量存儲在向量數(shù)據(jù)庫中在需要時通過語義檢索召回。這是 RAG檢索增強生成的基礎(chǔ)設(shè)施。三、工具使用Agent 真正能“干活”的關(guān)鍵LLM 本身無法直接操作外部系統(tǒng)它只能輸出文本。 要讓 Agent 執(zhí)行具體操作必須引入工具調(diào)用Function Calling 機制。工具是 Agent 在其推理過程中可以調(diào)用的外部函數(shù)或 API。每個工具都表示 Agent 可以執(zhí)行的特定操作查找數(shù)據(jù)庫記錄、調(diào)用 REST API、發(fā)送電子郵件或運行診斷命令。設(shè)計工具集的關(guān)鍵原則每個工具都應(yīng)很好地執(zhí)行一項操作并提供清晰的名稱和說明幫助 AI 模型了解何時使用它。你希望為 Agent 提供足夠有用的工具但不要過多以免讓其困惑或不堪重負。工具的規(guī)劃器協(xié)調(diào)機制是規(guī)劃器決定何時調(diào)用工具、何時提出澄清問題、何時生成最終答案?,F(xiàn)代 AI Agent 使用 ReAct 循環(huán)在思考LLM 建議一個步驟和行動調(diào)用工具之間交替。四、生產(chǎn)級 Agent 的關(guān)鍵設(shè)計原則從工程落地的視角一個生產(chǎn)級 Agent 需要遵循以下設(shè)計原則結(jié)構(gòu)化輸出Agent 的工具調(diào)用和最終響應(yīng)都應(yīng)遵循明確的 Schema便于程序化解析和驗證。多級記憶不要把所有信息都塞進上下文窗口。短期記憶用消息列表工作記憶用狀態(tài)對象長期記憶用向量檢索。冪等工具調(diào)用同一個工具調(diào)用重復(fù)執(zhí)行不應(yīng)產(chǎn)生副作用。這對重試和錯誤恢復(fù)至關(guān)重要。全鏈路可觀測性每一步的思考、行動、觀察都應(yīng)被記錄和追蹤便于調(diào)試和優(yōu)化。五、實戰(zhàn)用 ReAct 模式實現(xiàn)一個最簡單的 Agent以下代碼展示了 ReAct 模式的核心邏輯偽代碼風(fēng)格聚焦理解importjsonclassSimpleAgent:def__init__(self,llm,tools):self.llmllm self.tools{t.name:tfortintools}self.memory[]# 短期記憶對話歷史defrun(self,goal:str,max_steps:int10)-str:執(zhí)行 ReAct 循環(huán)直到任務(wù)完成或達到最大步數(shù)contextf目標:{goal}\n\nforstepinrange(max_steps):# 1. 思考 行動決策promptself._build_prompt(context)responseself.llm.invoke(prompt)# 2. 解析 LLM 的輸出thoughtresponse.get(thought,)actionresponse.get(action)action_inputresponse.get(action_input,{})contextfThought:{thought}\n# 3. 判斷是否完成ifactionfinish:returnaction_input.get(answer,thought)# 4. 執(zhí)行工具ifactioninself.tools:try:observationself.tools[action].execute(**action_input)exceptExceptionase:observationf工具執(zhí)行錯誤:{e}else:observationf未知工具:{action}# 5. 將觀察結(jié)果追加到上下文這就是記憶contextfAction:{action}({action_input})\ncontextfObservation:{observation}\n\nself.memory.append((thought,action,observation))return達到最大步數(shù)限制任務(wù)未完成def_build_prompt(self,context:str)-str:tool_descriptions\n.join(f-{name}:{tool.description}forname,toolinself.tools.items())returnf{context}可用工具:{tool_descriptions}finish: 任務(wù)完成時調(diào)用傳入最終答案請輸出 JSON 格式:{{“thought”: “你的思考”, “action”: “工具名或finish”, “action_input”: {{…}}}}“”代碼要點run() 方法是 ReAct 循環(huán)的核心每一步都執(zhí)行“思考→行動→觀察”。context 變量就是工作記憶隨著每一步的執(zhí)行不斷累積。self.memory 是短期記憶記錄完整的決策歷史。工具調(diào)用結(jié)果作為 Observation 追加到上下文供下一步?jīng)Q策使用。max_steps 是防止死循環(huán)的安全護欄。六、三者的協(xié)作關(guān)系鐵三角規(guī)劃、記憶、工具使用不是三個獨立模塊而是相互依賴的鐵三角規(guī)劃依賴記憶沒有記憶規(guī)劃無法知道之前做過什么、結(jié)果如何。記憶依賴工具工具調(diào)用的輸出是記憶的重要內(nèi)容來源。工具依賴規(guī)劃沒有規(guī)劃Agent 不知道何時該調(diào)用哪個工具。規(guī)劃依賴工具工具的能力邊界決定了規(guī)劃的可能性空間。三者共同對任務(wù)進行拆解得到可驗證的子步驟并在“決策—執(zhí)行—觀察”的閉環(huán)中持續(xù)迭代。七、小結(jié)規(guī)劃模塊用 ReAct 模式實現(xiàn)“思考→行動→觀察”循環(huán)動態(tài)生成任務(wù)拆解。記憶模塊短期記憶對話歷史、工作記憶任務(wù)狀態(tài)、長期記憶向量檢索三層協(xié)作。工具使用通過 Function Calling 讓 Agent 真正能“干活”工具設(shè)計遵循“一個工具一個目標”原則。關(guān)鍵設(shè)計原則結(jié)構(gòu)化輸出、多級記憶、冪等工具調(diào)用、全鏈路可觀測性。鐵三角協(xié)作規(guī)劃、記憶、工具三者相互依賴共同驅(qū)動 Agent 的自主執(zhí)行閉環(huán)。