Skip to content

Agentic Design Patterns 第 9 章:Learning and Adaptation(學習與適應)

davidlei

學習與適應是提升 AI Agent 能力的關鍵。這些過程讓 Agent 能突破預先設定的參數,透過經驗和與環境的互動自主進步。有了學習和適應的能力,Agent 就能有效應付沒見過的狀況,不需要人為持續介入也能把表現調到最好。本章詳細探討 Agent 學習與適應背後的原理和機制。

整體概念

Agent 靠著根據新的經驗和資料,改變自己的思考、行動或知識來學習和適應。這讓 Agent 從「照指令行事」進化成「越用越聰明」。

Agent 的適應,就是根據學到的東西改變策略、理解或目標。這對身處不可預測、多變或陌生環境的 Agent 至關重要。

近端策略最佳化(Proximal Policy Optimization,PPO) 是一種強化學習演算法,用來訓練「動作空間連續」的 Agent,例如控制機器人的關節或遊戲裡的角色。它的主要目標,是可靠且穩定地改進 Agent 的決策策略(policy)。

PPO 的核心概念是對 Agent 的策略做小幅、謹慎的更新,避免劇烈變動導致表現崩盤。運作方式如下:

  1. 蒐集資料:Agent 用當前的策略與環境互動(例如玩遊戲),蒐集一批經驗(狀態、動作、獎勵)。
  2. 評估「替代」目標:PPO 計算某個策略更新會如何改變預期獎勵。但它不是單純最大化獎勵,而是使用一個特殊的「截斷式」(clipped)目標函數。
  3. 「截斷」機制:這是 PPO 穩定性的關鍵。它在當前策略周圍劃出一個「信任區域」(trust region),也就是安全區:演算法不能做出偏離當前策略太多的更新。這個截斷像一道保險,確保 Agent 不會踏出一大步冒險、把學到的東西全毀了。

簡而言之,PPO 在「提升表現」和「不偏離已知可行的策略太遠」之間取得平衡,避免訓練過程中的災難性失敗,讓學習更穩定。

直接偏好最佳化(Direct Preference Optimization,DPO) 是較新的方法,專為讓大型語言模型(LLM)對齊人類偏好而設計。相較於用 PPO 做這件事,它提供了更簡單、更直接的替代方案。

要理解 DPO,先理解傳統基於 PPO 的對齊方法會有幫助:

這個兩步驟流程可能又複雜又不穩定。例如 LLM 可能找到漏洞,學會「駭」獎勵模型:用爛回應騙到高分。

本質上,DPO 直接在人類偏好資料上最佳化語言模型,簡化了對齊流程:省去訓練和使用獨立獎勵模型的複雜度和潛在不穩定性,讓對齊更有效率、更穩健。

實際應用與使用情境

有適應力的 Agent 靠經驗資料驅動的迭代更新,在多變的環境中展現更好的表現。

案例研究:自我改進的 Coding Agent(SICA)

自我改進的 Coding Agent(Self-Improving Coding Agent,SICA)由 Maxime Robeyns、Laurence Aitchison 和 Martin Szummer 開發,代表了 Agent 學習的一項進展:Agent 能修改自己的原始碼。這與「一個 Agent 訓練另一個 Agent」的傳統做法不同──SICA 既是修改者,也是被修改的對象,靠迭代地打磨自己的程式碼庫,在各種程式挑戰上提升表現。

SICA 的自我改進以迭代循環運作(見圖 1)。一開始,SICA 檢視自己過去版本的檔案庫,以及它們在基準測試上的表現,選出表現分數最高的版本(分數由成功率、時間和計算成本的加權公式算出)。被選中的版本接手下一輪自我修改:分析檔案庫找出可以改進的地方,然後直接修改自己的程式碼庫。修改後的 Agent 再跑基準測試,結果記回檔案庫。這個過程不斷重複,直接從過去的表現中學習。這個自我改進機制讓 SICA 不需要傳統的訓練典範,也能演化自己的能力。

SICA 的自我改進:根據過去版本學習與適應

圖 1:SICA 的自我改進,根據自己的過去版本學習與適應。

SICA 經歷了多輪顯著的自我改進,在程式碼編輯和導覽上都有進展。最初,SICA 改程式碼用的是簡單的整檔覆寫;後來它發展出能做更聰明、更貼合上下文編輯的「Smart Editor」。這又演化成「Diff-Enhanced Smart Editor」,引入 diff 來做精準修改和基於模式的編輯,以及一個降低處理負擔的「Quick Overwrite Tool」。

SICA 進一步實作了「Minimal Diff Output Optimization」和「Context-Sensitive Diff Minimization」,利用抽象語法樹(Abstract Syntax Tree,AST)解析來提升效率,另外還加了「SmartEditor Input Normalizer」。在導覽方面,SICA 自主打造了「AST Symbol Locator」,利用程式碼的結構地圖(AST)在程式碼庫中定位定義。之後又開發出「Hybrid Symbol Locator」,結合快速搜尋和 AST 檢查,再透過「Optimized AST Parsing in Hybrid Symbol Locator」聚焦相關的程式碼區段,提升搜尋速度(見圖 2)。

