AI Agent (1/3):核心技術 Context Engineering 基本概念解說

後設資料

  • URL:https://www.youtube.com/watch?v=urwDLyNa9FU
  • 媒體:YouTube 影片(李宏毅「機器學習導論」課程錄影;AI Agent 系列 1/3)
  • 作者:李宏毅(台大電機系教授)
  • 發表日:未明示;引用 2024-中至 2025 多篇論文(ACON / AgentFold / Agentic Context Engineering / Recursive Language Model / MCP-Zero 等),推測 2025 年下半
  • 語言:繁體中文(口述 + slide)
  • 內容形式:純口述教學,本頁保留 YouTube 自動字幕逐字稿(含 ASR 錯字「OpenClaw / 龍蝦 / Morty / Claude」等註解保留)作為原始性記錄,要點段落改寫為可讀版本

一句話濃縮

Context-Engineering 就是 AI agent 在 LLM 與外界之間做守門人,幫 LLM 管理它一定有上限的輸入長度」——李宏毅 用 7 行虛擬碼把 context engineering 形式化為一個更新函式 F,然後系統化地走過壓縮李宏毅 列了 LLM 摘要 / observation masking / log 檔案外掛 / Sub-Agent / AgentFold 5 種變體)、記憶(save/load + filtering + on-demand load)、Context-Collapse(壓縮把任務真正在意的資訊壓沒了)、Agentic-Context-Engineering(把 F 本身也交給 LLM)四大議題;現在 vault 既有的 Context-Engineering 框架被本片從雙層(prompt / context)細化到演算法層(C = P + M、F 的多種具體實作)。

提取要點

為什麼需要 Context Engineering(複習)

  • LLM 是文字接龍,活在當下——它只看現在的輸入,不記得之前對它說過什麼。
  • 所以每呼叫 LLM 一次,要把人類指令 + LLM 自己的工具呼叫指令 + 工具輸出全部接成一條長 prompt 餵回去。
  • LLM 的輸入長度有上限,所以這條長 prompt 會越長越不能用。
  • AI Agent 是「LLM 的守門人 / 經紀人」:攔截在 LLM 與人類 / 環境之間,選擇給 LLM 看的內容——不能太長(超過 window)也不能太短(LLM 失憶)。這件事就叫 Context-Engineering。OpenCode 只是 AI Agent 的初代代表,「今天看 OpenCode 大概就像今天用 iPhone 看當年 Nokia」。

演算法形式:C = P + M、F 是 context engineering 的核心

李宏毅 用 7 行虛擬碼把 context engineering 形式化(vault 視角下這是 Context-Engineering 第一次被以演算法層級寫下):

沒做 context engineering(裸 LLM)

C ← []
for t = 1, 2, 3, …:
    O_t ← LLM(C, I_t)        # I_t = 本輪輸入(人類訊息 / 工具輸出)
    C   ← C + I_t + O_t      # 簡單 append

做了 context engineering:唯一改變是最後一行 →

C ← []
for t = 1, 2, 3, …:
    O_t ← LLM(C, I_t)
    C   ← F(C, I_t, O_t)     # F 不是 append,是任意更新函式

進一步把 記憶 區分出來C = (P, M)

  • P = 真的會丟給 LLM 的 prompt(語言模型看得到的部分)
  • M = 存在硬碟、不會直接丟給 LLM 的記憶
  • 演算法只把 P_t 餵給 LLM;load_memory 動作會更新 Psave_memory 動作會更新 M

詞彙澄清李宏毅 在影片中明確要區分):

  • Context = AI Agent 經歷過的一切(含 P + M)
  • Prompt = Context 中真正進到 LLM 那一段(= P)
  • 上課時兩詞常混用,但精確上兩者不同

F 的常見實作 1:壓縮

為什麼需要壓縮——LLM 輸入有上限。

(a) LLM Summary(OpenCode 內建)

  • 把整個歷史紀錄(扣掉 system prompt)丟給另一個 LLM 做摘要 → 用摘要取代舊歷史。

