〈Stanford CS329A Self-Improving AI Agents〉-EP-Part 5 | Planning and Multi-Step Reasoning

https://www.youtube.com/watch?v=Ml_fp9XkB8Y

規劃不是把計畫一次寫完就算了。多步任務真正的難點有三個:走過的步驟能不能拿回來搜尋、彼此不相干的步驟能不能並起來跑、工具的使用能不能在沒碰過工具的情況下學會,而這就是 CS329A 第五講排出來的三篇論文。去年 ICML 的 LATS,把 MCTS 搬進語言模型的推理路徑,用 test-time compute 換準確率;NeurIPS 2025 的 Sprint,把可以並行的計畫從序列生成裡切出來,要的是省延遲;下週要在 COLM 報告的 SWIRL,把工具呼叫留在離線標註階段,用每一步的 reward 訓練多步行為。講者收尾時把三套併起來看:它們不互斥,是一組可以拼裝的工具箱,而且每一套都留了接口給後面的人接。

規劃不是把計畫寫出來就結束

講者用一個度假規劃的 prompt 說明多步任務的形狀。推理的那一步,模型要想清楚這件事要做什麼:預算是多少、行程怎麼排。動作的那一步,是它真的去蒐集資訊:開瀏覽器、生一個搜尋 query、去讀 Reddit 或旅遊部落格。再下一步是搜尋與修正:拿到線上蒐集來的回饋之後,回頭改目前為止的計畫,也許換一個目的地,也許查當地還有什麼新東西可做。想、做、搜尋三個動作輪流出現,才把「幫我排一趟旅行」這種題目解完。

LATS 要處理的正是這個縫隙。講者的說法是,當時的目標是把「LLM 生一份計畫然後照著執行」推進到「鼓勵模型探索多種不同的計畫與路徑」。模型到今天為止都還是這樣:生出多樣解、照著行動、為了解一個問題規劃好幾層最佳化,這些都是弱項。這篇的做法是把 RL 跟多步規劃裡已經存在的技術搬進來,包括多步的 Monte Carlo tree search;再加上一個當時比較新的條件,模型有能力把回饋吃進來,所以它可以一邊跟環境互動,一邊把環境給的東西帶回搜尋過程,用來修正跟最佳化之後的計畫。

LATS 跟 ReAct 差在拿什麼當分數

論文標題講得很白:Language Agent Tree Search 把推理、行動、規劃收在語言模型裡。講者用「規劃一趟夏威夷旅行」走了一遍。同一個 prompt 取樣幾次,模型可能決定去問去過 Hawaii 的朋友,或是去讀相關的 subreddit;框架會替每一個動作算出一個分數,再用分數去更新這棵樹接下來要往哪裡長。動作一分數比較高,就從它展開,於是模型去問朋友 A 跟朋友 B 的意見,兩個回應的品質各給一個分數,再從那裡繼續長。這是多動作取樣的流程,不同分支的動作可以真的並行執行。

樹上同時要考慮探索跟利用。一直往當下分數最好的狀態走,可能會錯過現在看起來普通、但走下去更好的節點,這就是 MCTS 進場的地方。

跟 ReAct 的差別,講者特別點出來,在「分數是對什麼打的」。ReAct 先用一個 verifier 在 test time 引導搜尋,被評分的是推理軌跡,展開的方向由那個分數決定。LATS 不評推理痕跡,它評模型採取行動之後的結果,再把模型對這條軌跡的 reflection、以及環境給的觀察一起算進去。整個直覺可以拆成三塊:chain of thought 把推理拆成一步一步;tree expansion 透過動作生成讓步驟分岔;規劃與搜尋就在這棵樹上跑。從 ReAct 借來的是第四塊,動作得到的回饋會回流到之後的搜尋裡。

迷宮那一題,六個階段走一遍

LATS 的流程有六個階段:selection、expansion、evaluation、simulation、backpropagation、reflection。講者用一道「走出迷宮」的題目把它走完。初始觀察是你在一間燈光昏暗的房間裡,左邊一扇門、右邊一扇門,目標是找到出口。

selection 要先挑一個節點來展開,挑選的依據是 UCT。選好節點之後是 expansion,從這個節點取樣可以採取的動作。這個例子取了三個:打開左邊的門、打開右邊的門、檢查房間有沒有線索。三個動作都在環境裡執行過,觀察結果接回 context。打開左門得到的觀察是一條掛著畫的昏暗走廊,開右門是另一個觀察,第三個動作也有自己的結果。

