https://www.youtube.com/watch?v=Lxh9RF5S-K0
模型能不能自己變好,取決於它有沒有地方把訊號拿回來。CS329A 第四講把自我改進拆成三個個案:ReAct、RLIF、Constitutional AI。三套技術都在講同一件事,差別不在演算法多花俏,而在回饋從哪裡來。ReAct 的回饋來自環境與工具,模型搜尋、觀察、再決定下一步;RLIF 的回饋來自程式真的跑起來的結果,測試過不過就是訊號;Constitutional AI 的回饋來自模型對自己的批評,而批評的標準是人類事先寫好的憲法。講者開場就把這條線畫出來:同一個迴圈,餵進去的東西不一樣,能修的錯也不一樣。前兩講談的 test-time compute 與 robust verification 是同一條線上的事,這一講把鏡頭轉到「回饋」本身。
人類先想再做,ReAct 把這個迴圈搬進語言空間
人要做一件事之前通常會先想一下。講者用一個很生活的例子開場:決定要不要來修這門課,你會先想這對自己有什麼用,想通了才有動機行動;真的進了教室,你得到一個新的觀察,喜不喜歡這門課,這個觀察又回頭改變你的下一個念頭,也許是去寫作業,也許是別的決定。想與做之間來回,人靠這個迴圈運作。
語言模型過去把想與做分成兩件事。模型很會解自然語言處理的問題,在多數人熟悉的聊天情境裡也夠用,但要在真實世界的任務裡發揮作用,它得能跟環境、工具、程式碼互動,並且從互動裡學東西。困難的地方在於模型會幻覺,而且對自己環境裡正在發生的事一無所知。你問它今天氣溫幾度、今天哪裡發生了什麼事,除非它真的發一個搜尋請求、把資料抓回來,否則它手上沒有這筆資訊。少了這層 grounding,它就沒有辦法採取有意義的行動,更沒辦法把行動結果接回推理。
當時的兩條路線各缺一半。chain of thought 讓模型把中間步驟寫出來,數學題可以一步步推到答案,但這些步驟是模型內部狀態的產物,沒有來自外部世界的回饋。另一條路線像 WebGPT,學的是怎麼跟瀏覽器互動,可以在人類偏好的互動軌跡上做微調,但它不特別具備推理過程。ReAct 要解的就是把這兩種範式接起來。
做法出乎意料地簡單,主要靠 prompting。先要模型針對任務生出 verbal reasoning trace,把這段推理接回 prompt,再問它基於這段推理該採取什麼行動;行動做完得到觀察,觀察再進下一輪。講者把它畫成兩條迴圈,左邊是推理,右邊是行動,中間靠語言空間串起來。thought、action、observation 一個接一個,每一個都在通知下一個,跟人走到廚房發現沒水、於是決定去超市那種順序感很像。她也提醒,想加平行取樣之類的花招可以,但那要另外設計流程。
實作上,這篇用的是當年較舊的模型,frozen 的 PaLM,靠 few-shot 示範。範例裡有 thought、有 action、有 observation,然後要模型產出下一步。決策型任務的示範則讓模型自己選:這一步要先推理,還是直接動作。行動的正確性另外用一個技巧處理,把問題框成分類,先把合法的行動集合列出來,讓模型在「世界狀態、目前推理、合法行動清單」之間做選擇。講者提到她在 Google 跟機器人團隊合作的另一篇也用同一招,因為機器人這種場景沒有合法行動清單根本動不了。她也回應了課堂上的一個技術問題:thought 不算在 action space 裡,兩者是分開的迴路;之所以要有 reasoning token,是因為語言模型在語言這個抽象層次上生成推理,比較容易輸出正確的行動。
Apple Remote 那一題,CoT 與純行動都答不出來
講者用一題 HotpotQA 把差別走完:除了 Apple Remote 之外,還有哪個裝置可以控制它當初設計要操作的程式。標準 prompting 直接問,答案不對。chain of thought 把中間步驟寫出來,答案還是不完全正確。
純行動版本會搜尋,但推理不在裡面。它搜 Apple Remote,拿到觀察;再從觀察裡挑出 Front Row 去搜;一路跟下去,最後發現這是一個已經停產的東西,於是給不出好答案。
ReAct 的走法不一樣,先想再查。第一步先想:我得先查 Apple Remote,找出它原本是設計來操作哪個程式。搜下去得到一個觀察:這是一支很早推出、2005 年、差不多二十年前的遙控器,原本設計來控制 Front Row Media Center。接著它想,下一步該查 Front Row,於是去搜,搜不到;它換了個詞叫 front row software,再搜,這才知道那是一個已經停止的媒體軟體中心。到這裡它再想一次,答案就接得起來了。
講者下的結論是,推理這個抽象讓它給出比純行動更好的答案,而把 thought、action、observation 交錯起來,是模型表現變好的原因。她也順帶說了今天的情況:Qwen 這類模型打開 thinking mode 就會自動出現這整套行為,因為開源模型在 distill 的時候早就把這類軌跡吃進去了。工具呼叫對現在的模型來說已經算是內建,甚至不需要 ReAct 這個外框,模型直接在 chain of thought 裡就把想與做串完。
模型不知道自己知道什麼,應用端要自己補護欄
課堂上有人問,模型怎麼知道自己知道什麼、什麼時候該去搜。講者的回答分兩層。第一層是它其實不知道,它是從互動裡拿到回饋才知道的。第二層更麻煩:請模型替自己的輸出打分、問它有沒有信心,它通常過度自信、校準很差,這是一個還沒解完的研究問題。所以她給應用開發者的建議是,把注意力放在讓模型用對的工具、拿到有外部依據的資訊,而不是指望它自己判斷「我會不會」。她也補了一句對比:有搜尋結果可以對照時,幻覺比純粹依賴模型內部狀態好控制得多。
同一個問題的另一面是答案互相矛盾的時候怎麼辦。講者說這要由應用端決定,如果幾份結果沒有共識,可以用 majority voting 之類的做法;前幾講談過的驗證手段也可以搬過來。對終端應用來說,重點是交出去的答案站得住,所以要多幾層 guardrail:答案送出前先驗一次,或讓多個來源互相對照,而不是相信單一輸出。
還有一個學生問到 KV cache:thought 與 observation 在模型內部的表徵有沒有不同的交錯模式,observation 是環境給的、不是模型自己生的。講者說這可以當這門課的研究專案,開源模型都拿得到。
ReAct 贏過純行動,但沒有穩定贏過 CoT
HotpotQA 是在 Wikipedia 上做多跳問答,FEVER 偏事實查核。這兩個任務的 action space 都很窄,基本上就是搜 Wikipedia 頁面、查某個字串、或是宣告任務完成,等於在模擬人使用 Wikipedia 的動作。
比較的基準線排開來看:標準 prompting,沒有 thought、沒有 action、沒有 observation;chain of thought,要模型一步一步想;CoT-SC,用 self-consistency,也就是多數投票;Act,中間沒有思考,只有行動;另外還有兩種互為退路的變體,一種是 ReAct 失敗幾步之後退回 CoT-SC,另一種是多數答案出現不到一半時退回 ReAct。
結果裡有兩件事值得記。ReAct 一般來說比純行動好;但它並沒有穩定贏過 chain of thought,FEVER 上贏,HotpotQA 上不一定。真正贏過標準做法的是把 CoT-SC 與 ReAct 接起來的版本。講者從這裡下的判斷是,把模型內部知識與外部知識好好合併是有價值的,推理則是模型走到正確答案的中介,讓它知道該去檢索什麼。
失敗模式也一併看了。CoT 的主要問題是幻覺;ReAct 因為有外部知識庫可以檢索,錯誤比較少,也比較能信任。同一個方法在不同訓練方式下的排序也清楚:能 fine-tune 時表現更好,能跑 RL 迴圈時又更好,後者留到下一週講。
WebShop 上 66.6 對 82.1,還差人類專家一截
知識密集任務之外還有決策型任務,例如網頁瀏覽、機器人、遊戲環境。講者用 WebShop 當例子:使用者給一句指令,例如找一個有抽屜的床頭櫃,agent 要在模擬環境裡完成購買。基準線是模仿學習,也就是單純 fine-tune,以及模仿學習加 RL,也就是 SFT 加 RL。
ReAct 在這張表上分數與成功率都贏過兩條基準線。分數看的是中間步驟,成功率看的是任務最後有沒有完成。但講者沒有把話說滿:ReAct 的分數是 66.6,人類專家 82.1,中間還有一大段;成功率更低,因為這是多步流程,任何一步做錯,錯誤會一路串下去。
限制也講得很直接。action space 一大,需要的示範就多到塞不進 context;需要多步推理,推論成本就比單步高;還有一個很常見的副作用,模型會在一些根本不需要想的簡單任務上想太久。她說現在很多模型都有這個毛病,thinking trace 拉得很長,怎麼讓模型不要想太多,本身就是一串有趣的研究。
課堂後半花了幾分鐘討論環境本身出錯的情況。如果回饋是吵雜的、甚至誤導的,怎麼辦?有人提議在 agent 上加一層 reflection,讓它對環境給的東西先反思再推理;有人說要能 backtrack,因為被錯誤回饋帶偏之後,模型可能卡在迴圈裡;也有人提多數投票與信心指標。講者順著這些回答收了幾點:需要更好的方法估計自己對環境回饋的信心,需要任務分解,太複雜的任務先切成子任務,也可以考慮平行思考、把過去的經驗放進 memory。有人提到推理與行動的理想比例,講者說這確實值得研究,不同任務可能不一樣。還有人建議做 compound system,把子任務依照各家模型的強項分工出去。
RLIF:把測試的 pass/fail 當成 RL 的 observation
第二篇轉到 coding agent。講者先在課堂上問有多少人用過 Claude Code,舉手的人接近全班,她說那就不必多解釋為什麼這件事重要。程式與工程任務大量交給 agent 之後,真正決定 agent 強不強的,是它能不能理解使用者意圖,並且在生成程式碼之後拿到某種回饋,讓它有東西可以往上疊。
RLIF 的框架是 end-to-end 的 RL fine-tuning,也是最早證明執行回饋能把 coding LLM 明顯拉上來的工作之一。action 就是模型生出來的程式碼;前面講 ReAct 時稱作 observation 的東西,在這裡是 execution feedback,也就是把程式跑起來、跑測試、收集測試過或不過的結果,換成一個 binary reward。有了這個訊號,模型可以在 fine-tuning 的階段一輪一輪修,PPO 是他們用的演算法。講者說這篇有兩個機制值得記,一個是 two-tier test strategy,一個是 hybrid token turn-level policy,她也請大家把論文仔細讀過。
框架的核心是一個迭代的回饋迴圈,訓練時與推論時都用到執行回饋。最上面那一格,模型拿到一段自然語言的問題描述,例如請寫一個 hello world;它生出一個程式解,拿去跑一組 public tests。如果沒過,執行回饋就回到模型手上,讓它再試一次,這個循環一直走到通過,或是走到規定的回合數上限。通過的那些解再送去一組完全沒見過的 private tests,由那邊的結果決定 reward,reward 進 PPO 更新。講者把左邊稱作 RL 的 exploitation 階段,用推論時的回饋迴圈把現行策略的潛力榨出來;右邊是 update,用執行結果更新策略,模型就在這裡自我改進。
課堂上有人問 public tests 哪來的。講者說這是外層迴圈要設計的事,以 code contests 為例,題目本來就附測試,你可以切一部分當 public tests,在推論時提供回饋,另一部分留著訓練模型。也有人問「測試失敗」是什麼意思:測試就是實際跑一段 Python 函式,失敗代表模型生出來的那個解不正確,測試的輸出會餵回模型,連著題目與生成結果一起,變成下一輪的輸入。至於失敗與通過由誰判斷,答案是測試本身,不是模型自己說了算。
講者用一個例子把流程走完:題目是寫程式偵測回文子字串。第一回合模型生了一個基本解,public tests 沒過,而且是執行超時,這是很常見的錯法。收到這個回饋之後,第二回合它生了一個做過最佳化的版本,這次過了 public tests,於是送去 private tests,再決定怎麼更新模型。
兩層測試的分工是這樣:public tests 是為了快速迭代而存在的小 subset,提供即時回饋,引導模型把解寫好;private tests 在生成過程裡完全隱藏,只負責在最後給訊號。講者說這個切法是他們眼中自我改進迴圈裡有用的創新,因為模型沒辦法靠背下測試輸出來過關。它也回應了課堂上另一個追問:如果全部測試都當 public,就沒有那層乾淨的訓練訊號了。
token 逐個生,獎勵整輪給
RL 演算法的細節講者請大家自己看論文,她只強調一件事:語言模型是一次一個 token 生出來的,所以 policy model 在生成程式碼時有比較細的控制粒度;但 value function 是 turn level 在算,reward 打在整段回應上,所有 token 共用一個 advantage 值。她說這跟 GRPO 的做法比較接近,都是給整段序列獎勵,而不是逐 token 給。
錯誤在第二、第三輪變少,修改也變準
結果的圖有兩張,縱軸都是 solve rate,橫軸是取樣預算,而且是對數尺度,驗證集與測試集各一組。模型是 Llama 3.1 那一代,講者自己說結果有點舊,但趨勢夠清楚:在 code contests 這種競賽程式題上跑 RLHF 之後,solve rate 明顯上升。她解釋 solve rate @k 的意思:同一題生十份解,看裡面有幾份能過。
為什麼有效,講者把問題反過來問。base model 光看到錯的解與執行回饋,其實沒什麼用;真正有幫助的是訓練時每一輪都把執行回饋秀給它看,而且這樣學到的東西可以泛化到其他程式 benchmark。這個效果在錯誤分析裡最明顯:他們數第一輪、第二輪、第三輪各有幾個錯,順便記錄程式碼改動的次數與錯誤類型,小模型與大模型各一組。跑過 RLHF 的模型,回合往後推,錯的輸出變少,後面的回合開始真的把解修好;沒有這個迭代迴圈的版本,改出來的東西還是不對。
講者的總結是兩種好處同時發生:取樣提供多樣性,而模型知道自己錯在哪裡,改動就更有針對性。有一個例外她也被問到:超時的錯誤數不會那樣降下來,因為那代表解法始終沒對,測試跑到時間用完為止。她補了一句,這些行為跟領域很有關係。
binary reward 撐到哪裡為止
課堂上有人提出一個很合理的懷疑:binary feedback 在簡單題目上夠用,題目一難,可能就需要 error trace 或更多 metadata 才 debug 得動。講者說很有可能,這會是個好專案。順著這個問題,討論走到 process reward model 與 outcome reward model 哪個比較好,也就是要不要每一步都給回饋。她說這個爭論還沒有結論,上一講 Azalia 談過,換一個領域、換一個 benchmark,可能就要重新 hill climb 一次。
也有人問 SFT 能不能取代 RL。講者的回答是這個問題還在辯論中:在推理軌跡上做 SFT 也能拿到一部分好處,領域內的東西 SFT 一定有效,但 RL 有機會解比較新的問題,泛化好一些。她反過來提醒大家這篇論文真正要學到的事:自我改進迴圈是可行的,而且在夠簡單的問題上,binary reward 就撐得起來。
這套迴圈也直接搬進了作業。作業不是寫程式,而是數學題:模型生一份解法,自己去抓哪裡錯了,把錯誤當成回饋接在後面,再生成下一版,看每多一輪錯誤能不能變少。沒有執行環境可以跑,形狀還是同一個。
Constitutional AI:人類只寫憲法,批評與修改交給模型
第三篇要處理的是無害。要讓模型有用又無害,傳統做法是人類回饋:把模型的多個輸出排起來給人看,問哪個正確、哪個有用、哪個夠具體,累積出偏好之後訓練 reward model,再拿它去 hill climb。講者說這條路效果不錯,模型變大時 RLHF 的曲線明顯比單純 fine-tune 好;但它不好規模化,因為你得收集成千上萬筆人類標註,過程冗長又費工。
Constitutional AI 換掉了這一環。Anthropic 讓人類只寫一份憲法,一組 16 條原則,用來說明希望模型具備什麼行為;人類除了寫這份文件之外不必進迴圈。這個做法之所以行得通,是因為模型變得很會遵循指令:要它照某個格式回答,它做得到;要它判斷某段輸出有沒有某種行為,它也能給出答案。憲法正是要利用這個能力。
流程分兩階段。第一階段是自我批評與修改:拿一組紅隊 prompt 去刺激模型產生輸出,接著送出 critique request,問它這段輸出有沒有有害或不道德的內容,或是有沒有性別偏見,或是不適合年幼的孩子;再送 revision request,要它把這些痕跡拿掉、改寫成合宜的版本。這些批評與修改的軌跡,被拿去對模型做 supervised fine-tuning。
第二階段是 RL。他們先用 AI feedback 訓練一個偏好模型,學會偏好符合憲法的回應,再用這個偏好模型去 fine-tune 語言模型,讓它最大化得分。講者強調這一步取代的是原本靠人類偏好訓練出來的 reward model。她也回答了課堂上的疑問:偏好模型本身還是要驗,要有測試集或驗證集,把 AI 給的分數跟人類評分對齊,只是不必到一萬筆那種規模。
helpfulness 與 harmlessness 是同一條曲線的兩端
監督學習階段的圖先給出一個取捨:修訂次數增加,無害程度往上走,有用程度會往下掉。他們的說法是,如果你一直把模型往一組固定原則推,它會變得比較不好用,但兩者加起來整體是單調改善的。
真正關鍵的是最後那張 Pareto 圖,縱軸是 harmlessness Elo,橫軸是 helpfulness Elo。pretrained base model 是起點,分數不高;只做 helpful 的標準 RLHF 會把 frontier 往有用那一邊推;helpful 加 harmless 是另一條曲線;只做 constitutional supervised learning 的版本還輸給 RLHF;把 constitutional RL 接上 chain of thought,才走到那條最好的交換曲線。講者說這是這篇論文的核心主張之一:你可以同時把有用與無害推到自己想要的位置。
文字版結論是,讓模型照原則評估自己的回應,得到的模型差不多一樣有用、也許略差一點,但無害程度高出一大截。這也是 Claude 系列當年很強的地方,現在這套技巧已經被各家的模型普遍採用。講者也提到這套原則的適用範圍不只於此:只要你想讓模型遵循一組彼此可能衝突的指令,同樣的框架都能用。
課堂上有人問憲法修正的問題,如果原則改了,怎麼便宜地更新模型,又怎麼確定舊規則真的被忘掉。講者有兩個回答。第一,RLHF 通常是最後一階段,post-training 佔整體算力大約 5%,模型本來就經常更新,憲法要改可以搭這個頻率。第二,這背後是 continual learning 這個未解問題:怎麼讓模型忘掉一組知識、或改遵守另一組規則,目前沒有保證。有人試過用 interpretability 的方法去「取消」某些知識,但沒有證明一定能忘掉。她也點了一串後續工作,包括 self-refine 那種用自我回饋反覆修的做法、用 RL 教模型自我修正,以及把 RLHF 與 AI 回饋版本互相比較的研究。她補了一句很實際的觀察:模型自己批評自己有時比較難,找其他模型一起批評有時效果更好,原因還是模型會過度自信。
三種回饋來源,同一個條件
講者在收尾時把三篇兜在一起。ReAct 從環境與工具拿觀察,把推理與行動交錯起來,讓模型在有外部依據的需求上答得更好、查核得更準,放進遊戲或瀏覽器這種環境當決策者也行;它的決策軌跡很好讀,工具呼叫到今天已經內建在許多模型裡,是這條線的基本積木。RLIF 把測試當成程式領域最好的執行回饋,一輪一輪把回饋吃進去,讓模型在競賽程式題上少花一點預算就達到前段水準。Constitutional AI 則用人類寫的原則生出回饋,讓自我改進迴圈轉起來。三條路的共同條件是同一件事:回饋裡要有足夠的訊號,模型才可能走到訓練資料之外的地方。
她也回答了 agent 與語言模型的關係。課堂上有人定義 agent 是好幾顆模型互相連接、有記憶、有 session、能做 function call;講者說,這已經開始接近她心目中的 agent,只是還沒有 session、還沒有記憶。而 agent 最根本的積木之一,就是怎麼讓語言模型用某種方式回應,所以這三篇值得先弄懂。至於實務上的 workflow,她舉了 SWE-bench 這類要改整個 codebase 的任務:先搜尋相關檔案、把元件摘要起來、建一張壓縮過的圖或 RAG index、提出 patch、用測試驗證,不對再迭代,跟這一講的迴圈同一個形狀。她也提到 Azalia 實驗室的 CodeMonkeys 在做很接近的事。
有人問,現在有了 RL 的 post-training,這些手工設計的框架會不會被取代。講者的答案是一半一半。如果某個任務的搜尋空間可以被定義清楚,那就有機會自動化;但要替所有任務定義搜尋空間,這件事本身就不明確。她拿職業別來舉例:會計師、財務 agent、法律 agent 各自照什麼步驟做事,這些都是領域專屬的,定義不出來。ReAct 的價值在於它定義了一個順序,先想、再做、再看,這本身就是一種 workflow;把它一般化成 agent,就是替某個任務定義 workflow,而 workflow 依舊是領域專屬的。
課就收在「搜尋空間定義得出來嗎」
最後一個問題問的是更大的事:人類的認知方式這麼多元,有沒有系統性的研究把認知科學跟語言模型接起來。講者說現在很硬,大家確實都在借用人的解題方式,但終極目標是讓模型自己找到往上爬的路,而不是用文字替它把 reasoning space 講死。她觀察封閉模型在這件事上做得比「用文字指定推理空間」更好。
那能不能自動化?她說要看搜尋空間有沒有被定義出來。遊戲是定義得清楚的那一類,action space 有限、狀態有限,可以讓模型自己去探索。但真實任務多半不是這樣,你要去搜工具、去經歷環境、收集觀察再拿回來用,所以現在才會在語言空間裡做這件事。課堂上還有人問,能不能用數學結構去限制對話的生成;講者說某種程度上做得到,但這些模型是在網際網路的資料上訓練的,再怎麼限制也很難把它們學過的東西全部擋掉,這是一場跟資料的拔河,過濾資料確實在做,能做到多少是另一回事。
課就在這裡收掉。