(b) Observation Masking(簡單粗暴法)

  • 把舊工具輸出整段換成「這裡曾經有一個工具的輸出」一句話。
  • 驚人的事實2025-中 SWE-bench 比較 paper 顯示 observation masking ≈ LLM summary,許多 case 表現平手。
  • Trajectory 延長現象(同 paper 指出的反例):壓縮後步驟數變多(LLM 忘了已經執行過的工具又重做)→ 整體 token 沒省到。

(c) 兩者混用是最佳策略(同 paper 結論)

  • 前期用 observation masking(便宜)。
  • 後期 context 仍逼近上限時,再用 LLM summary 一次大壓縮。

(d) 把工具輸出存檔(log 外掛)

  • 把舊工具輸出寫進 log1.txt → context 只留「詳見 log1.txt」。
  • 多數時候 LLM 不會回頭讀 → 等於把記憶從 prompt 裡移到硬碟。
  • LLM 真需要時可呼叫 read 工具撈回——這就是 Agent-Memory 的雛形。
  • 李宏毅 用《Rick and Morty》第三季 Morty 發現 Rick 把記憶藏地下室管子的橋段做類比;現實中很多科幻情節(電影製造機)已被 AI 追上了。

(e) Sub-Agent:自主壓縮

  • 主 agent 用 spawn 工具產生 sub-agent;sub-agent 完成任務後用 return 工具回傳一段話。
  • 整段 sub-agent 對話被「壓縮」成 return 那句話——對主 agent 的 context 而言這就是自主壓縮。
  • 一張具體圖(paper 中複雜論文搜尋任務的 context 長度趨勢)顯示主 context 呈鋸齒狀上升下降——每次 spawn 累積、每次 return 砍一刀;若不用 sub-agent 整段累積會超過 100 K token 上限。

(f) AgentFold:訓練模型自己 fold

  • LLM 天生不喜歡壓縮自己的記憶——多次 paper 反覆驗證;OpenCode 的 compaction 是寫死規則就是因為 LLM 不會自己決定要壓縮。
  • AgentFold paper 裡甚至嘗試強逼模型用 erase 工具,模型還是不做
  • AgentFold 的解法:用 reinforcement learning fine-tune 模型,逼它學會用 fold(start, end, summary) 工具自主把第 start 到 end 步驟壓縮成 summary。單純 prompt 不行,必須調參

F 的常見實作 2:記憶

把 context 一部分挪到硬碟外掛、需要時再 load 回來,而不是全部塞進 prompt。

  • 基本兩個工具save_memory(更新 M)+ load_memory(更新 P)。
  • OpenCode 的具體實作memory_search + memory_get 兩個工具;memory_get 多帶起始行 + 行數兩個參數,避免一次把整個 memory file 全讀進 prompt。讀檔本身就有過濾語意(為什麼讀 memory 不直接用一般 read)。
  • 儲存結構研究方向:(a) 把記憶建成 graph;(b) 給記憶加時間戳;(c) 透過搜尋抽取相關片段;(d) 何時 save、何時 load 是研究議題。
  • 李宏毅 列舉的記憶相關文獻汗牛充棟——影片中以 reference list 帶過。

F 的常見實作 3:過濾(治本,不是治標)

與其等 context 太長再壓縮(治標),不如一開始就不要讓垃圾資訊進來(治本)。

  • 兩篇 paper 一致的分析結論
    • 一般 agent task 中 84% 的 context 是 observation(外界輸入:檔案、工具長輸出);action 只佔 6.5%、reasoning 9.6%。
    • SWE 任務中 76% 的 context 是「讀程式碼」(read 把整個 repo 內容塞進來);只有 12% / 11.8% 是執行 / 修改程式。
  • 解法:智慧型 read 工具——LLM 輸出指令時不只說「讀 log 檔」,還說「讀 log 檔裡跟修 bug 有關的內容」;read 工具本身用一個小 LLM 過濾後再傳回主 agent。
  • OpenCode 的 memory_get 起始行 + 行數參數也是同樣精神:read 不是無腦讀,是有選擇性地讀。

F 的常見實作 4:按需加載(On-Demand Loading)

