:從感知到反思的AI大腦實(shí)現(xiàn))
1. 項(xiàng)目概述一個(gè)“活”起來的智能體是如何思考的最近和幾個(gè)做AI應(yīng)用的朋友聊天大家都有一個(gè)共同的困惑我們手頭的LLM大語言模型能力越來越強(qiáng)API調(diào)用也方便但為什么做出來的東西總感覺“差點(diǎn)意思”要么是機(jī)械地一問一答要么是執(zhí)行復(fù)雜任務(wù)時(shí)容易“跑偏”或“卡住”缺乏一種連貫、自主的“智能感”。這背后的核心差距往往不在于模型本身而在于我們是否為其設(shè)計(jì)了一套有效的“大腦”運(yùn)行機(jī)制——也就是智能體Agent系統(tǒng)的控制循環(huán)。今天要聊的“感知—決策—行動(dòng)—反思”循環(huán)正是這個(gè)“大腦”的核心工作流。它不是一個(gè)靜態(tài)的流程圖而是一個(gè)動(dòng)態(tài)的、持續(xù)運(yùn)轉(zhuǎn)的認(rèn)知引擎。你可以把它想象成一個(gè)頂級(jí)外科醫(yī)生在手術(shù)中的狀態(tài)他需要持續(xù)感知手術(shù)臺(tái)上的各種生命體征數(shù)據(jù)和影像環(huán)境輸入基于專業(yè)知識(shí)和當(dāng)前情況快速?zèng)Q策下一步最佳操作內(nèi)部推理然后精準(zhǔn)地執(zhí)行手術(shù)動(dòng)作調(diào)用工具并在每一步完成后反思動(dòng)作效果隨時(shí)準(zhǔn)備調(diào)整方案評(píng)估與學(xué)習(xí)。智能體的控制循環(huán)就是在軟件層面模擬這種高級(jí)的、目標(biāo)導(dǎo)向的認(rèn)知過程。這個(gè)連載系列的第三篇我們將深入這個(gè)循環(huán)的每一個(gè)環(huán)節(jié)從理論到代碼拆解如何讓一個(gè)智能體真正“活”起來能夠處理那些需要多步驟、有條件判斷、甚至能從錯(cuò)誤中學(xué)習(xí)的復(fù)雜任務(wù)。無論你是想構(gòu)建一個(gè)自動(dòng)化的數(shù)據(jù)分析助手一個(gè)能理解需求并編寫完整程序的項(xiàng)目搭檔還是一個(gè)能夠自主探索解決方案的研究代理理解并實(shí)現(xiàn)這個(gè)控制循環(huán)都是必經(jīng)之路。2. 控制循環(huán)的整體架構(gòu)與設(shè)計(jì)哲學(xué)在動(dòng)手寫代碼之前我們必須先想清楚整個(gè)系統(tǒng)應(yīng)該如何架構(gòu)。一個(gè)健壯的控制循環(huán)不是四個(gè)環(huán)節(jié)的簡(jiǎn)單串聯(lián)而是一個(gè)帶有狀態(tài)管理、錯(cuò)誤處理和長(zhǎng)期記憶的復(fù)雜系統(tǒng)。2.1 核心循環(huán)的抽象模型最基礎(chǔ)的模型是一個(gè)while循環(huán)class BasicAgent: def run(self, initial_task): state self._initialize_state(initial_task) while not self._is_task_complete(state): # 1. 感知 observation self._perceive(state) # 2. 決策 action self._decide(state, observation) # 3. 行動(dòng) result self._act(action) # 4. 反思 狀態(tài)更新 state self._reflect_and_update(state, action, result) return state.final_result但這個(gè)模型過于理想化。現(xiàn)實(shí)中我們需要考慮感知什么如何決策行動(dòng)失敗怎么辦反思的依據(jù)是什么這就需要我們引入更豐富的組件。2.2 關(guān)鍵組件的職責(zé)界定一個(gè)工業(yè)級(jí)智能體系統(tǒng)通常包含以下核心組件它們協(xié)同工作支撐起控制循環(huán)工作記憶Working Memory存儲(chǔ)當(dāng)前任務(wù)相關(guān)的所有上下文信息包括原始目標(biāo)、歷史對(duì)話、之前的觀察結(jié)果、執(zhí)行過的動(dòng)作及其結(jié)果。它是循環(huán)中不斷被更新的“狀態(tài)State”核心。感知模塊Perception Module并非指視覺感知而是泛指從工作記憶和外部環(huán)境中提取相關(guān)信息的過程。這包括解析用戶的輸入、讀取數(shù)據(jù)庫(kù)的最新記錄、監(jiān)聽消息隊(duì)列的事件、解析工具執(zhí)行的返回結(jié)果等。其輸出是結(jié)構(gòu)化的“觀察Observation”。決策引擎Decision Engine這是智能體的“CPU”通常由LLM驅(qū)動(dòng)。它接收當(dāng)前的工作記憶和最新的觀察然后推理出下一步應(yīng)該執(zhí)行哪個(gè)“動(dòng)作Action”。動(dòng)作可以是一個(gè)簡(jiǎn)單的文本回復(fù)也可以是調(diào)用一個(gè)特定工具如搜索、計(jì)算、寫文件的指令。行動(dòng)執(zhí)行器Action Executor負(fù)責(zé)安全、可靠地執(zhí)行決策引擎發(fā)出的動(dòng)作指令。它需要管理一系列“工具Tools”處理工具調(diào)用時(shí)的參數(shù)驗(yàn)證、異常捕獲、結(jié)果格式化等臟活累活。反思與評(píng)估模塊Reflection Evaluation Module這是智能體具備“學(xué)習(xí)”和“調(diào)整”能力的關(guān)鍵。它評(píng)估上一次行動(dòng)的結(jié)果是否有效是否朝著目標(biāo)前進(jìn)。如果結(jié)果不理想它可以觸發(fā)重新決策Re-planning或生成一個(gè)“反思”記錄存入長(zhǎng)期記憶避免未來犯同樣錯(cuò)誤。2.3 設(shè)計(jì)時(shí)的核心權(quán)衡在設(shè)計(jì)循環(huán)時(shí)你始終面臨幾個(gè)關(guān)鍵權(quán)衡反應(yīng)式 vs. 深思熟慮式是每次循環(huán)只做一個(gè)簡(jiǎn)單動(dòng)作反應(yīng)式還是允許決策引擎生成一個(gè)包含多個(gè)步驟的完整計(jì)劃深思熟慮式后者效率更高但一旦環(huán)境變化計(jì)劃容易失效。通常采用混合策略生成一個(gè)高層計(jì)劃但在每個(gè)循環(huán)步驟中根據(jù)最新觀察進(jìn)行微調(diào)。狀態(tài)管理粒度工作記憶中要保存多少歷史保存完整的對(duì)話歷史雖然信息全但會(huì)導(dǎo)致LLM上下文快速膨脹增加成本和延遲。通常需要設(shè)計(jì)摘要機(jī)制將遙遠(yuǎn)的、不重要的歷史壓縮成要點(diǎn)。錯(cuò)誤處理邊界行動(dòng)執(zhí)行失敗時(shí)是讓反思模塊嘗試修復(fù)還是直接拋出異常終止任務(wù)一個(gè)健壯的智能體應(yīng)該有分級(jí)錯(cuò)誤處理機(jī)制工具級(jí)錯(cuò)誤如API超時(shí)可重試邏輯級(jí)錯(cuò)誤如參數(shù)不對(duì)需反饋給決策引擎重新思考目標(biāo)級(jí)錯(cuò)誤如任務(wù)不可能完成則應(yīng)向用戶請(qǐng)求幫助。實(shí)操心得不要試圖在第一個(gè)版本中就實(shí)現(xiàn)一個(gè)完美的通用智能體框架。最好的方法是針對(duì)你的具體任務(wù)場(chǎng)景設(shè)計(jì)最小可行的控制循環(huán)。例如一個(gè)客服自動(dòng)應(yīng)答機(jī)器人的循環(huán)可能非常簡(jiǎn)單感知用戶問題-決策知識(shí)庫(kù)檢索動(dòng)作-行動(dòng)并返回答案-無需復(fù)雜反思。先從簡(jiǎn)單開始迭代優(yōu)化。3. 感知模塊為智能體打開“眼睛”和“耳朵”感知模塊是智能體與外界交互的橋梁。它的任務(wù)不是簡(jiǎn)單地傳遞數(shù)據(jù)而是進(jìn)行信息篩選、結(jié)構(gòu)化和融合為決策引擎提供高質(zhì)量的輸入。3.1 感知的來源多模態(tài)輸入與內(nèi)部狀態(tài)感知的輸入通常來自兩方面外部輸入用戶消息、API推送的事件、數(shù)據(jù)庫(kù)查詢結(jié)果、文件內(nèi)容、傳感器數(shù)據(jù)在機(jī)器人領(lǐng)域等。內(nèi)部狀態(tài)從工作記憶中提取的、與當(dāng)前決策相關(guān)的歷史信息。例如之前三步做了什么得到了什么結(jié)果。3.2 結(jié)構(gòu)化觀察從原始數(shù)據(jù)到?jīng)Q策燃料LLM擅長(zhǎng)處理結(jié)構(gòu)化的文本信息。因此感知模塊的一個(gè)重要職責(zé)是將原始輸入轉(zhuǎn)化為結(jié)構(gòu)化的“觀察”對(duì)象。例如dataclass class Observation: type: Literal[“user_input”, “tool_result”, “system_event”] content: str # 原始內(nèi)容或摘要 metadata: dict # 來源、時(shí)間戳、置信度等 relevance_to_goal: float # 一個(gè)簡(jiǎn)單的相關(guān)性評(píng)分可用于后續(xù)過濾對(duì)于工具執(zhí)行結(jié)果感知模塊需要做額外處理結(jié)果解析工具返回的可能是JSON、HTML、純文本或錯(cuò)誤碼。需要將其解析為統(tǒng)一的、易于理解的描述。關(guān)鍵信息提取特別是當(dāng)結(jié)果很長(zhǎng)時(shí)如一篇網(wǎng)頁內(nèi)容需要提取與當(dāng)前任務(wù)最相關(guān)的片段。這本身就可以用一個(gè)輕量級(jí)的LLM調(diào)用來完成。狀態(tài)判斷從結(jié)果中判斷某些關(guān)鍵條件是否滿足。例如調(diào)用“查詢庫(kù)存”工具后感知模塊可以輸出觀察“庫(kù)存量為5大于0可購(gòu)買”。3.3 上下文管理與歷史摘要這是感知模塊最容易被忽視但至關(guān)重要的功能。直接給LLM喂食全部歷史對(duì)話和行動(dòng)記錄很快就會(huì)觸及上下文長(zhǎng)度限制且無關(guān)信息會(huì)干擾決策。解決方案是實(shí)現(xiàn)一個(gè)分層級(jí)的記憶系統(tǒng)最新記錄保留最近N輪完整的循環(huán)記錄感知、決策、行動(dòng)、結(jié)果。歷史摘要對(duì)更早的記錄由LLM生成一段簡(jiǎn)潔的摘要例如“用戶最初想訂機(jī)票我們已搜索了航班并比較了價(jià)格用戶對(duì)時(shí)間不太滿意。”關(guān)鍵事實(shí)提取將對(duì)話中確定的、不可更改的事實(shí)如“用戶姓名是張三”“出發(fā)日期是下周五”提取出來作為獨(dú)立的事實(shí)列表存儲(chǔ)便于快速查詢。感知模塊在每次循環(huán)開始時(shí)負(fù)責(zé)組裝這個(gè)“上下文包”最新的觀察 最近完整記錄 歷史摘要 相關(guān)關(guān)鍵事實(shí)。這確保了決策引擎擁有“恰到好處”的背景信息。注意事項(xiàng)感知模塊中的信息過濾和摘要生成邏輯需要謹(jǐn)慎設(shè)計(jì)避免信息丟失或扭曲。一個(gè)常見的坑是摘要過于籠統(tǒng)丟失了關(guān)鍵細(xì)節(jié)。建議為摘要過程制定明確的規(guī)則比如“必須包含涉及數(shù)字、時(shí)間、地點(diǎn)和用戶明確偏好的信息”。4. 決策引擎LLM作為推理核心的實(shí)踐細(xì)節(jié)決策引擎是整個(gè)循環(huán)的“指揮官”。我們依靠LLM強(qiáng)大的推理和規(guī)劃能力但它不是一個(gè)黑盒需要精心的提示工程和輸出約束。4.1 提示詞工程構(gòu)建清晰的決策上下文給LLM的提示Prompt必須清晰界定它的角色、可用資源和當(dāng)前目標(biāo)。一個(gè)典型的決策提示詞結(jié)構(gòu)如下你是一個(gè)專業(yè)的{Agent角色}。你的目標(biāo)是{當(dāng)前最高層級(jí)任務(wù)}。 當(dāng)前情況工作記憶 {由感知模塊提供的結(jié)構(gòu)化上下文摘要} 你剛剛觀察到的信息 {最新的Observation內(nèi)容} 你可以使用的工具Actions 1. 工具A描述。輸入格式{“param1”: type, “param2”: type} 2. 工具B描述。 ... 3. 直接回復(fù)用戶當(dāng)你認(rèn)為需要與用戶溝通時(shí)使用。 請(qǐng)基于以上信息決定下一步做什么。你的輸出必須是嚴(yán)格的JSON格式 { “thought”: “你的逐步推理過程解釋為什么選擇這個(gè)動(dòng)作” “action”: “工具名或‘reply’” “action_input”: {參數(shù)對(duì)象} 或 “回復(fù)內(nèi)容” }關(guān)鍵點(diǎn)明確工具規(guī)格必須清晰描述每個(gè)工具的作用、輸入和輸出。LLM需要知道“能做什么”。強(qiáng)制結(jié)構(gòu)化輸出要求JSON格式并定義好Schema這是后續(xù)代碼能可靠解析的前提。包含思維鏈Chain-of-Thought要求模型輸出“thought”字段至關(guān)重要。這不僅提高了決策的可解釋性便于調(diào)試而且實(shí)踐證明讓LLM“把思考過程寫出來”能顯著提升其決策質(zhì)量。4.2 動(dòng)作空間的定義與擴(kuò)展“動(dòng)作”是智能體影響環(huán)境的唯一方式。我們需要精心設(shè)計(jì)動(dòng)作空間基礎(chǔ)動(dòng)作調(diào)用某個(gè)函數(shù)/工具。復(fù)合動(dòng)作一系列基礎(chǔ)動(dòng)作的預(yù)定義組合如“預(yù)訂航班”可能包含“查詢航班”、“選擇航班”、“填寫乘客信息”三個(gè)基礎(chǔ)動(dòng)作。對(duì)話動(dòng)作直接向用戶發(fā)送消息用于詢問、確認(rèn)、匯報(bào)進(jìn)度。在代碼中我們可以用一個(gè)注冊(cè)表來管理所有可用動(dòng)作class ActionRegistry: def __init__(self): self._tools {} def register(self, name: str, func: Callable, description: str, schema: dict): self._tools[name] { “func”: func, “description”: description, “schema”: schema # JSON Schema用于驗(yàn)證LLM生成的輸入 } def execute(self, action_name: str, action_input: dict) - str: if action_name not in self._tools: return f“Error: Unknown action ‘{action_name}’” tool self._tools[action_name] # 1. 驗(yàn)證輸入?yún)?shù)是否符合schema if not validate_input(action_input, tool[“schema”]): return “Error: Invalid action input parameters.” # 2. 執(zhí)行 try: result tool[“func”](**action_input) return str(result) except Exception as e: return f“Error executing action: {str(e)}”4.3 處理不確定性、模糊性與規(guī)劃LLM的決策并非總是確定性的。我們需要處理幾種情況決策模糊LLM可能輸出“我需要更多信息”。此時(shí)決策引擎應(yīng)將其轉(zhuǎn)化為一個(gè)明確的“向用戶提問”的動(dòng)作。生成多步計(jì)劃對(duì)于復(fù)雜任務(wù)可以讓LLM先生成一個(gè)初步計(jì)劃Plan作為工作記憶的一部分。在后續(xù)每個(gè)循環(huán)中決策引擎不僅決定當(dāng)前動(dòng)作還參考和更新這個(gè)計(jì)劃。置信度與回退可以為L(zhǎng)LM的決策附加一個(gè)置信度評(píng)分可以通過提示詞讓其自評(píng)或通過其輸出格式的規(guī)范性來判斷。當(dāng)置信度低時(shí)可以觸發(fā)反思模塊進(jìn)行復(fù)核或直接采用更保守的“請(qǐng)求確認(rèn)”動(dòng)作。踩坑實(shí)錄早期我們直接讓LLM輸出“調(diào)用工具A參數(shù)是XXX”這樣的自然語言然后在代碼里用正則表達(dá)式去解析這是災(zāi)難性的。任何格式的偏差都會(huì)導(dǎo)致解析失敗。強(qiáng)制結(jié)構(gòu)化JSON輸出并做嚴(yán)格驗(yàn)證是保證系統(tǒng)穩(wěn)定性的生命線。同時(shí)一定要讓LLM在thought字段中“說出它的想法”這是調(diào)試時(shí)最寶貴的日志。5. 行動(dòng)執(zhí)行器安全、可靠地連接外部世界決策引擎發(fā)出了指令行動(dòng)執(zhí)行器負(fù)責(zé)將其落到實(shí)處。這個(gè)模塊的關(guān)鍵詞是魯棒性。5.1 工具的設(shè)計(jì)與封裝一個(gè)好的工具應(yīng)該功能單一一個(gè)工具只做一件事。例如“搜索網(wǎng)絡(luò)”和“計(jì)算數(shù)學(xué)”應(yīng)該是兩個(gè)獨(dú)立的工具。接口明確有清晰的輸入?yún)?shù)類型說明和輸出格式承諾。安全無害特別是涉及寫操作、網(wǎng)絡(luò)訪問或敏感信息處理的工具必須有權(quán)限檢查和沙箱機(jī)制。具備超時(shí)和重試機(jī)制外部API調(diào)用可能會(huì)失敗需要有合理的超時(shí)設(shè)置和有限次數(shù)的重試邏輯。def search_web(query: str, max_results: int 5) - str: “”“使用搜索引擎查詢信息。 Args: query: 搜索關(guān)鍵詞。 max_results: 返回的最大結(jié)果數(shù)量。 Returns: 一個(gè)格式化的字符串包含搜索結(jié)果的標(biāo)題、鏈接和摘要。 ”“” # 這里集成SerpAPI、Google Search API或其他搜索服務(wù) # 必須包含try-catch和超時(shí)處理 pass5.2 動(dòng)作執(zhí)行的流水線一個(gè)動(dòng)作的執(zhí)行并非簡(jiǎn)單調(diào)用函數(shù)而應(yīng)經(jīng)過一個(gè)流水線解析與驗(yàn)證解析決策引擎輸出的JSON驗(yàn)證動(dòng)作名稱是否存在輸入?yún)?shù)是否符合預(yù)定義的Schema使用如jsonschema庫(kù)。參數(shù)預(yù)處理有時(shí)需要對(duì)參數(shù)進(jìn)行預(yù)處理比如將LLM生成的日期描述“下周五”轉(zhuǎn)換為具體的日期字符串。安全審查可選但重要對(duì)于高風(fēng)險(xiǎn)動(dòng)作如發(fā)送郵件、執(zhí)行數(shù)據(jù)庫(kù)刪除可以加入一層人工審核或二次確認(rèn)邏輯。執(zhí)行與超時(shí)控制在獨(dú)立的線程或異步任務(wù)中執(zhí)行工具調(diào)用并設(shè)置超時(shí)。結(jié)果格式化將工具返回的原始數(shù)據(jù)可能是對(duì)象、列表等格式化為L(zhǎng)LM容易理解的文本描述。同時(shí)將原始結(jié)果也保存下來供后續(xù)模塊使用。5.3 異常處理與反饋行動(dòng)可能失敗失敗信息必須清晰、可操作并反饋給循環(huán)。工具錯(cuò)誤如網(wǎng)絡(luò)錯(cuò)誤、API密鑰無效。執(zhí)行器應(yīng)捕獲異常并生成標(biāo)準(zhǔn)化的錯(cuò)誤信息如“Action ‘search_web’ failed: Network timeout (Exception: …)”。這將成為下一次循環(huán)中“感知模塊”的輸入。邏輯錯(cuò)誤工具執(zhí)行成功但結(jié)果表示業(yè)務(wù)邏輯失敗如“用戶余額不足”。這類錯(cuò)誤也應(yīng)被格式化后返回它對(duì)于智能體調(diào)整策略至關(guān)重要。實(shí)操心得為每一個(gè)工具編寫詳盡、示例清晰的文檔字符串并把這些文檔動(dòng)態(tài)地插入到給LLM的提示詞中能極大提升工具調(diào)用的準(zhǔn)確性。另外所有工具調(diào)用都應(yīng)該有日志記錄包括輸入、輸出、耗時(shí)和錯(cuò)誤信息這是后期優(yōu)化和審計(jì)的基礎(chǔ)。6. 反思模塊實(shí)現(xiàn)智能體的持續(xù)學(xué)習(xí)與調(diào)整反思是區(qū)分高級(jí)智能體與簡(jiǎn)單自動(dòng)化腳本的關(guān)鍵。它讓智能體不僅“做事”還能“思考做事的效果”并據(jù)此調(diào)整。6.1 反思的觸發(fā)時(shí)機(jī)反思不是每個(gè)循環(huán)都必須的那樣效率太低。通常在以下時(shí)機(jī)觸發(fā)動(dòng)作失敗后當(dāng)行動(dòng)執(zhí)行器返回明確錯(cuò)誤時(shí)。子目標(biāo)達(dá)成后完成一個(gè)階段性任務(wù)時(shí)評(píng)估是否偏離主航道。陷入循環(huán)或僵局時(shí)檢測(cè)到智能體在重復(fù)相似動(dòng)作或無進(jìn)展超過一定步數(shù)時(shí)。用戶給出反饋時(shí)用戶說“不對(duì)”或“這不是我想要的”。6.2 反思的內(nèi)容與過程反思本身也可以看作一個(gè)由LLM驅(qū)動(dòng)的微循環(huán)。它的輸入是當(dāng)前目標(biāo)、相關(guān)的工作記憶尤其是最近失敗或低效的步驟序列、以及需要反思的具體事件。我們給反思LLM設(shè)計(jì)專門的提示詞你是一個(gè)分析員負(fù)責(zé)評(píng)估智能體最近的表現(xiàn)并給出改進(jìn)建議。 智能體的最終目標(biāo)是{主目標(biāo)}。 最近發(fā)生的事件{對(duì)觸發(fā)反思事件的具體描述如‘調(diào)用工具X失敗錯(cuò)誤信息是...’}。 相關(guān)的行動(dòng)歷史{最近幾步的詳細(xì)記錄}。 請(qǐng)分析 1. 問題診斷最近的問題出在哪里是目標(biāo)理解有誤、計(jì)劃不合理、工具選擇錯(cuò)誤還是參數(shù)有問題 2. 修正建議接下來應(yīng)該怎么做是換一種方式重試當(dāng)前步驟還是需要回溯到更早的步驟重新規(guī)劃 3. 經(jīng)驗(yàn)總結(jié)從這個(gè)事件中可以學(xué)到什么生成一條簡(jiǎn)短的經(jīng)驗(yàn)教訓(xùn)以便未來避免。 請(qǐng)以JSON格式輸出你的分析。反思LLM的輸出會(huì)被解析并用于直接調(diào)整工作記憶和計(jì)劃例如如果反思認(rèn)為“參數(shù)錯(cuò)誤”決策引擎在下一次決策時(shí)會(huì)被注入“避免使用XX參數(shù)”的提示。生成長(zhǎng)期記憶將“經(jīng)驗(yàn)總結(jié)”存入一個(gè)向量數(shù)據(jù)庫(kù)或知識(shí)庫(kù)未來在類似場(chǎng)景下感知模塊可以檢索這些經(jīng)驗(yàn)來輔助決策。觸發(fā)高層重規(guī)劃如果反思認(rèn)為當(dāng)前整個(gè)計(jì)劃都行不通它可以發(fā)出一個(gè)信號(hào)要求決策引擎拋棄原有計(jì)劃從更高層面重新思考任務(wù)。6.3 實(shí)現(xiàn)持續(xù)學(xué)習(xí)的簡(jiǎn)單模式實(shí)現(xiàn)完整的終身學(xué)習(xí)很難但我們可以從簡(jiǎn)單的模式開始錯(cuò)誤模式庫(kù)將常見的工具錯(cuò)誤如“404 Not Found”“Invalid API Key”和對(duì)應(yīng)的修正建議如“請(qǐng)檢查資源是否存在”“請(qǐng)確認(rèn)API密鑰配置”映射起來。當(dāng)感知到這類錯(cuò)誤時(shí)可以直接建議決策引擎采取修正動(dòng)作無需每次都調(diào)用LLM反思。成功案例存儲(chǔ)當(dāng)智能體完美解決一個(gè)復(fù)雜任務(wù)后可以將這個(gè)任務(wù)的目標(biāo)、最終成功的行動(dòng)序列作為“案例”存儲(chǔ)起來。未來遇到類似任務(wù)時(shí)可以通過向量檢索快速找到一個(gè)可行的起點(diǎn)計(jì)劃。注意事項(xiàng)反思模塊本身也會(huì)消耗LLM Token并增加延遲。要避免過度反思。為不同類型的觸發(fā)事件設(shè)置不同的反思“深度”和“預(yù)算”。例如對(duì)于簡(jiǎn)單的工具調(diào)用失敗可能只需要一個(gè)快速的、基于規(guī)則的建議而對(duì)于任務(wù)陷入僵局才需要啟動(dòng)深度的、由LLM驅(qū)動(dòng)的分析。7. 系統(tǒng)集成與實(shí)戰(zhàn)構(gòu)建一個(gè)任務(wù)執(zhí)行智能體現(xiàn)在讓我們把以上所有模塊組合起來構(gòu)建一個(gè)能執(zhí)行“研究并撰寫簡(jiǎn)報(bào)”任務(wù)的智能體。假設(shè)我們有網(wǎng)絡(luò)搜索、文件讀寫、文本摘要等工具。7.1 系統(tǒng)工作流串聯(lián)初始化用戶輸入任務(wù)“調(diào)研一下特斯拉2024年第一季度的財(cái)報(bào)亮點(diǎn)寫一份不超過500字的簡(jiǎn)報(bào)?!毖h(huán)開始感知工作記憶初始化為用戶任務(wù)。感知模塊無外部新觀察但將任務(wù)作為關(guān)鍵信息。決策決策引擎LLM看到任務(wù)查看工具列表搜索、總結(jié)、寫文件在thought中推理“這是一個(gè)信息檢索和總結(jié)任務(wù)。我需要先搜索最新財(cái)報(bào)信息?!?輸出決策動(dòng)作search_web 輸入{“query”: “Tesla Q1 2024 earnings report highlights”}。行動(dòng)行動(dòng)執(zhí)行器調(diào)用搜索工具獲得一系列網(wǎng)頁摘要和鏈接。反思此輪暫不觸發(fā)行動(dòng)成功結(jié)果有效繼續(xù)。下一輪循環(huán)感知感知模塊將搜索結(jié)果的文本內(nèi)容格式化并提取關(guān)鍵數(shù)據(jù)如營(yíng)收數(shù)字、交付量作為新的Observation。決策LLM看到搜索結(jié)果思考“信息很多需要提煉。我可以先調(diào)用總結(jié)工具聚焦于‘亮點(diǎn)’?!?輸出決策動(dòng)作summarize_text 輸入{“text”: [搜索結(jié)果的整合文本], “focus”: “financial highlights and key metrics”}。行動(dòng)執(zhí)行總結(jié)工具生成一份初步提煉的文本。反思評(píng)估總結(jié)結(jié)果是否覆蓋了“亮點(diǎn)”是否冗長(zhǎng)??赡苡|發(fā)一個(gè)輕量級(jí)反思認(rèn)為“信息已提煉但格式不是簡(jiǎn)報(bào)”。后續(xù)循環(huán)決策引擎可能繼續(xù)決策調(diào)用“撰寫報(bào)告”工具將總結(jié)內(nèi)容格式化為簡(jiǎn)報(bào)。最后調(diào)用“保存文件”工具輸出結(jié)果。在整個(gè)過程中如果搜索工具返回“未找到相關(guān)信息”則會(huì)觸發(fā)反思模塊分析是否查詢?cè)~不對(duì)并建議調(diào)整搜索策略。7.2 核心代碼結(jié)構(gòu)示意class TaskExecutionAgent: def __init__(self, llm_client, action_registry): self.llm llm_client self.actions action_registry self.working_memory WorkingMemory() self.reflector ReflectionModule(llm_client) def run(self, user_task: str): self.working_memory.set_goal(user_task) max_steps 20 for step in range(max_steps): # 1. 感知 observation self.perception_module.observe(self.working_memory) # 2. 決策 decision self.decision_engine.decide(self.working_memory, observation) self.working_memory.add_record(decision[“thought”], decision) # 記錄 # 3. 行動(dòng) result self.action_executor.execute(decision[“action”], decision[“action_input”]) self.working_memory.add_record(“action_result”, result) # 4. 評(píng)估與反思 if self.should_reflect(result, step): reflection self.reflector.analyze(self.working_memory, result) self.working_memory.integrate_reflection(reflection) # 將反思結(jié)論融入記憶 # 檢查任務(wù)是否完成 if self.working_memory.is_goal_achieved(): break return self.working_memory.get_final_output()7.3 性能優(yōu)化與調(diào)試技巧異步執(zhí)行如果動(dòng)作是IO密集型的如網(wǎng)絡(luò)請(qǐng)求可以將動(dòng)作執(zhí)行改為異步讓智能體在等待一個(gè)動(dòng)作結(jié)果的同時(shí)可能處理其他并行的子任務(wù)思考。緩存對(duì)昂貴的LLM調(diào)用如決策、反思或工具調(diào)用如搜索相同內(nèi)容的結(jié)果進(jìn)行緩存可以大幅降低成本和提高響應(yīng)速度??梢暬{(diào)試將每個(gè)循環(huán)的thought、action、result以及工作記憶的狀態(tài)變化以日志或可視化界面的形式輸出。這是理解智能體“思維過程”、定位問題的最有效手段??梢栽O(shè)計(jì)一個(gè)簡(jiǎn)單的Web界面實(shí)時(shí)展示智能體的決策流。8. 常見問題與排查指南在實(shí)際構(gòu)建和運(yùn)行Agent控制循環(huán)時(shí)你會(huì)遇到各種各樣的問題。下面是一些典型問題及其排查思路。8.1 智能體陷入無效循環(huán)或重復(fù)動(dòng)作現(xiàn)象智能體反復(fù)執(zhí)行相同或相似的動(dòng)作無法推進(jìn)任務(wù)??赡茉蚺c排查觀察信息不足或未更新檢查感知模塊是否正確地將行動(dòng)結(jié)果納入了工作記憶并傳遞給了下一次決策??赡苁墙Y(jié)果解析失敗導(dǎo)致LLM每次看到的都是舊信息。決策提示詞缺乏約束提示詞中沒有明確要求智能體避免重復(fù)或者沒有提供足夠的上下文來區(qū)分“已嘗試過”和“未嘗試”的方案。在提示詞中加入類似“你已經(jīng)嘗試過A方法但失敗了請(qǐng)嘗試不同的方法”的指令。缺少進(jìn)展評(píng)估工作記憶中沒有“已嘗試步驟”的明確記錄和“任務(wù)完成條件”的判斷。需要在工作記憶中維護(hù)一個(gè)“已嘗試動(dòng)作列表”并在決策提示詞中讓其參考。反思模塊未觸發(fā)系統(tǒng)可能缺少對(duì)“循環(huán)檢測(cè)”的邏輯??梢蕴砑右粋€(gè)簡(jiǎn)單的規(guī)則如果連續(xù)3個(gè)循環(huán)的動(dòng)作本質(zhì)相同則強(qiáng)制觸發(fā)深度反思。8.2 工具調(diào)用參數(shù)總是錯(cuò)誤現(xiàn)象LLM決策時(shí)選擇的工具是對(duì)的但生成的參數(shù)格式不對(duì)、缺少必填字段或值不合理。可能原因與排查工具描述不清檢查注冊(cè)工具時(shí)提供的description和schema是否足夠清晰、示例化。LLM不理解“id”字段應(yīng)該是什么格式如果你寫“用戶ID”它可能生成一個(gè)名字。應(yīng)該寫成“用戶ID字符串格式例如‘user_123456’”。缺少參數(shù)預(yù)處理LLM可能生成“明天下午三點(diǎn)”而工具需要“2024-05-28 15:00:00”。需要在行動(dòng)執(zhí)行器的流水線中加入一個(gè)參數(shù)預(yù)處理步驟使用一個(gè)小的LLM調(diào)用或規(guī)則將自然語言參數(shù)轉(zhuǎn)換為規(guī)范格式。輸出格式約束不夠強(qiáng)雖然要求輸出JSON但可能沒有用更嚴(yán)格的方式如函數(shù)調(diào)用Function Calling、或結(jié)構(gòu)化輸出Structured Outputs來約束LLM。如果所用LLM API支持優(yōu)先使用這些原生結(jié)構(gòu)化輸出功能比在提示詞中要求JSON更可靠。8.3 智能體“忘記”最終目標(biāo)在子任務(wù)中迷失現(xiàn)象智能體在執(zhí)行一系列子任務(wù)如不斷搜索、總結(jié)后不再回歸到主任務(wù)如撰寫簡(jiǎn)報(bào)。可能原因與排查工作記憶中的目標(biāo)被稀釋在組裝決策上下文時(shí)原始的用戶任務(wù)最高目標(biāo)被埋沒在大量的歷史對(duì)話和中間結(jié)果中。解決方案在每次給決策引擎的提示詞中將“最終目標(biāo)”單獨(dú)、醒目地放在最前面并可能每次循環(huán)都重復(fù)強(qiáng)調(diào)。缺乏高層規(guī)劃智能體只做一步?jīng)Q策沒有生成一個(gè)指向最終目標(biāo)的頂層計(jì)劃。解決方案在任務(wù)開始時(shí)讓決策引擎先做一個(gè)規(guī)劃步驟輸出一個(gè)大致步驟列表如1. 搜索信息2. 提煉亮點(diǎn)3. 撰寫簡(jiǎn)報(bào)。將這個(gè)計(jì)劃存入工作記憶并在后續(xù)每個(gè)決策步驟中都讓LLM參考這個(gè)計(jì)劃并標(biāo)記當(dāng)前步驟的完成情況。反思模塊未評(píng)估目標(biāo)偏離反思只關(guān)注動(dòng)作失敗不評(píng)估整體進(jìn)展。解決方案在反思的觸發(fā)條件或反思提示詞中加入對(duì)“當(dāng)前進(jìn)展是否偏離最終目標(biāo)”的評(píng)估。8.4 處理速度慢延遲高現(xiàn)象完成一個(gè)簡(jiǎn)單任務(wù)需要數(shù)十秒甚至分鐘級(jí)??赡茉蚺c排查順序執(zhí)行與網(wǎng)絡(luò)延遲所有步驟LLM決策、工具調(diào)用、LLM反思都是同步順序執(zhí)行且工具調(diào)用如網(wǎng)絡(luò)搜索可能有高延遲。優(yōu)化將可以并行的操作并行化。例如如果決策是調(diào)用多個(gè)獨(dú)立的工具可以考慮讓它們同時(shí)執(zhí)行?;蛘邔LM調(diào)用決策、反思與IO操作工具執(zhí)行異步化。上下文過長(zhǎng)工作記憶積累太多導(dǎo)致每次決策提示詞都非常龐大LLM處理速度變慢Token消耗激增。優(yōu)化實(shí)施前文提到的分層記憶和摘要機(jī)制嚴(yán)格控制輸入LLM的上下文長(zhǎng)度。過度反思每個(gè)循環(huán)都進(jìn)行深度LLM反思。優(yōu)化根據(jù)規(guī)則如只有失敗或停滯時(shí)才反思來動(dòng)態(tài)控制反思的深度和頻率對(duì)于簡(jiǎn)單確認(rèn)可以使用更快的規(guī)則引擎或小模型。構(gòu)建一個(gè)穩(wěn)定、高效、智能的Agent系統(tǒng)控制循環(huán)的設(shè)計(jì)與實(shí)現(xiàn)是核心。它沒有一成不變的銀彈需要你根據(jù)具體的任務(wù)領(lǐng)域、可用的工具和性能要求不斷地迭代和調(diào)優(yōu)。從最簡(jiǎn)單的單循環(huán)開始逐步增加記憶、反思、規(guī)劃等高級(jí)功能并輔以完善的日志和監(jiān)控你就能讓這個(gè)“大腦”越來越聰明真正解決那些令人頭疼的復(fù)雜自動(dòng)化任務(wù)。