接著是 evaluation。每一個「動作加觀察」形成的新狀態都要給一個分數,他們把兩個分數合起來。一個是 LM-as-judge:把動作跟觀察丟給語言模型,問它這個狀態多有希望,直接要一個 0 到 1 的分數。另一個是 self-consistency:假設這裡不是取樣三個動作,而是取樣五十次,把動作歸類,某一類出現得越頻繁,分數越高。講者舉的例子裡,狀態 A 的 self-consistency 分數比較高,因為動作 A 有 75% 的取樣都出現。兩個分數合起來,每個狀態就有了一個值。

simulation 用的是貪婪法。狀態 SA 分數最高,SB、SC 低很多,所以就從 SA 一路展開下去:再取樣、再展開,直到成功、失敗,或是把展開的預算用完。這場走訪裡,SA 底下的候選動作選了往樓梯走,運氣很好,觀察裡就看到出口標示得清清楚楚。到此 simulation 結束,這條軌跡不是成功就是失敗。

真正重要的是這條軌跡怎麼回寫。backpropagation 拿整條軌跡的回報去更新沿途每個狀態的價值,算法是一個移動平均:新價值等於舊價值乘上造訪次數減一,加上這條軌跡的回報,再除以造訪次數。講者也把 UCT 的算式拆開,它就是一個利用項加上一個超參數乘上探索項;NP 是父節點被造訪的次數,NS 是當前這個節點被造訪的次數。相對於父節點,一個節點被造訪得越少,探索項越大,就越會被鼓勵去走;被造訪很多次,除下來的數字變小,UCT 就相對那些還沒被探索的兄弟節點低。課程裡有人追問 UCT 的理論保證,講者的回答是這裡有數學也有直覺,但沒有證明這樣是最佳解,只是把探索跟利用兩邊平衡起來,被認為是比較好的做法。

最後一個階段是 reflection。backprop 做完之後,模型會對整條軌跡補上一段自己的想法:這次成功或失敗,是什麼造成的。講者說這個動作對整體品質的幫助相當明顯。

UCT 可以換掉,重複的動作會被累加

課堂上兩個技術問題都繞著這棵樹的邊界條件。有人指出 UCT 是從 bandit learning 來的 upper confidence bound,bandit 裡還有很多挑手臂的演算法,這篇有沒有比較過別的?講者的回答是沒有比較。探索的方式在 multi-armed bandit 的文獻裡有一整套,全部都可以搬到這個框架裡試;這篇的主要貢獻是搭出一個平台,讓別人把不同的最佳化方法接上去。

另一個人問的是重複動作。如果軌跡裡出現 A、B、A、B 這種重複,或是同一個動作在不同的節點出現,這棵樹有沒有辦法處理,還是會把它們當成各自獨立的軌跡?講者說,同一個動作在軌跡裡重複出現時,從某個父節點看過去,這個動作的次數會被累加,而次數本來就會進到 UCT 的算式裡,所以在建樹的過程裡就會被算進去。她也補了背後的前提:這裡假設面對的是一棵樹,不是一張全連接的圖。

HotpotQA 跟 WebShop:多取樣跟 reflection 都換得到分數

LATS 挑了兩個資料集驗證。HotpotQA 是設計成多步的問答集:每一題要答對,至少得從兩篇不同的 Wikipedia 頁面檢索資料,多步是題目本身規定的。講者說結果很好,取樣的軌跡數越多,表現就明顯往上走;reflection 跟把推理痕跡帶回來,又另外給了一段提升。這篇提供的是機制:test time 多花算力,可以真的換到多步推理題上更好的解。

WebShop 走的是應用面。講者唸了一個實際的查詢:想找一張小型的可攜折疊桌,要已經組裝好的,顏色跟表面處理有指定,價格也有條件。這種題目同樣是多步的。LATS 在這上面沒有做任何 fine-tuning,只在 test time 跑,成績就很高,已經接近人類專家的水準。

把 LATS 收成幾句話:它把推理、行動、規劃放在一起,把 MCTS 這類已知的方法帶進語言模型,在多個領域都拿到很強的結果;因為是 test-time 加模組化的做法,移植跟實作都相對容易。

代價也講清楚了。樹的展開、backprop,每一項都在加成本,而論文並沒有真的分析成本效益。另一個沒有處理的前提是:有些動作不可逆。模型如果是在跑一筆交易,動作真的執行下去,後果會很實際,例如真的付了一筆服務費。遇到這種場景,搜尋要怎麼調整,這篇沒有回答。

Sprint:不是不用想,是不用排隊想

第二篇是 Sprint,NeurIPS 2025,講者上課的時候論文還沒在會議上報告。它處理的是規劃與平行執行,以及怎麼用模型自己讓它想得更平行。