工具描述塞在 system prompt 中也很佔空間。

  • MCP-Zero paper 的觀察:使用 GitHub 的工具描述就要 4600 token;多幾個工具就吃光 context window。
  • 傳統 RAG 路徑(不夠好):依使用者 query 從工具庫搜出相關工具——但 user query 通常太模糊(「幫我修 bug」對應 read + edit + …多個工具)。
  • MCP-Zero 的方法:讓 LLM 自己輸出「我需要怎樣的工具」的需求→ 用這個需求做 retrieval。讓 AI 自主決定它要什麼工具。
  • OpenCode 的 Skill 系統就是按需加載——並非把所有 skill 一次放進 prompt,而是要用時才從硬碟讀出來。

關鍵失敗模式:Context-Collapse

ACON paper 指出。

  • 症狀:摘要不是不能產生,而是摘要產出後 → 原本能做對的任務變不會做——把任務真正在意的資訊壓沒了。
  • vault 既有對位案例2026-05-02-Harness-Engineering駕馭工程 末段提到的 Meta agent 收信事件——agent 在 compact 過程中把「刪信前要人類同意」這條最關鍵指令一起壓掉,於是它就開始亂刪信。那其實就是經典的 context collapse
  • ACON 的解法(不微調模型)
    • 拿失敗 trajectory 給另一個 LLM 看,叫它反省「為什麼壓縮後變差」→ 產出一段 feedback 文字。
    • 下次摘要前把這段 feedback 給負責摘要的 LLM 看 → 它就更知道哪些東西不能丟。
    • 參數沒變,但摘要品質提升——本質上是 Verbalized-Feedback 在 context engineering 場景的具體應用。
    • AppWorld benchmark 上:紫點(ACON)vs 黑點(無壓縮)vs 紅點(單純 LLM summary)→ ACON 同時 token 更省、正確率更高。
  • 另一條路:fine-tune 摘要 LLM(同篇 paper 的 RL 路徑):用 RL,最終任務做對 → positive reward;但因為摘要模型其實 = 解題模型,RL 同時訓練了「摘要寫得好」和「根據摘要解題」兩個能力——兩者一起被優化才有用。

F 之上:Agentic-Context-Engineering

那為什麼 F 一定要人類工程師寫死?讓 LLM 自己來啊」。

  • 核心想法:把 context engineering 函式 F 也交給語言模型自己決定怎麼做
  • 語言模型現在在 context 裡開一塊「愛玩什麼就玩什麼」的區塊(system prompt / agent identity 等不能動的部分仍固定);F 由 LLM 看著一段教它怎麼整理 context 的 prompt 自己執行。
  • 早期代表:Dynamic Cheatsheet——把那塊 context 叫 cheatsheet(小抄),用 prompt engineering 教 LLM「存下未來能用的東西、不要存任務 specific 的東西」(策略、可重複用的程式片段、關鍵發現要存;當下任務細節不存)。用 prompt engineering 來做 context engineering
  • 進階:Agentic Context Engineering paper——把那塊叫 playbook(員工守則);不是直接重寫 playbook,而是經過三個 LLM 模組產生「修改 playbook 的指令」(避免直接覆蓋導致舊資訊遺失)。
  • Recursive Language Model:號稱「可以吃無窮長 input」的語言模型;實際上是 context engineering——超長 context 全放 hard disk,prompt 只留 metadata(context 多長、切幾段、存哪),LLM 自己寫程式 RAG 出需要的部分。讀其 prompt 就會發現「就只差沒明說讓你做 RAG」,但效果在 GPT-5 + 1M context 的長文 benchmark 上確實能再拉一段。

提取概念

