20251115筆記 內容可能有錯誤,請參考原始影片 [李宏毅【生成式人工智慧與機器學習導論2025】](https://www.youtube.com/playlist?list=PLJV_el3uVTsMMGi5kbnKP5DrDHZpTX0jT) [生成式人工智慧與機器學習導論2025】第 2 講:上下文工程 (Context Engineering) — AI Agent 背後的關鍵技術](https://www.youtube.com/watch?v=lVdajtNpaGI&t=45s) ### 生成式人工智慧與機器學習導論2025】第 2 講:上下文工程 (Context Engineering) — AI Agent 背後的關鍵技術 大綱 I. **上下文工程 (Context Engineering) 概述** A. 定義與核心概念 B. 和提示工程 (Prompt Engineering) 的關係 C. 提示工程(Prompt Engineering)的演變 D. 語言模型 (LM) 的運作方式 II. **上下文 (Context) 應包含的內容** A. 使用者提示 (User Prompt) B. 系統提示 (System Prompt) C. 對話歷史記錄與記憶 D. 外部資訊(搜尋與 RAG) E. 工具的使用 F. 模型的自我思考過程 (Reasoning) III. **AI Agent 時代下 Context Engineering 的必要性** A. AI Agent 的工作流程 B. 上下文窗口限制與性能退化 IV. **上下文工程 (Context Engineering) 的基本操作與策略** A. 選擇 (Selection) B. 壓縮 (Compression) C. 多代理人 (Multi-Agent) 設計 ### I. 上下文工程 (Context Engineering) 概述 **A. 定義與核心概念** 1. 語言模型 (Language Model) 本質上是在做**文字接龍**。它是一個函數 $f$,給定輸入 $X$(即 Prompt),輸出 $f(X)$。 2. 若輸出結果不符合預期,解決方法有兩種: * **改變 $f$(訓練/學習):** 改變語言模型函數內部的參數,使其行為改變。這屬於機器學習 (Machine Learning) 領域。 * **改變 $X$(上下文工程):** 幫 $f$ 準備合適的輸入 $X$,讓最終得到的 $f(X)$ 是預期的結果。 3. 上下文工程(Context Engineering)的目標是**自動化地管理語言模型的輸入 (X)**。 4. 上下文工程的核心目標是**避免塞爆上下文 (Context)**,想辦法只放入需要的東西,並清理掉不需要的內容。 **B. 與提示工程 (Prompt Engineering) 的關係** 1. 演講者認為 Context Engineering 和 Prompt Engineering **沒有本質上的不同**。Context Engineering 只是給 Prompt Engineering 取了一個更潮的新名字,就像早期「類神經網路 (Neural Network)」後來改名為「深度學習 (Deep Learning)」一樣。 2. 雖然概念相同,但兩者關注的重點有所差異: * **傳統 Prompt Engineering 關注點:** 特定格式(如 JSON 格式、用井字號分隔段落)或尋找神奇咒語 。 * **當代 Context Engineering 關注點:** 自動化管理 LM 的輸入,特別是在 AI Agent 時代。 **C. 提示工程(Prompt Engineering)的演變** 1. **格式的重要性下降:** 早期需要特定的格式來提示 LM,但隨著語言模型越來越強,通常人類看得懂的格式,模型也看得懂。 2. **神奇咒語的效果減弱:** 在早年 LM 較弱、輸入輸出關係無厘頭時,可能找到神奇咒語來操控模型。 * *早期 GPT-3 案例:* 在 Prompt 中加入一連串 "Ways" 可以使回答長度顯著增加。 * *廣為人知的咒語:* 「一步一步地思考 (Let’s think step by step)」(Chain of Thought, CoT)。 * *奇怪的因素:* 告訴模型「請確保你的答案是正確的」、「請深呼吸」,或「如果你答對了,我就給你一點小費」都能提升正確率。甚至有實驗指出,告訴 ChatGPT「如果你做得好,就可以達成世界和平」會讓它表現最好。 3. **咒語效果遞減:** 隨著模型發展,這些神奇咒語的效果越來越低。模型本來就應該使盡全力做到最好,不應需要額外提示(如給小費或叫它思考)。 ### II. 上下文 (Context) 應包含的內容 上下文是語言模型輸入的總稱,包含多個層面: **A. 使用者提示 (User Prompt)** 1. **基本任務:** 使用者對語言模型下達的指令。 2. **詳細指引與限制:** 除了任務說明,還需提供額外條件,讓輸出更接近所需。 * *範例:* 寫信給老師請假,需交待「開頭先道歉」、「說明遲到理由(身體不適)」、「之後會更新進度」、「信件在 100 字以內」、「講話嚴肅」等。 3. **前提資訊 (Contextual Information):** 講清楚前提可幫助 LM 做出更好的回答。 * *範例 1:* 詢問「載具是什麼意思?」。如果沒有情境,LM 可能回答是交通工具或電子設備。若說明情境是在「超商結帳時,店員問我要用載具嗎?」,LM 則能精確回答是指「電子發票的儲存工具」。 * *範例 2:* 曼谷運河照片中的動物。如果僅提供圖片,LM 可能判斷為鱷魚。若加上情境「現在在泰國曼谷」,LM 則能回答是**水巨蜥 (Water Monitor)**,並解釋其在泰國是吉祥的象徵。 4. **範例 (Examples, In-Context Learning):** 在 User Prompt 中加入範例會影響 LM 的答案。 * *範例:* 要求 LM 將文章改寫成「火星文」。如果沒有給範例,LM 可能自行定義火星文(如將「台」放入框框)。若給出範例(如將「要去冒險的人來找我哦」改寫為「要ㄑ冒險ㄉ來找我哦」),LM 就能理解並正確使用注音符號替換文字的火星文。 * *In-Context Learning:* 這是指透過提供範例來改變 LM 輸出的方法。這不是傳統意義上的機器學習,因為**模型參數沒有改變**。 * *Gemini 1.5 神蹟:* 證明 In-Context Learning: 能力的經典案例是 Gemini 1.5 翻譯卡拉蒙語 (Kalamang)。這種語言資料稀少,單獨提問 LM 無法翻譯。但若將卡拉蒙語的教科書和字典放入 Context 中,LM 就能進行翻譯。研究顯示,真正使模型具備翻譯能力的是教科書中的**例句**,而非文法說明。 **B. 系統提示 (System Prompt)** 1. System Prompt 是開發 LM 平台的人,認為模型在每次互動時都需要知道的資訊。 2. **內容極度複雜:** 一個好的服務,其 System Prompt 可能非常長。例如,Claude Opus 4.1 的 SP 長度超過 2500 個字。 3. **System Prompt 包含的設定 (以 Claude 為例):** * **身份定義:** 它叫 Claude,由 Anthropic 打造。 * **時間資訊:** 告知今天是幾月幾號。 * **使用說明與限制:** 例如詢問 API 用法時,應引導使用者閱讀特定網頁。 * **互動方式:** 如使用者不滿意,應請其按倒讚符號。 * **禁止事項:** 如不告訴使用者如何合成化學物質或製造核武器。 * **風格設定:** 不要在回答開頭說「好問題 (Good question)」。 * **知識截止日期:** 告知其知識僅到 2025 年 1 月。 * **自我定位:** 不要說自己是人類或有意識。 * **錯誤處理:** 即使人類糾正錯誤,也不要馬上承認,應仔細思考後再回答。 **C. 對話歷史記錄與記憶** 1. **對話歷史記錄 (Dialogue History):** 相當於 LM 的**短期記憶**。LM 透過延續 Context 中的歷史記錄來做文字接龍。 * *誤解提醒:* 在對話中傳授新知識**無法改變模型參數**,也無法訓練它或改變其內部的真正行為。一旦開啟新的對話,短期記憶就會消失。 2. **長期記憶 (Long-Term Memory):** 2024 年 9 月之後,ChatGPT 開始具備長期記憶功能。 * *運作方式:* 長期記憶會被植入到你的問題之前,但使用者通常看不到。LM 會利用過去互動的歷史記錄來形成長期記憶,並根據此記憶回答問題。 * *啟動方式:* 在 ChatGPT 的「自定 ChatGPT」—「個人化」欄位中開啟「記憶」選項。 **D. 外部資訊(搜尋與 RAG)** 1. LM 的知識可能有限且過時。我們希望**自動提供額外的相關資訊**。 2. **RAG (Retrieval Augmented Generation):** 最常用做法是透過搜尋引擎。在問 LM 問題前,先丟到網路或資料庫搜尋,將額外資訊放入 Context 中。 * *RAG 挑戰:* 即使結合了搜尋引擎,LM 仍只是在做文字接龍,有可能犯錯。 * *經典錯誤範例:* Google AI Overview 在測試期,曾有人問「我的起司黏不在披薩上怎麼辦?」,模型根據搜尋結果(可能是 Reddit 上的玩笑話),建議「用四分之一杯**無毒的膠水**」。 **E. 工具的使用 (Tool Usage)** 1. LM 可以搭配多種工具使用,例如搜尋 Gmail、閱讀 Google Calendar,甚至直接修改 Google Calendar (如 Gemini)。 2. **工具調用原理:** 必須在 Context 中(通常是 System Prompt)寫好工具的使用方法、格式和範例。 3. **步驟詳解:** * LM 讀取 Context 中定義的工具說明。 * LM 透過文字接龍**輸出**一段「想使用工具的指令」 (e.g., `<tool>multiply(3,4)</tool>`)。 * **此輸出本身只是一串文字**,無法真正驅動工具。 * 平台需要一個**外部程式**(如使用 `EVAL` 函數)將這串文字指令取出並執行。 * 執行後得到工具的輸出結果 (e.g., `output: 12`)。 * 平台將**工具的指令和輸出的結果**重新放回 Context 中,讓 LM 繼續做文字接龍。 * 最終 LM 根據最新的 Context 輸出答案。呼叫工具和輸出的過程可以隱藏,不給使用者看。 4. **Computer Use (電腦使用):** * 這是最通用且強大的工具。LM 可以使用滑鼠和鍵盤操作電腦。 * 原理與工具使用一致:給予 LM 螢幕畫面,並告知其可用的工具是「鍵盤輸入」、「移動滑鼠」和「點擊滑鼠」。 **F. 模型的自我思考過程 (Reasoning)** 1. **深度思考 (Deep Thinking):** 許多模型聲稱具備深度思考能力 (如 CoT, DFINK)。 2. **腦內小劇場:** 當被詢問問題時,模型會先在腦中演練解法,進行規劃、嘗試和驗證,然後再給出最終答案。 3. **Context 的一部分:** 模型自我產生的思考過程(腦內小劇場)也可以視為 Context 的一部分,儘管使用者通常只能看到摘要或選擇不看。 ### III. AI Agent 時代下 Context Engineering 的必要性 **A. AI Agent 的工作流程** 1. **一問一答 (傳統):** 簡單的提問和回答。 2. **Workflow (SOP):** 為複雜任務設定固定的標準操作程序 (SOP),讓 LM 分多個步驟完成。 3. **AI Agent (LLM 決定步驟):** 讓 LM **自己決定解決問題的步驟**,並根據解題過程中的變化靈活調整計畫。 * *Agent 循環:* 人類設定目標 $\rightarrow$ LM 根據當前 Observation 採取 Action (如調用工具、寫程式) $\rightarrow$ Action 影響環境 $\rightarrow$ 環境產生新的 Observation $\rightarrow$ LM 根據新 Observation 採取新 Action,持續循環。 4. **優勢:** LM 輸出的 Action 具有近乎無限的可能性,並能用人類語言提供回饋和控制。 **B. 上下文窗口限制與性能退化** 1. **挑戰:** AI Agent 任務複雜且步驟多,需要長時間運作,導致輸入 Context 過長。 2. **Context Window:** 這是模型可以接受的輸入長度上限。 * LM 在訓練時只能看最長 Context Window 範圍內的輸入,超過長度可能會導致模型發瘋。 * 現代模型(如 Gemini 1.5 Pro)號稱能支持 200 萬個 Token,長度極長(可讀完《哈利波特》全集加三本《魔戒》)。 3. **長度不等於理解:** 能輸入長 Context **不代表能讀懂**所有內容。 * **Context 飽和:** 許多實驗顯示,在達到 Context Window 上限之前,模型就已開始對輸入感到困惑。 * *RAG 失敗:* Databricks 實驗顯示,RAG 資訊越多,正確率通常先上升,但資料太擁擠時,正確率會先升後降,甚至低於給予最少資料的情況。 * **Lost in the Middle:** 模型對於長 Context,通常比較記得**開頭和結尾**的資訊。如果正確答案出現在中間的文章,模型很容易答錯,甚至可能不如讓模型憑藉自身知識直接回答。 * **冗長互動導致能力下降:** 在冗長的互動中,如果採取「擠牙膏式」的方法,將問題拆解成多個小問題,模型的表現會比一次給予完整輸入時更差,且表現不穩定 (unreliable)。 * **Context Rot:** 隨輸入長度增加,模型的複述(重複輸入文字)等基礎任務的正確率會快速下降。即使輸入遠未達到 C-Window 上限,模型也會開始感到困惑。 ### IV. 上下文工程 (Context Engineering) 的基本操作與策略 Context Engineering 策略的宗旨是:將需要的東西放進 Context,並將不需要的東西清出來,保持 Context 的整潔。 **A. 選擇 (Selection)** 1. **原理:** 不要將所有東西都放入 Context,只挑選有用的資訊。 2. **RAG 選擇:** RAG 本身就是 Context Engineering 的一種重要技術。 * **Prompt 轉關鍵字:** 可以透過另一個 LM 協助,將使用者任務轉化成合適的關鍵字,用於 Google 搜尋。 * **Reranking (重新排序):** 搜尋引擎給予的文章不一定都相關。可以使用一個較小的 LM 再次篩選,只選擇與使用者 Prompt 最相關的文章放入 Context。 * **選句子 (Sentence Selection):** 利用一個參數小於 300M 的快速模型來判斷每個句子與 User Prompt 的相關性。 3. **工具選擇 (Tool Selection):** * 如果模型有 1000 個工具,不能將所有工具的使用說明都放入 SP,否則會塞爆 Context。 * 應將每個工具的使用說明視為一篇文章,根據使用者需求,執行**工具版 RAG**,只搜尋出相關的工具說明,放入 Context 中。 * 給予 LM 過多工具會使其發瘋。 4. **記憶選擇 (Memory Selection):** * 長久記憶不能將過去發生的一切瑣碎小事都放入 Context。 * 透過對記憶做 RAG,將記憶儲存在外部(如硬碟),只在必要時搜尋出最相關的記憶。 * *史丹佛小鎮案例:* Agent 的瑣碎記憶(如「桌子、床、衣櫃、冰箱沒發生任何事」)儲存在硬碟中。 * *記憶評分標準:* 判斷記憶重要性可依據三個指標: * **最近性 (Recency):** 越近發生的事分數越高。 * **重要性 (Importance):** 記憶剛生成時,Agent 需反思其重要性(如「有人跟他告白」重要性為 9,「有張床」重要性為 0)。 * **相關性 (Relevance):** 記憶與當前問題的相關程度。 * *負面範例的傷害:* 實驗顯示,如果給模型過去**答錯的記憶**,模型的表現反而會大幅受損;只給答對的記憶表現最好。給予負面例子可能就像是叫人「不要想白熊」,反而更容易想到。 **B. 壓縮 (Compression)** 1. **原理:** 當 Context Window 被塞滿時,將過去的歷史記錄進行**摘要或壓縮**。 2. **遞迴式壓縮 (Recursive Compression):** * 使用一個專門做摘要或壓縮的 LM,讀取過去的歷史記錄,只抽取最關鍵的部分,當作長期的、概略的歷史記錄。 * 可以設定每互動 100 次或 Context 達到 90% 飽和時,就進行一次壓縮。 * 越久遠的記憶會隨時間慢慢消失。 3. **應用:** * **Chatbot 記憶:** ChatGPT 的記憶系統可能有兩種,一種是明確記錄的筆記本(永不消失),另一種是會隨時間慢慢消失的記憶,可能就是利用類似遞迴式壓縮技術。 * **Computer Use 摘要:** 在 Computer Use 過程中會產生大量瑣碎的互動細節(如滑鼠移動、彈出廣告後按 X)。這些細節應被壓縮,只需保留最終結果(如「A 餐廳訂位成功,9 月 19 號下午 6 點,10 個人」)。 4. **壓縮與儲存:** 如果擔心摘要會丟失關鍵資訊,可以在摘要前將完整的內容存入可長期儲存的外部空間(如硬碟),日後需要時再用 RAG 讀取。 **C. 多代理人 (Multi-Agent) 設計** 1. **原理:** 讓多個 Agent 各司其職(如 Context EngineeringO、Programmer、Tester),每個 Agent 負責一部分工作。 2. **Context 管理優勢:** Multi-Agent 系統是管理 Context 的有效方法,即使 Agent 沒有不同的專長,也能帶來幫助。 * **Context 分段:** 複雜的任務(如組織出遊,需規劃行程、訂餐廳、訂旅館)會產生大量 Computer Use 互動,快速塞爆單一 Agent 的 Context。 * **分工與隔離:** 透過多 Agent 分工,總招 Agent 只需知道「餐廳訂好了」和「旅館訂好了」,而不需要知道訂位或訂房過程中的所有細節。 * 負責訂餐廳的 Agent 不需知道訂旅館的事,反之亦然。每個 Agent 的 Context 裡都只包含與自己任務相關的內容,使其 Context 保持較短和高效。 3. **學術界應用:** * **撰寫 Overview Paper:** 寫一篇綜述論文需要閱讀上百上千篇論文。如果讓一個單一 Agent 閱讀所有文獻,會超出 Context Window 上限。 * 可採用 Multi-Agent 設計,讓不同的 Agent 閱讀不同的論文,各自寫出摘要,最後再交由一個總負責的 Agent 撰寫最終的 Overview Paper。 4. **性能比較:** 在任務比較簡單時,Single Agent 表現可能比 Multi-Agent 好。但當任務**非常複雜**時,Multi-Agent 能佔到巨大的優勢。