動機來自一個大家已經很熟的現象:O1、Gemini 2.5 Pro 這類前沿模型碰到難題會想得更久,而想得越久跟準確率越高是連動的。講者放了 DeepSeek R1 的訓練曲線:訓練往下走,它在 AIME 這類數學題上越來越強,同時每一則回應的平均長度也一直往上。越長的連鎖思考換到越高的分數,趨勢就是這樣。

但把長長的思考軌跡攤開來看,很多步驟其實彼此獨立。模型在試不同路線,把任務拆成子任務,其中一些子任務可以同時跑,還有一些步驟是在驗證前面做過的事。既然計算圖上有彼此不相依的部分,就沒有道理等它們一個接一個被生出來。

Sprint 就做這件事,而且是在 post-training 階段進來。它讓模型用 planner 生出多份計畫,再讓多個 executor 平行把計畫執行掉;一輪做完,再來一輪計畫跟平行執行。規劃與執行交錯,就是加速的來源。

讓模型自己標出哪些步驟可以並行

資料是模型自己標出來的。他們先有一批 DeepSeek R1 產生的推理軌跡,再用一個模型,講者舉的是 GPT-4o,把軌跡切成一段一段的步驟,並且替每一步標上這是規劃還是執行;有些步驟裡,一份計畫底下掛著好幾個執行片段。標完之後可以畫成一張 DAG:例如第四步跟第二步彼此不相依,但都接在第一步後面。這張圖讓模型看出哪些步驟可以並起來,於是資料就能打包成第一步先做、第二步跟第三步同時做。

這批資料拿去做 supervised fine-tuning。講者特別強調「LRM」在這裡只是 large reasoning model 的意思,現在每一顆 LLM 基本上都算推理模型了。微調的內容是把同一套思考過程重寫成帶標籤的版本;模型學到的行為是,在推論的時候自己把標籤生出來:計畫一、它的執行、計畫二、它的執行。

推論的結構值得說清楚,因為課堂上有人以為這變成三條平行線同時生成。它還是下一個 token 一個一個生。改變的是模型現在會在一個時間點上,把可以並行的計畫一起吐出來:先出來計畫一跟計畫二,計畫一輸出完,它的執行就開始跑,計畫二輸出完,它的執行也開始跑;執行結果回到 context,模型再生下一輪的計畫。實務上就長成這樣:第一步之後同時生出第二步跟第四步,讀完兩邊的結果再繼續。

課堂上另一個問題是重規劃。如果模型在執行第四步之後發現前面的方向錯了,想退回去用計畫三而不是計畫二,它記得住哪份計畫對應哪份執行嗎?講者的回答是它還是可以,因為所有 context 都還在。訓練教的只是不要等:計畫二既然跟計畫一無關,就沒有理由壓著不先做。也因為計畫跟執行是用特殊標籤生出來的,外面的系統可以照著標籤去真的把工作並起來跑。

平行之後,準確率跟著上去

訓練配方是這樣的:在數學資料集上生六千條思考軌跡,留下並行程度比較高的那些,把格式重排之後,對 DeepSeek R1 蒸餾出來的 Qwen-7B 做 supervised fine-tuning。

有個出乎意料的結果。專案一開始的目標是把並行度拉高、把序列生成的 token 數壓下來,這件事做到了;但同一個過程也把準確率一起推上去。模型似乎喜歡這種比較有結構的思考方式。圖上可以看到,序列 token 數相對 R1 蒸餾 7B 這個基準大幅下降,準確率還高出 3.5 個百分點,而且序列 token 數比 32B 模型少很多。

還有 out-of-domain 的表現。平行思考只在數學資料上訓練過,但模型在 Countdown 跟 GPQA diamond 上也變好,這兩個資料集完全沒有進訓練。講者的解讀是,平行思考本身似乎就在幫模型,序列 token 的節省是順便拿到的。

軌跡的形狀也有兩種變化。難題需要更多輪的規劃與執行。前期,模型觀察到更多平行、更多探索;後期則收斂下來,往單一計畫裡鑽深。另一個課堂提問處理了矛盾的歸屬:如果每一個平行分支單看都對,合起來卻錯,該聽誰的?講者說不論序列還是平行,最後所有東西都會被壓回 context 裡,模型在思考之後要生出最終答案,有矛盾就要在這裡解掉。她也說兩種做法都可能出現思考上的矛盾,而這篇看到的比較像是「同一道題的不同步驟」,不是「同一道題的不同解法」。