連結到此來源衍生 / 更新的 wiki 頁:

  • Context-Engineering大幅更新 — 補入演算法形式 C = P + M、F 五種壓縮變體(LLM summary / observation masking / log 外掛 / sub-agent / AgentFold)+ 治標 vs 治本(過濾 + 按需加載)+ 「LLM 不喜歡壓縮自己記憶」紀律 + 「Context vs Prompt 詞彙澄清」段;本片把該頁從「概念性介紹」推進到「演算法層解析」,是 vault 中本概念第一次被系統化整理)
  • Sub-Agent新建 — concept;spawn / return 兩動作骨架 + 「等同自主壓縮」context-engineering 視角 + RL 訓練必要性(純 prompt 學不會)+ context 鋸齒狀曲線視覺特徵)
  • Agent-Memory新建 — concept;save / load + 過濾 + 按需加載;OpenCode memory_search / memory_get 兩工具拆解;對位 Lifelong-AI-Agent 跨年累積;Morty 地下室記憶管子的類比)
  • Agentic-Context-Engineering新建 — concept;把 F 也交給 LLM 自己做的方法論流派;Dynamic Cheatsheet → ACE playbook → Recursive Language Model 三 paper 系列;本質 = 用 prompt engineering 做 context engineering)
  • Context-Collapse新建 — concept;摘要把任務真正重要資訊壓沒了的失敗模式;ACON paper 的 verbalized feedback 解法 + Meta 收信案例 vault 對位)
  • Harness-Engineering更新 — 補入「Sub-Agent / Agentic-Context-Engineering 是 harness「控制行為(工作流程)」手段下的兩個重要 sub-pattern」+ 「過濾 / 按需加載是 harness「控制能力邊界(工具設定)」手段的延伸——工具不只設邊界,還要有過濾智能」對位)
  • Agent更新 — 補入「Agent 在 context 視角下就是 LLM 的守門人 / 經紀人」+ Sub-Agent 自主程度光譜的延伸位置)
  • Claude-Code更新 — 補入「OpenCode 是 AI Agent 的 Nokia 時代代表李宏毅 比喻 + Skill 按需加載對應 MCP-Zero 概念 + memory_search / memory_get 兩工具的設計理由(過濾語意) + 為何 compaction 是寫死規則(LLM 天生不喜歡自主壓縮))
  • 李宏毅更新 — 補入「AI Agent 系列 1/3 = Context Engineering」+ 預告 2/3(agent 互動)/ 3/3(對未來工作衝擊)兩集;本片是 vault 第二份其來源)
  • Prompt-Engineering更新 — 補入「Context vs Prompt 詞彙澄清」段;以及「Agentic Context Engineering 用 prompt engineering 做 context engineering」的對位)
  • Verbalized-Feedback更新 — 補入 ACON paper:用 verbalized feedback 改進摘要 LLM(不調參)+ AgentFold:RL 訓練 LLM 自主使用 fold 工具兩個案例)
  • Lifelong-AI-Agent更新 — 補入 Agent-Memory 兩階段機制 + AgentFold 自主壓縮 / Sub-Agent 自主分裂兩個 lifelong 必備的能力來源)

原文(YouTube 自動字幕逐字稿,含時間戳)

保留原始 ASR 逐字稿作長期保存。明顯誤轉註解:「OpenClaw / 龍蝦」推測為 OpenCode(第三方 harness)/「Claude」原文上下文清楚指 Claude Code / 「Morty」原文寫成「Morty」是動畫角色(Rick and Morty)的固有名詞,不是錯字;「AutoGPT」是早期 AI agent 範例的固有名詞,不是錯字。

