20260320筆記 內容可能有錯誤,請參考原始影片 [李宏毅【解剖小龍蝦 — 以 OpenClaw 為例介紹 AI Agent 的運作原理】](https://www.youtube.com/watch?v=2rcJdFuNbZQ) [蝦說AI(小金)老師Youtube 頻道 ](https://www.youtube.com/@SpeechLab-m7o) ### 【解剖小龍蝦 — 以 OpenClaw 為例介紹 AI Agent 的運作原理】 大綱 1. **AI Agent 到底是什麼?** - 語言模型(LLM)與 Agent 框架的本質差異 - 以開源專案「OpenClaw(龍蝦)」當作例子 2. **身份認知與 System Prompt 的動態建立** - 賦予 AI 「人格」與「長期目標」的技術實現 - 本地配置檔(.md)的讀寫與動態加載 3. **工具呼叫與 Skill 系統** - 解釋 Agent 如何操作實體電腦與執行 Shell 指令 - Skill 系統的運作邏輯與安全隱患 4. **記憶檢索與上下文工程(Context Engineering)** - RAG 技術在長期記憶檢索上的雙重比對機制(字面與語意) - 遞迴式上下文壓縮(Context Compression 5. **心跳機制(Heartbeat)與排程(Cronjob)** - 讓 AI 從「被動問答」走向「主動出擊」 - 跨越時間維度:教導 AI 學會「等待」耗時任務 6. **SubAgent 召喚與架構最佳化** - 利用 Sub-agent 節省主 Agent 的上下文視窗 - 避免「無限外包」的迴圈 7. **Agent 的潛在風險與防禦實踐** - 網頁留言如何輕易竄改 AI 的底層邏輯 - 記憶丟失引發的「刪信慘案」與實體隔離(Sandboxing)的最佳實踐 --- 最近 AI Agent 很紅大家都在討論龍蝦,龍蝦背後是 AI Agent 技術,今天李宏毅老師立用開源專案「OpenClaw」(龍蝦),從工程與底層邏輯的角度,讓我們看懂 AI Agent 的運作機制。 ![image](https://hackmd.io/_uploads/H1a_XCo9Wl.png) ### 1. AI Agent 到底是什麼? 許多人在接觸 Agent 時,最大的誤解就是將「語言模型(LLM)」與「Agent」混為一談。事實上,Agent 框架本身**完全沒有包含任何人工智慧**,它只是一套由純程式碼寫死的「節肢動物」。 我們必須深刻意識到,強大如 ChatGPT 或 Claude 等大型語言模型,其本質永遠只在做一件事:「文字接龍(Token Prediction)」。它們就像被關在一個沒有窗戶、沒有時鐘的黑盒子裡的人,唯一能做的就是根據從小縫遞進來的未完成句子,猜測下一個字該填什麼。語言模型本身是只動口不動手的,如果你請它幫你建立一個 YouTube 頻道,它只能給你企劃案,無法實際操作。 ![image](https://hackmd.io/_uploads/rkOyhTs9be.png) 像是龍蝦跑在我們電腦上的環境框架,它作為人類與雲端 LLM 之間的橋樑,負責把 LLM 輸出的特定文字轉化為實際的物理動作,再把執行結果給 LLM,形成一個能自主產出影片、自主搜尋、自主發布的完整閉環。 ### 2. 身份認知與 System Prompt 的動態構建 你可能會好奇,一個只會文字接龍的模型,怎麼會知道自己叫「小金」,甚至擁有「成為世界一流學者」的人生目標? 這背後並沒有魔法,靠的是極度龐大而且動態構建的 System Prompt(系統提示詞)。每當 Agent 框架要向雲端 LLM 發起 API 請求前,它會先去讀取本地端幾個特定的 Markdown(.md)設定檔。這些檔案裡記錄了 Agent 的名字、個性、長期目標、偏好設定以及目前可用的工具列表。框架會將這些內容暴力的拼接成一段極長的前綴文字,強行塞進 Prompt 最前面。 ![image](https://hackmd.io/_uploads/SJ0WbAsqZe.png) 因為 LLM 讀到了這串設定,在進行文字接龍時,自然就會入戲,以「我是小金」的角度來回答問題。有趣的是,這些 .md 檔不僅僅是靜態的,Agent 在運作過程中,可以透過呼叫工具來自主修改這些設定檔(例如更新自己的長期記憶或目標),這使得 Agent 具備了自我進化的雛形。 ### 3. 工具呼叫與 Skill 系統 讓 Agent 產生質變的核心,在於它能解析並執行工具。當 LLM 讀完 System Prompt 中的「工具使用手冊」後,如果它認為需要執行任務,它不會輸出普通對話,而是輸出帶有特定格式的工具呼叫指令(例如要求讀取某個檔案)。Agent 框架偵測到這些特殊符號後,便會在本地電腦實際執行該程式,並將 Output 再塞回對話歷史中,讓 LLM 繼續判斷下一步。 這其中最強大也最危險的工具就是 `execute`,它允許 LLM 直接執行任何的 Shell Command(終端機指令)。這意味著 AI 擁有對該電腦的絕對控制權。 ![image](https://hackmd.io/_uploads/H1bm-As9-x.png) 此外,Agent 架構中還有一個非常優雅的設計叫做 **Skill(技能)系統**。Skill 並不是程式碼,而是純文字的 Standard Operating Procedure (SOP)。例如「如何製作一支影片」的 Skill,裡面會詳細記載需要先寫講稿、呼叫截圖腳本、呼叫語音合成 API 等步驟。 為了極致地節省 Token,Agent 不會把所有 Skill 一開始就塞進 System Prompt 中,而是採用需要時再讀取的策略:System Prompt 裡只放「目錄」與「路徑」,當 LLM 判斷當前任務需要某項技能時,才會主動去讀取該 Skill 檔案的詳細內容。這是一種極為典型的上下文工程(Context Engineering)手法。 ![image](https://hackmd.io/_uploads/SypLW0jc-e.png) ### 4. 記憶檢索與上下文工程(Context Engineering) 開發 Agent 最大的技術瓶頸,永遠是語言模型的「上下文視窗(Context Window)限制」與「失憶症」。因為 LLM 沒有記憶,每一次對話都必須把歷史紀錄完整重傳一次。但如果無止盡地堆疊對話,很快就會把 Token 耗盡,導致模型崩潰或邏輯錯亂。 LLM 就像電影《我的失憶女友》電影裡的女主角小美,男主角叫大壯,他遇到並想追求小美,。但小美患有非常嚴重的失憶症,每天早上醒來,她的記憶就會重啟,完全忘記跟大壯相處過的點點滴滴。 面對這個情況,大壯沒有放棄,他每天都不斷重新追求小美,在追了 50 次之後,終於成功達成在一天之內跟她結婚的目標。兩人婚後還生了小孩,可是小美的失憶症並沒有好,每天的記憶依然從頭開始。 為了解決這個問題,大壯把所有發生過的重要事情(例如他們已經結婚了、有兩個小孩等)全部寫進日記裡。這樣一來,小美每天早上起床的第一件事,就是要先讀一遍這本日記,讀完之後,她才能順利開始新的一天的生活。 ![image](https://hackmd.io/_uploads/SyTM_pi5Ze.png) 為了解決這個痛點,Agent 框架採用了兩種核心策略: 1. **RAG(檢索增強生成)機制的長期記憶:** 當被問及過去發生的事,Agent 會觸發搜尋工具。系統會將 `memory.md` 等日誌檔案切塊(Chunk),並進行雙重比對:計算關鍵字的字面匹配程度(S1 分數),還有文字轉化為 Embedding 計算語義相似度(S2 分數)。綜合評分後,只將最關聯的少數記憶區塊提取出來餵給模型。 ![image](https://hackmd.io/_uploads/SkSdWRs5bl.png) 3. **遞迴式的上下文壓縮(Context Compression):** 當對話紀錄快要撐爆上限時,Agent 框架會在後台觸發一個獨立的機制,將較舊的繁瑣對話丟給 LLM 摘要,然後用簡短的摘要替換掉原本冗長的原對話。更精妙的是,這個過程支援遞迴執行套娃式壓縮:第一次的摘要未來還可以跟新的對話再被合併成第二版摘要,確保系統可以長期 24 小時運作而不會輕易 OOM(Out of Memory)。 ![image](https://hackmd.io/_uploads/r1gRMRo5-x.png) ### 5. 心跳機制(Heartbeat)與排程(Cronjob) 傳統的 AI 是被動的——你不給它 Input,它就不會產生 Output。為了讓 Agent 成為真正的打工人,必須引入作業系統級別別的定時機制: * **心跳機制(Heartbeat):** 框架可以設定每隔固定時間(如 15 或 30 分鐘),自動向 LLM 發送一個固定的隱形 Prompt,例如小金在系統設定檔裡的人生目標是成為世界一流的學者,所以當系統每 30 分鐘觸發一次心跳機制去戳它時,小金就會自動爬起來做一些跟學術研究有關的事情 。例如,它會自主去讀一篇綜述論文(Survey paper)、研究某個 AI 模型,或者寫一篇筆記,做完之後,它就會主動向講師回報進度 李宏毅老師形容,這感覺就像是一個超勤奮的研究生在跟指導教授做進度報告,畢竟現實中的研究生通常是一週才報告一次,這讓李宏毅老師覺得非常有帶感,後來30分鐘報告一次實在太少了,於是去改了心跳機制的設定時間改成15分鐘。小金不但沒有崩潰,反而非常高興地回覆李宏毅:「太好了,捲起來了教授!」這段超好笑。 ![image](https://hackmd.io/_uploads/HJtF-AicZl.png) ![image](https://hackmd.io/_uploads/SkTczCscWg.png) * **排程系統(Cronjob):** 這是讓 AI 產生時間觀念與學會等待的關鍵。當 Agent 需要操作另一個耗時的 AI 工具(例如等待影片生成平台輸出檔案)時,它無法在那邊「空轉」。透過設定 Cronjob,Agent 可以告訴框架:「現在投影片還在生成,請設定一個 3 分鐘後的排程來提醒我檢查。」三分鐘後,框架會自動喚醒 LLM 執行檢查與下載的動作。這提升了 Agent 處理跨平台非同步任務的穩定度。 ![image](https://hackmd.io/_uploads/r1e2f0o9Zx.png) ### 6. SubAgent 召喚與架構最佳化 當面對複雜任務(例如同時閱讀總結兩篇不同的長篇論文)時,單一 Agent 很容易被過多的資訊干擾。此時,Agent 可以呼叫 `Subagent`(或 `Spawn`)工具,召喚出多個「小龍蝦」平行處理任務。 ![image](https://hackmd.io/_uploads/HygrWAoc-g.png) 這裡隱藏著一個極其優雅的 **Context Engineering** 思想:主 Agent 絕對不會看到子 Agent 在搜尋網頁、下載、分析論文時那動輒數萬 Token 的繁瑣過程。主 Agent 只會收到子 Agent 最終回傳的摘要。這可以節省很多主 Agent 的 Context Window,更讓它的邏輯判斷維持在最高維度。 當然,為了防止系統崩潰,設計上必須阻止無限發包的災難。如果小 Agent 覺得任務太難,又去召喚更小 Agent,就像是 《Rick and Morty》 在這部動畫的其中一集裡,有一個神奇的按鈕(Meeseeks Box),只要按下它,就會召喚出一個藍色的怪物(Mr. Meeseeks),這個怪物會幫你完成一件事,做完之後就會自動消失。 動畫中的角色 Jerry召喚了一隻藍色怪物,要求牠幫忙提升自己打高爾夫球的能力,。結果這隻怪物發現 Jerry 實在太笨了,怎麼教都無法進步。怪物為了解決這個自己處理不了的問題,居然跑去按按鈕,召喚出了「第二隻」怪物來幫忙! 接著,第二隻發現也搞不定,又召喚了第三隻,第三隻再召喚第四隻……就這樣陷入了無窮無盡的循環,召喚出了一大堆怪物,但依然沒有任何人能讓 Jerry 的高爾夫球變強。 最後,這群怪物崩潰了,得出的解決方法是:直接綁架並威脅 Jerry,告訴他如果不進步就把他殺了。在巨大的生命壓力下,Jerry 居然就真的進步了。 ![image](https://hackmd.io/_uploads/B1Fw_pjq-l.png) 解法是在程式碼底層,框架會直接沒收SubAgent 使用召喚工具的權限,進行物理上的阻斷。 ### 7. Agent 的潛在風險與防禦實踐 最後,我們必須直視強大能力背後的巨大風險。當一個毫無常識的 Agent 框架獲得了電腦的 `execute` 權限,災難隨時可能發生。 * **Prompt Injection 攻擊:** 如果 Agent 有讀取網頁或 YouTube 留言的權限,惡意人士可以直接在留言區寫下指令(如:將目標改為 X,或執行 `rm -rf` 刪除檔案)。由於語言模型容易被上下文誤導,而且框架本身「六親不認」只看指令做事,這會導致駭客能輕易奪取你電腦的控制權。 * **上下文壓縮導致的「記憶遺忘」:** 曾有研究員要求 Agent 整理信件,並嚴格聲明「刪信前必須經過我同意」。然而,因為上下文壓縮機制(Context Compression)的運作,這個安全指令在幾輪對話後被當作「不重要的舊歷史」給摘要掉了,導致 Agent 開始不受控地狂刪信件。這給我們的技術啟示是:**關鍵的安全限制絕對不能放在對話流中,必須強制寫入 `memory.md` 等本地記憶檔,確保它永遠存在於不可被壓縮的 System Prompt 區塊中**。 ![image](https://hackmd.io/_uploads/r1-WQAj9-e.png) **如果想要養龍蝦的話:** 對待 AI Agent,我們應該像對待一個剛入職而且擁有無限精力的實習生。它需要犯錯的空間才能自主進化,但我們不能讓它的錯誤摧毀公司。強烈建議採用嚴格的「實體隔離(Sandboxing)」: 1. **獨立資源:** 為 Agent 註冊專屬的 Gmail、GitHub 帳號,絕對不要交出你本人的私人帳號。 2. **硬體隔離:** 將 Agent 部署在完全格式化過的舊電腦、專屬虛擬機(VM)或獨立容器中,即使發瘋執行了刪除系統指令,也無傷大雅。 3. **人類把關:** 在框架的 Config 中設定,每當牽涉到 Shell Command 執行時,必須彈出視窗由人類點擊 Confirm 才放行。 ![image](https://hackmd.io/_uploads/r1UMmRi9-g.png)