瓶頸也在課堂上被問到。平行跑的獨立任務,怎麼保證每個花差不多時間,不會有人拖隊?講者說保證不了。他們做了一些安排,但還是可能出現 straggler:第四步比第二步久很多,你就只能等第四步。不過至少等的時間是第四步,不是第四步加第二步。他們的一個做法是,如果某個執行太簡單,就把它併回計畫裡,讓並行的區塊變大一點。這條線還能再最佳化,她也不確定論文有沒有分析到這一層。

平行度有多少,取決於任務。數學的序列 token 比例比 GPQA 低,這個比例本身就是平行度的指標。在數學上,跟準確率相當、甚至更低的其他方法比,Sprint 把序列 token 砍掉大約四成。但題目本身想得少的時候,能並行的空間也少,這個「先規劃再執行」的重排甚至可能比基準差;優勢出現在需要更多思考、token 更多的難題上。

講者順手提了一份最近的 Sonnet 4.5 系統卡:裡面的 prompt 鼓勵模型盡量用工具,至少用一百次。她的觀察是,我們正在進入一個問題規模更大的階段,一題要處理的 token 早就超過 8K 到 10K。

Sprint 這篇只做了 supervised fine-tuning。講者認為 RL、GRPO 這類方法有機會從同一批資料裡挖出更多東西,泛化也會更好;工具的重疊使用,以及在實作上真的做出 wall-clock 的加速,都還是可以做的題目。

SWIRL:要教多步工具使用,但不要在訓練時真的呼叫工具

第三篇是 SWIRL,下週要在 Montreal 的 COLM 報告。它同樣是訓練端的方法,要讓模型把多步推理做得更好。

動機很日常。很多真實任務要靠多步推理加上工具:用搜尋引擎回答多跳問題、解數學題、做軟體工程專案、規劃旅行、分析資料。人在處理重要任務時,工具通常要來回好幾輪,推理跟呼叫交錯出現。一個步驟就已經夠複雜,步驟一多,錯誤跟麻煩會沿路累積。

這篇的設計目標列得很具體:模型要知道什麼時候該呼叫工具,要生得出對的 query 去觸發工具,要在多個推理步驟之間維持準確率,要學會從錯誤裡回復,還要知道什麼時候該停下來、不再呼叫新工具,直接給最終答案。最後要能適應新的工具跟新的推理任務。

還有一個目標是操作面的,也決定了整個做法:訓練過程不要真的去用工具。工具會失敗、會慢、會有 bug,而訓練本身已經夠貴了。

講者也點名了既有做法的問題。RLHF、RLAIF、執行回饋這些微調流程,很多是在單一步驟上做最佳化:模型把想做的做完,生出一個最終答案,reward 就看這個答案對不對,然後把這個訊號往回傳到動作上。SWIRL 想要的是對「生出這些步驟的過程」有更多掌握。

工具呼叫留在標註階段,訓練時只看動作好不好

做法從資料開始。給一個 prompt,讓模型一次只走一步。每一步都告訴它:你可以推理、可以生一段 chain of thought、可以呼叫工具,如果你已經準備好生最終答案,就直接生。第一個動作可能是推理加上一次工具呼叫,環境的回應接著被放進來;下一輪再把原始 prompt、前一個動作、環境的結果一起送進去,問它下一個動作。這樣反覆迭代出來的就是多步資料,不同題目的步數從一到三步、五步都有。

每一步都要有標籤。他們用 LLM-as-judge:把前面的 context 跟當前這個動作交給評審模型,請它估這一步有多好。這整件事在離線做完,很多題目可以平行跑。

接下來的分離是這篇的關鍵。所有真正的工具呼叫都發生在離線標註階段,產生的軌跡被存下來。到了 RL 微調,模型被放到第 k 步的位置上,prompt、前面的步驟、環境的回應都已經在 context 裡,它要做的是生出下一個動作;這個動作拿到一個分數,分數拿去做最佳化。沒有人真的去執行那個動作。講者的理由是,語言模型判斷「這個動作提得好不好」已經夠準,不需要真的跑一遍再評估。

課堂上有人立刻追問:評審看不到工具真正的輸出,怎麼有辦法打分?講者說,評審評的是 query 的品質,不是工具的輸出。它看到模型在問某個人的年齡,在搜尋結果還沒回來之前,就能判斷這是不是一個合理的搜尋問題;不知道那個人的年齡,並不妨礙它判斷這個問題問得好不好。她也回答另一個追問:這裡沒有訓練任何 judge 模型,就是直接 prompting。