0:00
好,各位同學大家好啊 我們就開始來上課吧 今天呢,我們要繼續來講 AI Agent
0:08
那今天的課程呢 還是比較科普性的 那我們分成三個段落 第一段呢
0:13
我們來講 AI Agent 背後的核心技術 我們比較系統化地來講 Context Engineering
0:20
然後第二段呢 我們來講 AI Agent 之間的互動 然後最後我們來講 AI Agent
0:26
對於我們未來的工作 可能造成什麼樣的衝擊 那我們就先從 AI Agent 的核心技術
0:34
Context Engineering 開始講起 那等一下這段課程啊 也許你聽了會覺得似曾相識
0:40
因為很多呢 Context Engineering 的技術 都已經在這個 OpenClaw 裡面被實作
0:47
那今天這段課程比較不一樣的地方 是會引用大量的論文
0:52
那你發現這些論文都是非常新的論文 幾個月前、半年前的論文 而這些技術都已經被實作在 OpenClaw 裡面
1:00
所以上週其實很多技術我們都已經有提到 那只是今天呢 再從另外一個角度來談 Context Engineering
1:08
那在談 Context Engineering 之前呢 這邊有一個開場 我們還是跟大家複習一下
1:14
為什麼需要 Context Engineering 那我們知道語言模型呢
1:19
就是在做文字接龍 你給它一個輸入 給它一個 prompt 它就接一段話出來
1:25
那人類給語言模型一個輸入 語言模型給人類一個回應 那這個回應不一定是一句話
1:32
它可能是一個使用工具的指令 那這個使用工具的指令 可能會去驅動環境裡面的某一個程式
1:41
被執行 然後得到工具的輸出 那當我們要把工具的輸出
1:47
傳給語言模型 告訴它這個工具執行的結果的時候 你不能夠只給它工具的輸出
1:53
大家要記得 語言模型是活在當下的 它只管現在的輸入
2:00
它不管你之前曾經給它過什麼 所以當你得到工具 1 的輸出的時候
2:06
你要把之前人類給的命令 語言模型自己呢 操控工具的指令
2:11
加上工具的輸出 全部接在一起 丟給語言模型 有的同學可能會說
2:17
這邊不是輸入三個東西嗎 語言模型不是應該回 三個回應 你誤會這個投影片的意思了
2:22
這邊是這三段話 被接成一段 對語言模型來說 它看到的
2:28
就是一串非常長的輸入 然後它再給一個回應 比如說它決定
2:33
使用另外一個工具 然後它再得到工具 2 的輸出 工具 2 的輸出
2:39
要丟給語言模型的時候 切記不能只給它工具 2 的輸出 之前發生所有的事情
2:45
串成一串非常長的輸入 再丟給語言模型 同樣的步驟就反覆下去
2:51
語言模型說它要使用工具 3 得到工具 3 的輸出 把一串非常長的輸入
2:56
傳給語言模型 那這裡會遇到的難點就是 語言模型的輸入長度是有限的
3:04
它不能夠吃無限長的輸入 這就是為什麼我們需要 AI Agent
3:10
AI Agent 就是攔截在語言模型跟人類 或者是語言模型要執行的環境之間的一個介面
3:19
它就像是語言模型的守門人 語言模型的經紀人 它決定語言模型會看到什麼
3:26
所以來自外界的輸入會經過 AI Agent 那這個 AI Agent 不一定是 OpenClaw
3:32
OpenClaw 只是 AI Agent 的其中一個例子 那今天 OpenClaw 還非常的原始
3:38
你可以想成它是初代的 AI Agent 它也許在過幾年以後 我們再回頭看 OpenClaw
3:44
就好像今天你拿著 iPhone 去看過去的 Nokia 手機一樣的感覺
3:49
我們現在看到的只是 AI Agent 的原型 以後一定還會有更多的進展
3:55
那 OpenClaw 做的事情 或 AI Agent 做的事情 就是選擇給語言模型看的內容
4:00
所以語言模型真正看到的是 AutoGPT AI Agent 篩選過的長度合適的輸入
4:07
那這個輸入啊 它不能太長 因為語言模型 它的輸入就是有上限
4:13
但也不能夠太短 如果太短 語言模型就不知道 剛才發生了什麼事 就沒有辦法正確地做接龍了
4:20
所以對 AI Agent 來說 它要做的事情 其實非常的複雜 它需要產生一個
4:25
長度合適的輸入 不能太長 也不能太短 而這個 AI Agent
4:30
幫語言模型管理它的輸入 讓輸入的長度是合適的 這件事情就叫做 Context Engineering

[…完整逐字稿略,可從 URL 重取;要點與提取概念已完整保留於上方…]

53:01
那這個部分 要跟大家分享的是 context engineering

完整逐字稿可由 YouTube 自動字幕重新取出(影片 URL 上方);本頁主檢索路徑為要點 + 提取概念段;逐字稿為第二參考。

系列脈絡

李宏毅 在開場明示本片為 AI Agent 系列 (1/3):

段落主題對應
1/3(本片)AI Agent 核心技術 = Context Engineering本頁
2/3(待 ingest)AI Agent 之間的互動預期將觸及 Agent2Agent / multi-agent 議題
3/3(待 ingest)AI Agent 對未來工作的衝擊預期將觸及就業 / 工作流轉型議題