跨迭代的表現

圖 2:跨迭代的表現。關鍵改進標註了對應的工具或 Agent 修改。(由 Maxime Robeyns、Martin Szummer、Laurence Aitchison 提供)

SICA 的架構包含一套基礎工具箱,負責基本的檔案操作、指令執行和算術運算,也包含提交結果的機制,以及呼叫專門子 Agent(coding、問題解決、推理)的機制。這些子 Agent 負責分解複雜任務、管理 LLM 的上下文長度,在長時間的改進循環中尤其重要。

一個非同步的監督者(overseer)──另一個 LLM──監控 SICA 的行為,找出迴圈或停滯這類潛在問題。它能與 SICA 溝通,必要時介入中止執行。監督者會收到 SICA 行動的詳細報告,包括呼叫圖(callgraph)和訊息與工具動作的記錄,用來辨識模式和低效之處。

SICA 的 LLM 以結構化的方式組織上下文視窗(它的短期記憶)中的資訊,這對它的運作至關重要。這個結構包括:System Prompt,定義 Agent 目標、工具與子 Agent 的文件、系統指令;Core Prompt,包含問題陳述或指示、開啟中的檔案內容、目錄地圖;Assistant Messages,記錄 Agent 一步步的推理、工具與子 Agent 的呼叫記錄和結果,以及監督者的通訊。這種組織方式讓資訊流動更有效率,提升 LLM 的運作、降低處理時間和成本。最初,檔案變更以 diff 記錄,只顯示修改的部分,並定期整併。

SICA:看看程式碼。 深入 SICA 的實作,可以看到幾個支撐其能力的關鍵設計決策。如前所述,系統採模組化架構,包含多個子 Agent:coding Agent、問題解決 Agent、推理 Agent。這些子 Agent 由主 Agent 以類似工具呼叫的方式喚起,負責分解複雜任務、有效管理上下文長度,在漫長的「後設改進」迭代中尤其重要。

這個專案持續開發中,目標是為想在工具使用等 Agentic 任務上對 LLM 做後訓練(post-training)的人提供一個穩固的框架。完整程式碼在 GitHub:https://github.com/MaximeRobeyns/self_improving_coding_agent/,歡迎進一步探索和貢獻。

在安全方面,專案非常強調 Docker 容器化:Agent 在專屬的 Docker 容器中執行。這是關鍵措施──考慮到 Agent 能執行 shell 指令,容器提供了與主機的隔離,降低誤動檔案系統之類的風險。

為了透明度和可控性,系統提供了完善的可觀測性:一個互動式網頁,把事件匯流排(event bus)上的事件和 Agent 的呼叫圖視覺化。它讓你全面掌握 Agent 的行動:檢視個別事件、閱讀監督者的訊息、收合子 Agent 的執行軌跡,看得更清楚。

在核心智慧方面,這個 Agent 框架支援多家供應商的 LLM 整合,方便實驗不同模型、為特定任務找出最合適的那一個。最後,一個關鍵元件是非同步監督者:與主 Agent 並行運作的 LLM,定期評估 Agent 的行為有沒有病態偏差或停滯,必要時介入──發通知,甚至取消 Agent 的執行。它收到的是系統狀態的詳細文字表示,包括呼叫圖,以及 LLM 訊息、工具呼叫和回應的事件流,藉此偵測低效的模式或重複的工作。

SICA 初期實作的一個明顯挑戰:如何用 Prompt 讓基於 LLM 的 Agent 在每輪後設改進迭代中,自主提出新穎、有創意、可行又有意思的修改。這個限制──特別是在培養 LLM Agent 的開放式學習和真正的創造力方面──仍是當前研究的重點課題。

AlphaEvolve 與 OpenEvolve

AlphaEvolve 是 Google 開發的 AI Agent,用途是發現和最佳化演算法。它結合了 LLM(具體是 Gemini 系列的 Flash 和 Pro)、自動化評估系統,以及演化演算法框架,目標是同時推進理論數學和實務計算應用。

AlphaEvolve 使用一組 Gemini 模型:Flash 負責大量生成初始的演算法提案,Pro 提供更深入的分析和打磨。提出的演算法接著依預先定義的準則自動評估和打分。這些評估回饋用於迭代改進解法,最終得到最佳化的、新穎的演算法。

在實務計算方面,AlphaEvolve 已部署在 Google 的基礎設施中。它改進了資料中心的排程,讓全球計算資源用量減少 0.7%;也對硬體設計有貢獻──為即將推出的 Tensor Processing Unit(TPU)的 Verilog 程式碼提出最佳化建議。此外,AlphaEvolve 加速了 AI 本身的效能:Gemini 架構的一個核心 kernel 提速 23%,FlashAttention 的低階 GPU 指令最佳化幅度最高達 32.5%。

在基礎研究領域,AlphaEvolve 為矩陣乘法發現了新演算法,包括一個 4x4 複數矩陣的乘法只需 48 次純量乘法的方法,超越了先前已知的解。在更廣泛的數學研究中,面對 50 多個開放問題,它在 75% 的情況下重新發現了現有的最先進解法,在 20% 的情況下更進一步改進了現有解,例子包括 kissing number 問題上的進展。