被最佳化的目標寫成這樣:假設有 s1 到 sk 這些步驟,每一步後面接一個動作,動作裡包含一段推理跟一次工具呼叫;他們最大化的是「在目前為止的 context 之下,單一動作的期望 reward」,而這個 context 就是前面累積下來的狀態與動作,一路從動作一做到動作 k。課堂示範裡的軌跡長這樣:第一個動作是去查第一個人的年齡,拿到環境回應之後,第二個動作是查第二個人的年齡,最後一步模型判斷資訊夠了,生出 answer 標籤跟最終答案。

推論時的迴圈長得跟資料生成很像。prompt 會說請用幾個字回答下列問題,並指定可用的工具,例如計算機:如果你覺得用計算機有幫助,把數學 query 放在標籤裡;也告訴模型,一旦資訊夠了,就生出 answer 標籤跟最終答案。模型第一步呼叫計算機,把想算的東西放進 query;工具被執行,輸出回到模型;模型再被問一次,這次帶著前面的思考與工具結果。就這樣一輪一輪往下走。

process-filtered 的資料,比只留答對的更有用

實驗設定是這樣的:多步合成資料由 Gemma 2 27B 產生,題目來自 HotpotQA 跟 GSM8K,大約五萬條軌跡。資料可以只用 process filter,也就是評審對每一步都投贊成;可以只用 outcome filter,只留最終答案正確的;可以兩者都過;也可以隨機抽。

結果有點反直覺。只用 process filter、完全不管最終答案對不對的那批資料,訓練效果比只留答對的軌跡、或過程跟結果都要對的資料更好。講者的解釋是,如果模型本來就答得對,你留著這些軌跡,對它解不開的題目幫助有限;反倒是過程站得住、結果沒收好的軌跡,在教模型用不同的方式想同一道題,讓它有機會解開以前解不開的題目。

泛化是這篇最漂亮的地方。在 GSM8K 上訓練,教模型用 SymPy 或計算機解數學題,然後拿去測 HotpotQA,準確率從 65 拉到 71。如果直接拿 HotpotQA 訓練,工具是搜尋而不是計算機,同一份評測從 65 到 73。反過來也成立:在 HotpotQA 上用搜尋工具訓練過的模型,換到 GSM8K 用 Python 也表現得更好。講者的解讀是,模型學到的是怎麼一步一步想、怎麼把工具叫起來,換工具也帶得走,不只是學會用某一支工具。

資料量的效果同樣明顯。在 HotpotQA 上用搜尋工具訓練,測試的卻是數學題:訓練樣本從一百筆增加到一萬筆,模型在完全不同的任務上也跟著變好。講者說這是這篇最重要的一張圖。在比較容易生出資料的環境裡合成資料,教模型怎麼用工具、怎麼多步思考,這個行為可以搬到全新的工具與領域上,規模再放大一點,可能是一套很有力的方法。

他們也試著解釋為什麼會變好。方法是看每次回答時每一步的平均 process reward,比較 RL 前後:過程的正確性在 in-distribution 的 HotpotQA 上提升,在 out-of-distribution 的 GSM8K 上也提升。模型每一步想得更對,兩邊都一樣。他們另外看了 precision、recall 等指標,也跟前沿模型比過。

最後是 RL 跟 SFT 的對照。同一套流程用 supervised fine-tuning 也跑得起來,但多步 RL 明顯贏過 SFT。SFT 對資料的要求還剛好相反:它最需要過程跟結果都對的資料,只給 process-filtered 的資料反而差。講者的解釋是,SFT 本質上是模仿學習,你給它軌跡,要它照著重現,結尾錯了就會拖累表現;RL 則是在既有的前綴上讓模型再挑一次動作,並且對這個新動作給 reward,它才有機會跳出資料裡原本的樣子。

SWIRL 的總結是:跨資料集與工具都能泛化,能轉移到不相干的任務,從 process-filtered 的資料學得更好,合成資料越多、in-domain 跟 out-of-domain 都跟著漲,而這些改善在每一步的 process 正確性上看得到。

三套工具放在一起,是一組可以拼裝的工具箱

課要收尾的時候,講者把三篇併起來看。LATS 花的是 test-time compute,在難題上用搜尋加 reflection 換準確率;Sprint 動的是規劃的結構,把獨立的計畫並起來跑,省延遲,通常也順便漲分;SWIRL 把工具呼叫搬到離線,用 process reward 訓練多步行為。三者在時間軸上分工,不是互相取代。

她也強調這條線的模組化程度。UCT 可以換成別的分數策略,搜尋可以考慮成本,不可逆的動作可以加上安全限制,reflection 可以寫得更有內容,最後還需要有人把標籤化的平行計畫真的變成看得到的執行加速。這些接口都還開著,講者最後一句話是:多步推理跟規劃是一個非常活躍、還在往前走的領域。