為何長程任務需要鷹架
要一個代理「重構這個程式庫」或「規劃一趟一週的旅行」,光靠推理—行動迴圈是不夠的:任務橫跨的步數遠超過單一脈絡能舒服容納的量,而早期一個閃失就會滾雪球。有兩種結構能救它。規劃給代理一副未來的骨架,讓它不至於亂走。記憶給它與過去的連續性,讓它不至於忘掉已經學到的東西。第一卷在代理的規劃與記憶下勾勒了兩者;在這裡,我們把每一個都講精確。
LLM 規劃:先計畫再行動 vs 交織進行
LLM 規劃是運用語言模型,在執行之前(或同時)把一個目標轉成有順序的步驟結構。兩個極端是先計畫再執行——先把整份計畫寫好,再一步步跑——以及交織式規劃,代理在每次觀察後重新規劃(推理—行動迴圈就是這的極端)。事先擬好的計畫清晰、易於檢視,但當世界給你驚喜時很脆;交織式規劃能適應,卻可能弄丟整體目標的主線。多數強大的系統兩者並用:一份粗略的常駐計畫,隨觀察到來而被重新審視、修訂。
子目標拆解與層級
規劃的引擎是子目標拆解:把一個困難的目標切成較小的子目標,每個子目標若非可直接解決、就再進一步拆解,形成一個層級。一個高層控制器管理子目標;較低層執行它們,常常各自帶著私有的推理—行動迴圈。正是這種遞迴,讓一個固定脈絡的模型能處理遠大於其視窗的任務——每個子目標在一個嶄新、聚焦的脈絡裡被解決,只有它的結果往上冒泡。
這與層級式強化學習有深刻的平行關係。一個選項(option)是一個在時間上延展的行動——一個有自己起始與終止條件的子策略——而一個子目標本質上就是用自然語言命名的選項。同樣的問題隨之而來:如何拆解、如何知道一個子目標成功了、以及如何組合子目標的結果而不讓它們的誤差累積。
分层强化学习中的“选项”——启动集合、子策略与终止条件——正是分解层级中子目标的形式化对应。
def solve(goal, depth=0):
if is_atomic(goal) or depth > MAX:
return run_react_loop(goal) # base case: just do it
subgoals = model.plan(goal) # decompose
results = [solve(g, depth+1) for g in subgoals]
return model.synthesize(goal, results) # compose results up記憶架構
代理記憶架構給代理一種比單一脈絡視窗活得更久的狀態。標準的劃分對應人類記憶。短期(工作)記憶是即時脈絡:正在進行的思考—行動—觀察軌跡,自然被脈絡長度所界限。長期記憶是代理會讀取與寫入的外部儲存:過往事件的情節記憶(常是一個用嵌入相似度查詢的向量資料庫)、提煉後事實的語意記憶,以及學到的技能或慣例的程序記憶。
一条检索增强生成流水线,将检索到的记忆送入模型的上下文。
困難之處不在儲存,而在管理:該寫什麼、何時取回、以及如何遺忘。天真地把一切都倒進記憶,會讓取回淹沒在雜訊裡;太激進的摘要,又會丟掉你日後需要的細節。一個務實的架構會寫入精簡、附時間戳的摘要,在每一步取回最相關的前 k 筆,並週期性地把舊的情節整併成語意事實——正是一本人類筆記本面對的那種壓縮與回憶的取捨。
Reflexion:從口語回饋中學習
記憶加上反思,能解鎖一種完全不動權重的學習。Reflexion讓代理跑一個任務,失敗時要求模型寫下一段簡短的口語自我批評——「我送出前應該先檢查那個邊界情況」——並存進情節記憶。下一次嘗試時,這段反思被前置到脈絡裡,於是代理真的讀到了自己過去的教訓。回饋訊號是自然語言而非純量梯度,這正是它被稱為口語強化學習的原因:策略跨情節地進步,但更新存在於文字、而非參數裡。
由行动与反馈构成的智能体–环境强化学习回路。