定執(zhí)行循環(huán)架構(gòu)的設(shè)計(jì)與實(shí)戰(zhàn))
做 AI Agent 的同學(xué)應(yīng)該都有同感真正難的往往不是模型怎么選也不是提示詞怎么調(diào)而是讓你那個(gè) Agent 在復(fù)雜的真實(shí)任務(wù)里穩(wěn)定地把事情做完。我見過太多項(xiàng)目Demo 跑得飛快一上真實(shí)場(chǎng)景就卡死、反復(fù)橫跳、工具調(diào)錯(cuò)、上下文爆掉。后來我把 Agent 的執(zhí)行過程抽象成一套循環(huán)起名叫 Hermes Agent Loop。它不是什么神級(jí)框架就是一套把“感知—決策—行動(dòng)—觀察”串起來的執(zhí)行范式配合開源模型和可插拔的工具鏈非常適合自己搭 Agent、做流程優(yōu)化、或者排查為什么你的 Agent 會(huì)失控。這篇就把我在這套循環(huán)里的設(shè)計(jì)思路、踩坑記錄和實(shí)操方案完整拆給大家。1. 拆解循環(huán)的骨架為什么 Agent 一定要有 Loop1.1 Hermes Agent Loop 到底在解決什么問題先說我為什么要把 Agent 的執(zhí)行流程強(qiáng)制抽象成 Loop而不是像早期很多項(xiàng)目那樣寫一個(gè)“調(diào)一次模型 → 輸出結(jié)果 → 結(jié)束”的腳本。因?yàn)楝F(xiàn)實(shí)任務(wù)基本都不是單輪能完成的比如讓 Agent 去查資料、寫代碼、跑測(cè)試、再根據(jù)結(jié)果修改代碼這中間每一步都依賴前一步的輸出而且每一步都可能出錯(cuò)。如果沒有循環(huán)結(jié)構(gòu)你就要在外層寫一堆 if-else 來處理分支代碼很快變成一坨誰都看不懂的狀態(tài)機(jī)。Hermes Agent Loop 的核心價(jià)值是把控制權(quán)從代碼手里交還給模型手里。循環(huán)的外部結(jié)構(gòu)是統(tǒng)一的每一輪都讓模型基于當(dāng)前狀態(tài)輸出一個(gè)決策決策如果是調(diào)用工具就執(zhí)行工具然后把工具結(jié)果放回上下文再進(jìn)入下一輪。決策如果是結(jié)束就退出循環(huán)。這樣一來業(yè)務(wù)邏輯和 Agent 的自主決策被徹底拆開你只需要維護(hù)好循環(huán)的通用骨架剩下的路徑選擇全部交給模型。我在實(shí)際項(xiàng)目里體會(huì)到這套設(shè)計(jì)最大的好處是容錯(cuò)能力前置。傳統(tǒng)的流程式代碼遇到預(yù)料之外的情況基本就崩了而循環(huán)式的 Agent 架構(gòu)可以在運(yùn)行時(shí)自我糾偏——上一輪工具報(bào)錯(cuò)下一輪模型看到報(bào)錯(cuò)信息后可以換一個(gè)方案繼續(xù)走不需要人類介入。這不是模型變聰明了而是你的架構(gòu)給了模型兜底的機(jī)會(huì)。1.2 為什么是循環(huán)而不是單次調(diào)用單次調(diào)用最大的問題是上下文不可復(fù)用。比如你想讓 Agent 調(diào)研一個(gè)開源項(xiàng)目第一輪模型給出了三個(gè)方向但你沒有把這些方向存下來讓模型繼續(xù)深入那第二輪模型就只能重新推理既浪費(fèi) token 又丟失了狀態(tài)。更嚴(yán)重的是單次調(diào)用無法感知外部世界的變化你調(diào)了個(gè) API 拿到結(jié)果但這個(gè)結(jié)果沒法反哺給模型做下一步判斷Agent 就成了睜眼瞎。循環(huán)結(jié)構(gòu)的本質(zhì)是對(duì)“思考—行動(dòng)—反饋”這個(gè)人類解決問題過程的重現(xiàn)。人做事的時(shí)候也是這樣先看目標(biāo)然后決定第一步做什么做完看效果如果效果不對(duì)就調(diào)整直到完成或者放棄。Hermes Agent Loop 就是把這套過程顯式表達(dá)在代碼里每一步的中間結(jié)果都回流到模型上下文形成一個(gè)不斷更新的狀態(tài)空間。我經(jīng)常打一個(gè)比方單次調(diào)用像是學(xué)游泳只讓你看教學(xué)視頻循環(huán)架構(gòu)才是真的把你扔進(jìn)水里讓你撲騰幾圈再根據(jù)你的動(dòng)作反饋調(diào)整姿勢(shì)。沒有反饋閉環(huán)的 Agent 永遠(yuǎn)只能是玩具不是因?yàn)槟P筒粔蚵斆魇且驗(yàn)樗狈π畔⒒亓?。而信息回流的關(guān)鍵載體正是循環(huán)結(jié)構(gòu)中每一輪新增的那一小段上下文。1.3 整體架構(gòu)四段式循環(huán)的職責(zé)劃分Hermes Agent Loop 的每一輪都包含四個(gè)環(huán)節(jié)這四段式劃分是我反復(fù)試錯(cuò)后固定下來的職責(zé)清晰邊界明確排查問題的時(shí)候能很快定位到是哪一環(huán)出了岔子。第一環(huán)是感知。感知指的不是計(jì)算機(jī)視覺那種感知而是把當(dāng)前的外部狀態(tài)、歷史記憶、工具返回結(jié)果、用戶目標(biāo)這些信息匯總成模型能讀懂的輸入。你可能會(huì)問這不是普通的上下文拼接嗎對(duì)但關(guān)鍵在于感知環(huán)節(jié)必須做信息篩選和格式統(tǒng)一不能一股腦把日志全塞給模型。我在下面的章節(jié)會(huì)詳細(xì)講怎么設(shè)計(jì)狀態(tài)結(jié)構(gòu)。第二環(huán)是決策。模型看到整理好的狀態(tài)之后輸出一個(gè)動(dòng)作意圖。這個(gè)意圖必須遵循嚴(yán)格的結(jié)構(gòu)化格式比如 JSON里面包含動(dòng)作類型、參數(shù)、以及這句動(dòng)作的理由。決策環(huán)是整個(gè)循環(huán)的大腦也是提示詞設(shè)計(jì)最關(guān)鍵的戰(zhàn)場(chǎng)。第三環(huán)是行動(dòng)。循環(huán)解析模型輸出的 JSON校驗(yàn)參數(shù)然后調(diào)用對(duì)應(yīng)的工具。工具可以是代碼執(zhí)行器、搜索接口、文件讀寫、爬蟲腳本等等。行動(dòng)環(huán)節(jié)最重要的是做參數(shù)校驗(yàn)和錯(cuò)誤隔離不能讓工具的異常直接把循環(huán)打崩。第四環(huán)是觀察。工具執(zhí)行結(jié)果通過觀察環(huán)節(jié)被寫回狀態(tài)成為下一輪感知的信息來源。觀察不只是簡(jiǎn)單地把結(jié)果塞回去還需要做摘要、截?cái)?、提取關(guān)鍵信息。不然幾輪之后上下文就爆炸了。四段式循環(huán)跑起來之后你會(huì)看到 Agent 的行為變得很像一個(gè)做事謹(jǐn)慎的人先看再想做一步看一眼結(jié)果再想再做。穩(wěn)定性和可控性都會(huì)明顯提升。2. 循環(huán)內(nèi)部的核心機(jī)制每個(gè)環(huán)節(jié)的設(shè)計(jì)要點(diǎn)2.1 決策模塊提示詞與推理層的設(shè)計(jì)決策模塊是 Hermes Agent Loop 里最值得花心思的地方。我的做法是給模型一個(gè)固定的決策輸出格式同時(shí)給它足夠的自由做中間推理但推理和決策必須分開。什么意思就是讓模型先輸出一小段 thought再輸出一個(gè)明確的 action而不能把兩者混在一起。比如我常用的決策輸出 JSON 結(jié)構(gòu)是這樣的{ thought: 用戶想了解開源AI agent平臺(tái)我需要先去搜索最新的平臺(tái)列表再結(jié)合已知信息做整理。, action: { name: web_search, args: { query: 開源AI agent平臺(tái) } } }這里有個(gè)細(xì)節(jié)action 必須是一個(gè)明確的工具名加上參數(shù)對(duì)。我在解析層只認(rèn)這個(gè) JSON 結(jié)構(gòu)任何模型多余輸出的文字一律忽略。這會(huì)讓循環(huán)變得非常機(jī)械但機(jī)械恰恰是穩(wěn)定性的保證。模型在輸出 JSON 的時(shí)候會(huì)自然地把推理收斂到可執(zhí)行的粒度上。提示詞設(shè)計(jì)上我堅(jiān)持在系統(tǒng)提示詞里寫清楚四件事第一你是誰你的職責(zé)邊界是什么第二你能用哪些工具每個(gè)工具的參數(shù)怎么寫第三什么時(shí)候必須結(jié)束循環(huán)把最終結(jié)果直接給用戶第四遇到錯(cuò)誤時(shí)該怎么處理。這四點(diǎn)缺一不可尤其是第四點(diǎn)很多 Agent 出錯(cuò)了不知道怎么辦是因?yàn)槟愕奶崾驹~根本沒告訴它“出錯(cuò)后允許重試、換方案、或者結(jié)束”。另外還要強(qiáng)調(diào)一點(diǎn)決策模塊的模型參數(shù)也會(huì)影響行為。溫度建議在 0.2 到 0.4 之間太高容易讓工具調(diào)用格式不穩(wěn)定太低又缺少靈活應(yīng)變的能力。我在生產(chǎn)環(huán)境里一般設(shè)置 0.3認(rèn)為這是一個(gè)不錯(cuò)的平衡點(diǎn)。如果你用的是帶 Reasoning 能力的開放模型比如 DeepSeek-R1可以調(diào)節(jié) reason 輸出的長度上限防止模型在 thought 里噦噦嗦嗦不干活。2.2 工具注冊(cè)與調(diào)用協(xié)議工具是 Hermes Agent Loop 的四肢而工具注冊(cè)表是連接模型和真實(shí)世界的橋梁。我的建議是工具注冊(cè)表要做成統(tǒng)一的 schema 結(jié)構(gòu)一個(gè)工具條目至少包含名字、描述、參數(shù)定義和可選的示例。這個(gè) schema 會(huì)同時(shí)被提示詞和解析器使用模型看到的是人類可讀的描述解析器看到的是可校驗(yàn)的參數(shù)約束。一個(gè)工具條目長這樣工具名: web_search 描述: 通過搜索引擎檢索最新信息返回標(biāo)題、鏈接和摘要。 參數(shù): - name: query type: string required: true description: 搜索關(guān)鍵詞 示例: web_search(開源AI agent平臺(tái) 2025)看到?jīng)]這里的關(guān)鍵是把描述寫得讓模型一看就懂告訴它什么時(shí)候用這個(gè)工具、怎么構(gòu)造參數(shù)。我踩過一個(gè)坑某個(gè)工具的參數(shù)名是q描述里沒寫清楚結(jié)果模型老是用query這個(gè)參數(shù)名去調(diào)報(bào)錯(cuò)一堆。后來我把參數(shù)名改成query異常立刻少了七成。所以你在設(shè)計(jì)工具接口的時(shí)候參數(shù)命名越符合直覺越好別搞那些 terse 的縮寫。調(diào)用協(xié)議上我要求所有工具返回結(jié)果必須統(tǒng)一包裝成結(jié)構(gòu)化的形式至少包含三個(gè)字段status表示成功失敗data表示業(yè)務(wù)數(shù)據(jù)error表示錯(cuò)誤信息。模型在觀察環(huán)節(jié)只需要讀這個(gè)統(tǒng)一格式不用去猜不同工具返回格式差異。這樣循環(huán)的通用性才能保證。還有個(gè)實(shí)操細(xì)節(jié)工具執(zhí)行應(yīng)該設(shè)計(jì)超時(shí)和最大重試次數(shù)。代碼執(zhí)行器這種危險(xiǎn)工具甚至要跑在沙箱里防止 Agent 抽出惡意代碼把宿主機(jī)搞掛。我見過不少初學(xué)者在本地直接讓 Agent 執(zhí)行 shell 命令結(jié)果 Agent 跑到一半刪掉了環(huán)境變量這種教訓(xùn)說多了都是淚。2.3 記憶層短期上下文與長期存儲(chǔ)的配合循環(huán)跑起來之后你會(huì)發(fā)現(xiàn)每一輪的信息都在增長模型可用的上下文卻在縮水。這時(shí)候記憶層就必須登場(chǎng)。我把記憶分成兩層短期上下文和長期記憶。短期上下文就是當(dāng)前循環(huán)內(nèi)每一輪的感知輸入、決策輸出、觀察結(jié)果這個(gè)你直接拼接進(jìn)提示詞就行。我的經(jīng)驗(yàn)是短期上下文一定要做壓縮不能每輪都把原始日志塞進(jìn)去。比如工具返回了 1000 行數(shù)據(jù)我只取前 50 行加一個(gè)“結(jié)果過長已截?cái)喙?1000 行”的說明。這樣模型既能看到關(guān)鍵信息又不至于被淹沒在細(xì)節(jié)里。長期記憶則要落到存儲(chǔ)系統(tǒng)里常見的有向量數(shù)據(jù)庫、KV 存儲(chǔ)甚至就是個(gè) JSON 文件。長期記憶的作用是跨會(huì)話復(fù)用信息。比如 Agent 已經(jīng)調(diào)研過某個(gè)平臺(tái)下次再遇到類似任務(wù)它可以把之前的調(diào)研結(jié)論從長期記憶里取出來避免重復(fù)勞動(dòng)。這里我建議使用向量檢索而不是關(guān)鍵詞匹配因?yàn)槟P偷乃伎歼^程是語義化的向量檢索才能找到“看起來不太一樣但意思相近”的舊經(jīng)驗(yàn)。記憶寫入要講究時(shí)機(jī)。我通常在每個(gè)循環(huán)結(jié)束之后判斷這一輪是否有值得存入長期記憶的信息避免把對(duì)抗樣本一樣的噪音也存進(jìn)去。定期清理過期記憶也很關(guān)鍵不然你的向量庫會(huì)越來越臟檢索出來的結(jié)果全都是陳年舊事。2.4 循環(huán)終止條件的設(shè)計(jì)沒有終止條件的循環(huán)就是死循環(huán)這是 Agent 開發(fā)最容易翻車的地方。我見過最夸張的一次Agent 在一個(gè)文檔問答任務(wù)里連續(xù)執(zhí)行了 60 多輪調(diào)用每次都在搜索同樣的關(guān)鍵詞就像個(gè)小學(xué)生不斷查同一個(gè)詞條就是不寫答案。所以要給循環(huán)設(shè)計(jì)多級(jí)安全閥。第一級(jí)是模型主動(dòng)終止。模型決策輸出finish動(dòng)作時(shí)循環(huán)結(jié)束這是最理想的情況。第二級(jí)是最大輪數(shù)限制比如單次任務(wù)最多跑 20 輪超過就強(qiáng)制終止并輸出“任務(wù)未完成”。第三級(jí)是重復(fù)檢測(cè)連續(xù)多輪的工具調(diào)用和決策高度相似說明 Agent 陷入原地轉(zhuǎn)圈這時(shí)候就要中斷。第四級(jí)是時(shí)間超時(shí)整體耗時(shí)超過設(shè)定閾值就強(qiáng)制退出。我建議在循環(huán)柄里把這些終止條件都做成可配置的不同任務(wù)給不同的上限。比如寫代碼任務(wù)輪數(shù)上限可以放寬到 30而簡(jiǎn)單問答任務(wù) 5 輪就夠了。另外終止之前最好讓 Agent 輸出一個(gè)“當(dāng)前進(jìn)展說明”即使任務(wù)沒完成至少用戶知道它卡在哪一步這一步對(duì)調(diào)試價(jià)值巨大。3. 實(shí)操從零搭一套可運(yùn)行的 Hermes Agent Loop3.1 先把最簡(jiǎn)循環(huán)骨架跑起來不整花活我直接給一個(gè)精心斟酌過的、最簡(jiǎn)結(jié)構(gòu)的 Python 偽代碼你可以把它作為起點(diǎn)from json import loads, dumps class HermesAgentLoop: def __init__(self, llm, tools, max_rounds20): self.llm llm self.tools {t.name: t for t in tools} self.max_rounds max_rounds def run(self, task): state { task: task, history: [], observation: None, round: 0 } while state[round] self.max_rounds: state[round] 1 prompt self._build_prompt(state) raw self.llm(prompt, temperature0.3) decision loads(self._extract_json(raw)) thought decision.get(thought, ) action decision[action] if action[name] finish: return decision.get(result, state[observation]) tool self.tools.get(action[name]) if not tool: state[observation] {status: error, error: tool not found} else: try: result tool.execute(**action[args]) state[observation] {status: ok, data: result} except Exception as e: state[observation] {status: error, error: str(e)} state[history].append({ round: state[round], thought: thought, action: action, observation: state[observation] }) return {status: max_rounds_exceeded, history: state[history]}這個(gè)骨架的邊界條件很關(guān)鍵最大輪數(shù)、異常捕獲、JSON 解析、狀態(tài)累積一環(huán)都不能少。先把這套最簡(jiǎn)骨架跑通再談花哨功能。我發(fā)現(xiàn)很多同學(xué)一上來就學(xué) LangGraph、CrewAI結(jié)果連最基礎(chǔ)的 agent 循環(huán)都說不清楚遇到框架層面的問題就抓瞎。自己徒手搭一遍至少能幫你建立對(duì)執(zhí)行流程的直覺。3.2 接入真實(shí)工具與外部 API骨架搭好之后第二步就是接入真實(shí)工具。我建議從三個(gè)角度入手信息檢索工具、代碼執(zhí)行工具、文件操作工具。這三個(gè)基本覆蓋了大多數(shù)任務(wù)場(chǎng)景。拿信息檢索工具來說我常用的是調(diào)用搜索 API把所有返回結(jié)果統(tǒng)一成標(biāo)準(zhǔn)格式。這里的實(shí)操重點(diǎn)是工具接口的封裝。我給你的建議是不要直接在工具函數(shù)里寫業(yè)務(wù)邏輯而是把每個(gè)工具都做成一個(gè)獨(dú)立的類或模塊只暴露一個(gè)通用的execute(**kwargs)接口。這樣循環(huán)骨架完全不用關(guān)心工具內(nèi)部是怎么實(shí)現(xiàn)的加新工具就跟插拔 USB 一樣簡(jiǎn)單。接入代碼執(zhí)行工具的坑比較多因?yàn)閳?zhí)行任意代碼的安全風(fēng)險(xiǎn)極大。我建議至少使用 Docker 容器隔離或者使用在線沙箱服務(wù)。不要圖方便直接在本地進(jìn)程跑。我曾經(jīng)為了省事在本機(jī)跑 Python 代碼執(zhí)行工具Agent 為了完成一個(gè)統(tǒng)計(jì)任務(wù)居然把系統(tǒng)里的臨時(shí)文件全刪了從那之后再也不敢不隔離就上生產(chǎn)。工具接入完成后一定要做一件事用真實(shí)的 Agent 決策輸出去測(cè)。模型會(huì)生成各種你意想不到的參數(shù)組合比如列表類型的參數(shù)傳成字符串、必填字段缺著、甚至把布爾值寫成英文單詞。這些都要在工具執(zhí)行層做好容錯(cuò)和參數(shù)解析而不是期望模型每次都完美輸出。3.3 加入記憶與反思機(jī)制骨架和工具都穩(wěn)定之后就可以把記憶和反思機(jī)制加進(jìn)來了。這步做完你的 Agent 才算是真正有點(diǎn)“智能感”。我的做法是在每次循環(huán)結(jié)束之后額外增加一個(gè)可選的反思步驟讓模型回顧剛才的動(dòng)作和結(jié)果判斷下一步是否需要調(diào)整策略。不過反思機(jī)制要控制頻率不然每一輪都額外調(diào)一次模型成本和延遲都翻倍。我的經(jīng)驗(yàn)是每 3-5 輪反思一次或者檢測(cè)到連續(xù)兩次工具調(diào)用的領(lǐng)域相同但結(jié)果不理想時(shí)觸發(fā)一次反思。反思的輸出會(huì)作為額外的一輪“觀察結(jié)果”寫進(jìn)短期上下文給決策模塊提供參考。長期記憶的嵌入方式也很講究。我建議把長期記憶檢索結(jié)果放到系統(tǒng)提示詞的下方和短期上下文分開用明確的標(biāo)記指示這是歷史經(jīng)驗(yàn)而非當(dāng)前任務(wù)信息。模型看到歷史經(jīng)驗(yàn)后可以決定是否采納但不會(huì)被歷史帶偏。這個(gè)邊界劃分是我調(diào)了很多輪 prompt 才穩(wěn)定的大家可以借鑒。3.4 測(cè)試與壓測(cè)循環(huán)穩(wěn)定性搭建完框架只能算完成了 30%剩下的功夫全在測(cè)試和壓測(cè)上。我給每個(gè) Agent 流程都準(zhǔn)備一個(gè)測(cè)試用例集里面包含正常任務(wù)、邊緣任務(wù)、故意給錯(cuò)誤提示的任務(wù)、需要多步推理的任務(wù)。跑一遍看看穩(wěn)定性統(tǒng)計(jì)成功率、平均輪數(shù)、平均耗時(shí)、token 消耗。壓測(cè)的時(shí)候我最看重的指標(biāo)是“最長鏈路的穩(wěn)定性”。有些 Agent 在小任務(wù)上表現(xiàn)不錯(cuò)一遇到需要調(diào)用 20 次工具的長鏈路就開始崩常見原因是上下文溢出、模型開始遺忘早期目標(biāo)、或者工具結(jié)果的錯(cuò)誤信息累積形成了誤導(dǎo)。解決長鏈路問題的關(guān)鍵在于早期目標(biāo)的重申——在每個(gè)決策 prompt 的開頭都重新強(qiáng)調(diào)用戶最重要目標(biāo)防止 Agent 跑偏。我還推薦做一輪“故障注入”測(cè)試人為讓某個(gè)工具返回錯(cuò)誤、讓某個(gè) API 超時(shí)、讓模型輸出非 JSON 格式??纯茨愕难h(huán)能不能優(yōu)雅地恢復(fù)還是直接罷工。這輪測(cè)試做下來你對(duì)循環(huán)的魯棒性就有底了。我自己的項(xiàng)目就是靠這個(gè)辦法把成功率從 50% 提到 90% 以上的。4. 常見故障與排查技巧實(shí)錄4.1 無限循環(huán)和重復(fù)動(dòng)作的根治方案無限循環(huán)應(yīng)該是 Agent 開發(fā)里出現(xiàn)頻率最高的故障了。癥狀很簡(jiǎn)單日志里連續(xù)十幾輪都是同一個(gè)工具調(diào)用參數(shù)都沒怎么變Agent 像著了魔一樣反復(fù)搜索、反復(fù)重試。第一反應(yīng)先看當(dāng)前決策的 thought 內(nèi)容。如果 thought 顯示模型認(rèn)為“這次結(jié)果還不滿意我需要再試一次”說明原因十有八九是工具返回?cái)?shù)據(jù)里沒有出現(xiàn)模型期望的關(guān)鍵內(nèi)容。比如模型想搜索某個(gè)平臺(tái)的最新版本但搜索結(jié)果一直是舊版本的信息模型就會(huì)不斷換關(guān)鍵詞重試。這種時(shí)候與其讓模型死磕不如在觀察環(huán)節(jié)做一次數(shù)據(jù)質(zhì)量檢查判斷搜索結(jié)果的時(shí)效性是否滿足要求不滿足就主動(dòng)切換到更可靠的查詢方式。重復(fù)動(dòng)作還有一個(gè)隱藏原因是模型上下文太長了導(dǎo)致它忘記自己已經(jīng)做過同樣的事。這個(gè)用輪數(shù)上限和重復(fù)檢測(cè)兜底能解決。我的實(shí)現(xiàn)是在歷史記錄里保存每輪的動(dòng)作和參數(shù)哈希如果最近五輪里有三輪的動(dòng)作名和參數(shù)哈希完全一樣就直接中斷循環(huán)并提示補(bǔ)全任務(wù)描述。4.2 工具調(diào)用格式不穩(wěn)定的調(diào)優(yōu)方法模型輸出 JSON 不穩(wěn)定是家常便飯。常見錯(cuò)誤包括JSON 字段名引號(hào)缺失、數(shù)組末尾多逗號(hào)、單引號(hào)替代雙引號(hào)、甚至在 JSON 前面輸出一段解釋文字。第一道防線是寬容的 JSON 解析器能自動(dòng)修復(fù)常見的語法錯(cuò)誤。第二道防線是提示詞里給一個(gè)極簡(jiǎn)的 JSON 示例并強(qiáng)調(diào)“只輸出 JSON不要多余文字”。如果頻繁出現(xiàn)字段名不對(duì)的情況我建議你在解析層做一個(gè)字段名映射把常見的錯(cuò)誤命名比如arg、arguments、params自動(dòng)對(duì)應(yīng)到args。這招看著不太優(yōu)雅但實(shí)測(cè)非常有效。模型不是故意寫錯(cuò)而是不同模型的輸出習(xí)慣不同讓解析器去適配模型比逼著模型每次都完美輸出要省力得多。對(duì)于無法解析的決策輸出我給循環(huán)定了一個(gè)策略允許最多重新生成一次。第二次還是解析失敗的話就把錯(cuò)誤信息寫進(jìn)觀察結(jié)果讓模型看到“你上一輪輸出格式無法解析”這輪它大概率會(huì)收斂回正確格式。這個(gè)策略把格式錯(cuò)誤的處理成本從人工干預(yù)降到了最小。4.3 上下文窗口被撐爆的處理策略上下文打滿是每個(gè) Agent 開發(fā)者都躲不開的坑。其中最致命的是工具返回巨大文本比如爬蟲抓了幾千行網(wǎng)頁源碼Agent 還沒來得及處理上下文就超限了。我的對(duì)策是在工具層做截?cái)啾热缇W(wǎng)頁內(nèi)容只保留前 2000 個(gè)字符和標(biāo)題代碼執(zhí)行結(jié)果只保留 stdout 的前 50 行。截?cái)嘁?guī)則要寫在工具描述里讓模型知道它拿到的本來就是摘要信息。另一招是給歷史記錄做滑動(dòng)窗口。我只保留最近 6 輪完整的 thought、action、observation 信息再往前的都?jí)嚎s成一行摘要。這招對(duì)控制 token 成本效果立竿見影但也犧牲了長程記憶。如果你需要處理長程任務(wù)建議把早期發(fā)現(xiàn)整合到長期記憶里通過向量檢索按需調(diào)用。模型輸出長度也要限制。給 LLM 設(shè) max_tokens 上限保證模型不會(huì)一次性刷出一大段內(nèi)容。尤其是決策輸出我通常限制在 1024 到 2048 個(gè) token這足夠大多數(shù)工具調(diào)用。預(yù)算充足的高級(jí)模型可能輸出很長的中間推理這里要靈活處理別一棍子打死。4.4 幻覺導(dǎo)致的決策錯(cuò)誤與緩解措施Agent 幻覺主要體現(xiàn)在構(gòu)建不存在的工具參數(shù)、虛構(gòu)工具返回結(jié)果、以及跳過必要的驗(yàn)證步驟。比如它明明沒有調(diào)用過某個(gè)工具卻在 thought 里寫“根據(jù)工具返回的結(jié)果我認(rèn)為都是正確的指令”。這其實(shí)是模型在自我洗腦。緩解措施之一是增加“證據(jù)校驗(yàn)”機(jī)制。每輪決策的 thought 里如果提到某個(gè)觀察結(jié)果就要求它引用對(duì)應(yīng)的 round 編號(hào)或工具名否則判定為不可信。這在代碼上就需要解析 thought 里是否包含工具名關(guān)鍵詞。簡(jiǎn)單粗暴卻很有效模型的幻覺輸出被大幅壓縮。第二招是給工具調(diào)用加“參數(shù)強(qiáng)校驗(yàn)”和“權(quán)限控制”。哪怕模型幻覺出了一個(gè)不存在的參數(shù)工具層直接拒絕執(zhí)行并返回錯(cuò)誤Agent 就會(huì)知道這條路不通轉(zhuǎn)而換策略。這比起讓模型自己改錯(cuò)更穩(wěn)妥。有權(quán)限邊界的工具更是要嚴(yán)格約束不該讓它訪問的路徑絕不開放。4.5 常見問題速查表現(xiàn)象可能原因建議排查動(dòng)作連續(xù)多輪同樣工具調(diào)用且參數(shù)不變目標(biāo)未達(dá)成、觀察信息不充分檢查工具返回內(nèi)容質(zhì)量增設(shè)輪數(shù)上限決策 JSON 解析失敗輸出格式不穩(wěn)定、解析器太嚴(yán)苛使用寬容解析器允許重新生成一次上下文超限工具返回過大、歷史累積過多工具截?cái)鄽v史滑動(dòng)窗口、增加壓縮摘要工具返回正常但仍不結(jié)束缺少明確的終止條件提示詞中強(qiáng)調(diào) finish 條件并加輪數(shù)兜底模型虛構(gòu)工具執(zhí)行結(jié)果證據(jù)缺失、提示詞引導(dǎo)不足要求 thought 引用工具名校驗(yàn)證據(jù)鏈循環(huán)內(nèi) token 成本過高決策次數(shù)太多、模型輸出太長壓上限、提示詞增強(qiáng)約束、滑動(dòng)窗口這個(gè)表是我平時(shí)排查問題的快捷入口有點(diǎn)像是給 Agent 做體檢的標(biāo)準(zhǔn)對(duì)照表。開發(fā)新流程遇到異常先對(duì)號(hào)入座能大幅減小找 bug 的時(shí)間。5. 演進(jìn)路線與個(gè)人經(jīng)驗(yàn)沉淀5.1 從單 Agent 到多 Agent 協(xié)作的升級(jí)關(guān)鍵Hermes Agent Loop 跑穩(wěn)一段之后你自然會(huì)想怎么把它擴(kuò)展成多 Agent 協(xié)作。我的建議是不要一窩蜂地上多 Agent 架構(gòu)先把單 Agent 的執(zhí)行流程做到 90% 以上的任務(wù)成功率再考慮拆分角色。多 Agent 協(xié)作最常見的形態(tài)是主從模式一個(gè) Planner Agent 負(fù)責(zé)拆解任務(wù)、一個(gè) Executor Agent 負(fù)責(zé)執(zhí)行具體工具調(diào)用。我自己試過把 Hermes Agent Loop 作為底層執(zhí)行器包一層讓 Planner Agent 像調(diào)用工具一樣調(diào)用底層 Agent。這里要額外處理的是任務(wù)結(jié)果的回傳格式以及子任務(wù)失敗后整體計(jì)劃的動(dòng)態(tài)調(diào)整。多 Agent 的通信協(xié)議設(shè)計(jì)是個(gè)大坑你有機(jī)會(huì)可以單獨(dú)再寫一篇但核心思想仍然是循環(huán)只是循環(huán)套循環(huán)。5.2 把 Hermes Agent Loop 落地到開源平臺(tái)的感受現(xiàn)在市面上開源 AI Agent 平臺(tái)很多比如 LangGraph、Dify、Coze Studio 生態(tài)、AutoGPT 原型等。用這些平臺(tái)能省不少工作但理解 Hermes Agent Loop 這種底層循環(huán)模式對(duì)你使用平臺(tái)至關(guān)重要。我建議先靠自己搭一個(gè)最簡(jiǎn)循環(huán)再去看平臺(tái)的源碼和配置項(xiàng)你會(huì)發(fā)現(xiàn)很多平臺(tái)配置的本質(zhì)都是在調(diào)整循環(huán)的參數(shù)。比如 LangGraph 的StateGraph其實(shí)就是把循環(huán)的每一環(huán)拆成了帶狀態(tài)的圖節(jié)點(diǎn)設(shè)置interrupt_before等參數(shù)本質(zhì)上是在調(diào)整循環(huán)何時(shí)暫停何時(shí)繼續(xù)。我用 Hermes Agent Loop 概念去理解這些平臺(tái)的執(zhí)行流程后再遇到配置上的問題都能猜個(gè)八九不離十。開源平臺(tái)的價(jià)值在于幫你處理并發(fā)、持久化、監(jiān)控這些工程問題但真正的 Agent 行為邏輯還是要靠你對(duì)執(zhí)行流程的理解來掌控。5.3 我的幾點(diǎn)實(shí)戰(zhàn)心得與建議最后給準(zhǔn)備動(dòng)手做 Agent 的朋友兒幾個(gè)干貨建議。第一不要迷信大模型的能力好的執(zhí)行循環(huán)結(jié)構(gòu)遠(yuǎn)比換一個(gè)更強(qiáng)的模型重要。我用中等規(guī)模的開源模型配合精心設(shè)計(jì)的 Hermes Agent Loop能達(dá)到和更大的模型做單次調(diào)用相當(dāng)?shù)男Ч杀竞脱舆t還低不少。第二日志記錄要做好每輪的 thought、action、observation 都別省不然排查問題寸步難行。我習(xí)慣把日志直接落到文件或數(shù)據(jù)庫里用獨(dú)立的字段記錄動(dòng)作和參數(shù)哈希方便做重復(fù)檢測(cè)和統(tǒng)計(jì)分析。第三評(píng)估優(yōu)先于炫技。上線新功能之前先給 Agent 定義成功率、平均輪數(shù)、平均耗時(shí)這些指標(biāo)每次改動(dòng)都跑一遍評(píng)估集。不然你無法判斷改動(dòng)是變好還是變壞。我現(xiàn)在開發(fā)新流程的原則就是先把評(píng)估集搭好再動(dòng)手寫循環(huán)代碼。這套思路來自兩年來十幾個(gè) Agent 項(xiàng)目的沉淀希望能幫你少走點(diǎn)彎路。