OpenEvolve 是一個利用 LLM 的演化式 coding Agent(見圖 3),迭代地最佳化程式碼。它調度一條「LLM 驅動的程式碼生成 → 評估 → 篩選」的 pipeline,針對各式各樣的任務持續強化程式。OpenEvolve 的一個重點能力是演化整個程式碼檔案,而不限於單一函式。這個 Agent 的設計講求通用性:支援多種程式語言、相容於任何提供 OpenAI 相容 API 的 LLM。此外,它還納入多目標最佳化、支援彈性的 Prompt Engineering,並能做分散式評估,有效率地應付複雜的程式挑戰。

OpenEvolve 架構

圖 3:OpenEvolve 的內部架構由一個 controller 管理。這個 controller 調度幾個關鍵元件:program sampler、Program Database、Evaluator Pool 和 LLM Ensembles。它的主要功能是促進這些元件的學習與適應過程,提升程式碼品質。

下面的程式碼片段用 OpenEvolve 函式庫對程式做演化式最佳化。它以初始程式、評估檔和設定檔的路徑初始化 OpenEvolve 系統。evolve.run(iterations=1000) 這行啟動演化流程,跑 1000 輪迭代來找出程式的改良版本。最後印出演化過程中找到的最佳程式的各項指標,格式化到小數點後四位。

from openevolve import OpenEvolve


# Initialize the system
evolve = OpenEvolve(
    initial_program_path="path/to/initial_program.py",
    evaluation_file="path/to/evaluator.py",
    config_path="path/to/config.yaml",
)

# Run the evolution
best_program = await evolve.run(iterations=1000)

print("Best program metrics:")
for name, value in best_program.metrics.items():
    print(f"  {name}: {value:.4f}")

速覽

問題: AI Agent 常常在動態、不可預測的環境中運作,預先寫死的邏輯不夠用。面對初始設計沒料到的新狀況,表現可能一路下滑。沒有從經驗中學習的能力,Agent 就無法隨時間最佳化策略或提供個人化互動。這種僵硬限制了它們的效果,也讓它們在複雜的真實場景中無法達到真正的自主。

解法: 標準化的解法是整合學習與適應機制,把靜態的 Agent 轉變成動態、會演化的系統。這讓 Agent 能根據新資料和互動,自主地打磨知識和行為。Agentic 系統可以採用多種方法:從強化學習,到更進階的自我修改──像自我改進的 Coding Agent(SICA)那樣。Google 的 AlphaEvolve 這類先進系統,則利用 LLM 和演化演算法,為複雜問題發現全新、更有效率的解法。透過持續學習,Agent 能掌握新任務、提升表現、適應變化的環境,不需要不斷的人工重新設定。

經驗法則: 打造必須在動態、不確定或持續演變環境中運作的 Agent 時,就用這個模式。需要個人化、持續改善表現、能自主應付新狀況的應用,都少不了它。

圖解:

Learning and Adapting 模式

圖 4:Learning and Adapting 模式。

重點回顧

結語

本章檢視了學習與適應在人工智慧中的關鍵角色。AI Agent 透過持續的資料取得和經驗累積來提升表現。自我改進的 Coding Agent(SICA)就是例證:靠修改程式碼自主提升自己的能力。

我們已經回顧了 Agentic AI 的基本組成:架構、應用、規劃、Multi-Agent 協作、記憶管理,以及學習與適應。學習原則對 Multi-Agent 系統的協同改進特別重要。要做到這一點,調校資料必須準確反映完整的互動軌跡,捕捉每個參與 Agent 各自的輸入和輸出。

這些要素共同促成了重大的進展,例如 Google 的 AlphaEvolve。這個 AI 系統靠 LLM、自動化評估和演化方法,獨立發現並改良演算法,推動科學研究和計算技術的進步。這些模式可以組合起來,建構精密的 AI 系統。AlphaEvolve 這樣的發展證明:由 AI Agent 自主發現和最佳化演算法,是做得到的。

參考資料

  1. Sutton, R. S., & Barto, A. G. (2018). Reinforcement Learning: An Introduction. MIT Press.
  2. Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
  3. Mitchell, T. M. (1997). Machine Learning. McGraw-Hill.
  4. Proximal Policy Optimization Algorithms by John Schulman, Filip Wolski, Prafulla Dhariwal, Alec Radford, and Oleg Klimov. You can find it on arXiv: https://arxiv.org/abs/1707.06347
  5. Robeyns, M., Aitchison, L., & Szummer, M. (2025). A Self-Improving Coding Agent. arXiv:2504.15228v2. https://arxiv.org/pdf/2504.15228 https://github.com/MaximeRobeyns/self_improving_coding_agent
  6. AlphaEvolve blog, https://deepmind.google/discover/blog/alphaevolve-a-gemini-powered-coding-agent-for-designing-advanced-algorithms/
  7. OpenEvolve, https://github.com/codelion/openevolve
Edit this post
Next
Day 15:如果是我會怎麼寫一個 agent framework