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動作會更新P、save_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 對未來工作的衝擊 | 預期將觸及就業 / 工作流轉型議題 |