~/blog/hermes-learn-self-authored-skills

從 0 開始的 AI Agent 生活 · part 17

[Agent 進階 #17] Hermes 的 /learn:讓一隻本地 27B 把「做過的事」自己寫成可重用技能

cat --toc

TL;DR

Hermes 有個叫 /learn 的指令,能把「你做過的事」自動寫成一份可重用技能。這篇我把它接上自己的艦隊實測:丟一張 Kanban 卡,讓一隻跑在改裝 2080 Ti 上的本地 27B,3 分鐘蒸餾出一份合格的 SKILL.md——遊戲迴圈、固定時間步、碰撞偵測一應俱全。重點不是它會寫遊戲,是你的艦隊開始自己累積能力。附帶兩個文件沒講清楚、實作才會踩到的細節。

少年看著一隻白藍發光的小機器人,在黃昏藍紫的光暈裡,用一支發光的筆在技能筆記本上書寫

白話版:/learn 讓助理把「做過的事」記下來

上一篇,我把同一句「做一個俄羅斯方塊」丟給三隻分身,各寫各的,我一行遊戲程式碼都沒碰。很爽——但有個盲點:每一次都是從零開始。下次想做別的小遊戲,分身又得重新摸索一遍遊戲迴圈、碰撞、輸入處理。人類不是這樣學東西的:你做過一次,會把「怎麼做」收進腦袋,下次直接套。

Hermes 的 /learn 就是要補上這一步。 它在 2026 年 6 月下旬亮相(Nous 6/23 對外宣布、隔天就有人在玩)——我也是滑到一則推文才注意到的:有人示範 /learn 把一個設計稿吃進去,自動變成一個「照這風格設計」的可重用技能。我第一個反應是:這功能我自己的艦隊不就有嗎?

翻了一下我那台跑 Hermes v0.17 的機器,/learn 真的就躺在程式碼裡。於是我決定拿它做個實驗——叫一隻本地分身用 /learn 去「學會做網頁小遊戲」,看它能不能把上一篇那種一次性的產出,蒸餾成一份下次能直接拿來用的技能。

用 /learn 把做過的事蒸餾成可重用技能:一張 Kanban 卡寫成 /learn 的意圖 → 派給本地 27B 的 hina → 產出一份 SKILL.md

/learn 到底是什麼(不是雲端魔法)

很多人聽到「AI 自己寫技能」會以為背後有什麼神祕的大模型引擎。沒有。/learn 樸實到有點反高潮:

你給它一句話描述來源(一個資料夾、一個網址、「我們剛剛做的事」、或一段貼上的筆記),它就建一段「標準導向的指示」,丟給正在跑的 agent。agent 用它本來就有的工具——讀檔、搜尋、抓網頁——把素材蒐集起來,然後寫出一份 SKILL.md

關鍵在「用它本來就有的工具」這句:沒有獨立的蒸餾引擎、不是另外掛一個蒸餾用的模型或服務——它就是 agent 自己用一個普通回合把技能寫出來(所以還是有一次正常的模型花費,只是沒有第二套引擎)。也因為這樣,不管你從桌面版聊天框、終端機、手機端、還是網頁後台打 /learn,底層走的都是同一個蒸餾指示(build_learn_prompt),不是每個介面各做一套。

而它寫出來的不是隨便一份筆記,是有嚴格規格的:技能名稱要小寫加連字號、說明要一句話、區塊也有固定順序(何時用、步驟、已知陷阱、如何驗證……這幾塊)。這套規格就是 Hermes 自己維護技能時的「家規」,/learn 直接照著寫,所以產出風格一致,不會每隻分身各寫各的格式。

我的實驗:派一隻 27B 去「學做網頁遊戲」

這裡有個小插曲,也是這篇的第一個「只有實作過才知道」的點。

/learn 是個斜線指令(slash command),設計上要在互動式的聊天對話裡打——它會把指示塞進目前對話的輸入佇列。但我不想坐在終端機前面盯著一隻分身慢慢做。我要的是上一篇那種「丟一張卡、它自己做、做完回報」的派工模式。

於是我把卡片的內容直接寫成 /learn 的內部意圖——「用 skill_manage 寫一份符合 Hermes 規格的 SKILL.md,主題是『如何用單一 HTML 檔做一個俯視角倖存者遊戲』」——派給 hina(我那隻跑在改裝 2080 Ti 22GB 上的本地 Qwen 27B 模型,在上一篇露過臉)。

結果它就跑了。3 分 24 秒、25 個回合、狀態 done。 我全程沒進過那隻分身的聊天視窗。產出落在:

~/.hermes/profiles/hina/skills/single-file-web-game/SKILL.md   (5538 bytes)

打開來看,開頭的設定區(frontmatter)長這樣:

name: single-file-web-game
description: Build a playable top-down arcade game in one HTML file.

那句說明剛好 55 個字元(等一下會講為什麼這個數字很重要)。內文照規格分了四段,而且——內容是真的對,不是敷衍灌水的廢文。節錄它寫的「步驟」與「陷阱」:

步驟

  1. 骨架:最小的 HTML5 結構(DOCTYPE、viewport、全螢幕 canvas、內嵌 CSS/JS)。
  2. 縮放處理:用 setTransform(dpr,...) 處理高解析度螢幕與視窗縮放。
  3. 固定時間步的遊戲迴圈:requestAnimationFrame,把每幀 delta 上限壓在 50ms,避免「死亡螺旋」。
  4. 狀態機:MENU / PLAYING / LEVELUP / GAMEOVER
  5. 實體池:用陣列,刪除時反向迭代
  6. 輸入:鍵盤、觸控(虛擬搖桿)、滑鼠點擊。
  7. 敵人生成:從畫面邊緣依計時器生成、難度遞增。
  8. 圓形碰撞偵測。…

陷阱

  • 死亡螺旋:把 dt 上限壓在 0.05 秒。
  • 觸控事件:{passive:false} + preventDefault()
  • 音訊自動播放:第一次點擊/觸控才初始化。
  • Retina 模糊:DPR 縮放 + setTransform。
  • 陣列改動:splice 時反向迭代。

這些全是寫過 canvas 遊戲的人才會踩、才會記得的細節。一隻改裝顯卡上的本地 27B,沒連任何雲端大模型,3 分鐘把它整理成一份下次能直接套的技能——這就是我想驗證的事。

深夜書桌:一隻小機器人在檯燈下,胸口的顯卡發著暖光,把剛學會的東西寫進筆記本

兩個文件沒講清楚、實作才會踩到的細節

進階軌的價值就在這種地方:照著教學跑一遍是一回事,真的把它接進自己的艦隊,你才會撞到文件沒講的東西。

雷一:斜線指令要互動對話,但派工也能蒸餾。 前面提過了。如果你照字面理解「/learn 是聊天指令」,你會以為一定得人在現場。其實底層的「用 skill_manage 寫 SKILL.md」是個普通的 agent 回合,完全可以當成 Kanban 卡派出去。這代表你可以「叫某隻分身去學一個技能」,然後去做別的事,跟派它做任何任務沒兩樣。

雷二:技能跟著各自的「Hermes home」走,艦隊裡每隻分身各存一份。 技能永遠寫在 $HERMES_HOME/skills(原始碼 get_skills_dir() = get_hermes_home()/"skills")。單一助理的預設 HERMES_HOME 就是 ~/.hermes,所以官方文件說「技能寫到 ~/.hermes/skills/」——在單一 profile 下完全正確。但 fleet 裡每隻分身跑在自己的 Hermes home(一個 profile)底下,hina 的就是 ~/.hermes/profiles/hina,所以它的技能落在:

~/.hermes/profiles/hina/skills/single-file-web-game/SKILL.md
                    ^^^^^^^^^^^ hina 自己的 Hermes home,不是預設的 ~/.hermes

含意很實際:hina 學到的這個遊戲技能,光羽、霧羽、預設分身預設都看不到——不是文件寫錯,是技能跟著各自的 home 隔離。要全艦隊共用,不必手動搬:設定檔裡有個 external_dirs,把一個共享技能目錄掛給每隻分身就行(注意它是「共享外部目錄」,不是防寫保護——要真的唯讀得靠檔案系統權限)。真正的坑是:你若在預設的 ~/.hermes/skills/ 找某隻分身學的技能,會撲空——先搞清楚那隻分身的 Hermes home 在哪。

一個你會踩的小坑:說明必須 ≤ 60 字元

還記得 hina 那句說明剛好 55 字元嗎?這不是巧合,是規格硬性要求,而且理由很硬核:

系統提示裡有一份「技能索引」,每一次對話都會載入,而它把每個技能的說明截在第 60 個字元。超過的部分在索引裡會默默被截掉——技能還在、你仍能用名字或斜線指令叫它,但 agent 自動選技能時容易漏掉它

先講清楚:skill_manage 本身其實容許到 1024 字,≤60 字不是硬性驗證,是 /learn 幫你顧的 authoring 標準——因為進得了那份「每次載入的技能索引」、agent 才有機會自動命中。所以「說明一句話、≤60 字元、句點結尾、不要行銷詞」不是龜毛的格式潔癖,它直接影響這個技能會不會被自動選到/learn 在指示裡就把這條塞給 agent,要它寫完自己算字元數。hina 算過了,55 字,過關。這種「規格即命中率」的細節,正是把技能系統做得能規模化的地方。

這代表什麼:一支會自己長本事的艦隊

把這幾篇連起來看,軌跡很清楚:

  • #10:一個人養一群分身。
  • #15:用 Kanban 看它們在幹嘛。
  • #16:派工,讓它們一次性產出東西。
  • 這篇 #17:讓它們把產出蒸餾成可重用技能——下次更快、更一致。

從「會做事」到「會把怎麼做記下來」,這一步讓艦隊從一群執行者,變成一群會自己累積能力的執行者。而且整件事跑在我自己機器上的本地模型,沒有任何一行送進雲端。

當然,要誠實講限制,不然就成了吹捧:

  • 跨分身要設定共享:一隻學的技能預設別隻看不到;要全艦隊共用,得用 external_dirs 掛一個共享目錄(要真唯讀靠檔案系統權限),不是自動的。
  • 技能品質吃模型:hina 這次表現好,但換一隻更弱的模型,或主題更刁鑽,產出可能就需要人工修。/learn 是起點,不是終點。
  • 這比較是給想動手玩、愛折騰的人:多數人一隻助理就夠用,根本不需要讓它自學技能。這篇是寫給「想把艦隊玩出花」的人。

帶走的三個重點

  1. /learn 不是雲端魔法,是 agent 用自己的工具把經驗寫成一份規格化的 SKILL.md;桌面/終端/手機/網頁同一條路。
  2. 它可以派工:不必坐在聊天視窗,把蒸餾意圖寫成 Kanban 卡,丟給有空、夠強的分身就行。
  3. 技能跟著各自的 Hermes home 走(fleet 裡是 ~/.hermes/profiles/<分身>/skills/,不是預設的 ~/.hermes/skills/);跨分身共用改用 external_dirs;說明 ≤60 字元才進得了每次載入的技能索引、才會被自動選到。

這篇是「養了一群會做事的分身之後,讓它們開始自我增能」的續集。前情提要:

常見問題

Hermes 的 /learn 指令到底在做什麼?
它把你描述的來源——一個資料夾、一個網址、剛剛這段對話、或一段貼上的筆記——交給 agent,讓它用自己本來就有的工具(讀檔、搜尋、抓網頁)蒐集素材,然後寫出一份符合標準格式的 SKILL.md。沒有獨立的引擎,就是 agent 自己用一個普通的回合,把經驗整理成可重用的技能。
一定要坐在 Hermes 的聊天視窗裡打 /learn 嗎?
不用。斜線指令本身需要一個互動式的聊天對話,但底層的蒸餾機制(用 skill_manage 寫 SKILL.md)只要當成一張 Kanban 卡派給某隻分身就會跑。我這篇就是派工給一隻本地分身,它自己做完回報,我全程沒坐在它前面盯著。
一隻分身學到的技能,其他分身用得到嗎?
預設看不到。技能寫在各自的 Hermes home 底下(艦隊裡就是 ~/.hermes/profiles/你的分身/skills/),所以一隻一份。要讓整支艦隊共用,不用手動搬——設定檔裡的 external_dirs 可以掛一個共享技能目錄給每隻分身(要真唯讀靠檔案系統權限)。真正要注意的是:別跑去單一 profile 的預設路徑 ~/.hermes/skills/ 找某隻分身學的技能,會撲空,先搞清楚那隻的 Hermes home 在哪。

不想錯過新文章?

訂閱我確保不漏接!

隨時一鍵退訂。