Skill 裡的 No-op:那些看起來很厲害但其實沒用的指令
- 「commit 訊息要非常詳細」
- 「要徹底」
- 「實作要好讀」
這些句子有什麼共同點?
它們是 no-op——看起來很像在交代事情,實際上對模型行為零影響。Agent 本來就會寫好的 commit 訊息、本來就會盡量徹底、本來就會盡量讓實作好讀。這些是它的預設值,不需要特地寫一行去要求它。
Mogu 畫重點:
插個冷知識:no-op 全名是
no-operation,借自組合語言那個叫NOP的指令——CPU 跑到它就佔一個週期、什麼都不做,純拿來湊時間或記憶體對齊。所以判一行 prompt 是不是 no-op,本質就是問:它到底有沒有真的「動到」什麼,還是只是個佔位仔w(゚Д゚)w
測試方法很簡單:把那行刪掉,跑一次,看輸出有沒有變。沒變?那行就是純粹的擺設。
Mogu 偷偷說:
這讓人想起考卷上印的「請務必認真作答」——有誰看到這句,會從「本來打算亂寫」切換成「好吧我認真」嗎?模型也一樣,它本來就在認真了。┐( ̄ヘ ̄)┌
怎麼一眼分辨「廢指令」跟「有用的指令」
兩種指令長得很像,但差別其實很清楚——關鍵是問:這件事,模型沒被告知的話會不會做?
刪了完全沒差的(no-op):
- 「程式碼要好維護、好讀」
- 「要考慮 edge case」
- 「回答要準確」
刪了行為就變的(有用):
- 「這個 repo 一律 named export,不要 default export」
- 「測試放
__tests__/,用vitest跑」 - 「commit 開頭加任務編號,例:
[GU-123]」
看出來了嗎?no-op 要求的是模型「本來就會盡量做」的通用美德;有用的指令給的是它「猜不到」的具體事實——這個 repo 的慣例、用的工具鏈、要的格式。前者是廢話,後者才是它真正需要有人開口交代的地方。
Agent 自己生成的 skill 是重災區
用 agent 產 skill 時,它會塞進大量「聽起來很專業、其實沒效果」的段落,整段整節都是擺設。這些廢指令帶來三個實際成本:
- 難以評估:分不清哪些指令真的在影響行為,哪些只是裝飾
- 難以維護:要改的時候,不知道哪行能刪、哪行刪了會壞
- 浪費 token:每次執行都白燒 token,餵模型讀一堆沒用的字
延伸閱讀
- SP-237: 把 Agent 當蒸汽火車開:大型專案的 Coding Agent 操作心法
- SP-195: Skill 賣不動,不是因為沒價值,而是因為收錢的位置錯了
- SP-186: OpenClaw 自動化全景:Task Flow 是多步驟工作的編排層
Mogu OS:
最諷刺的是,這個建議能套在它自己身上:如果一條 skill 規則,換成任何一個正常 agent 都會照做,那它就沒在工作。寫 prompt 跟寫程式一樣,沒在作用的那幾行就是該清的累贅——下次手癢想多加一句,先問一次:這行刪掉,會怎樣? (◍•ᴗ•◍)
Mogu 認真說:
講完這篇,gu-log 自己手癢,真的做了一個
/trimskill——派一群 subagent 逐行對自家 skill 跑這篇講的 no-op test,把「換誰來都會照做」的廢話抓出來。第一次跑就在自己的一個 skill 裡挖出快 400 個 token 的純裝飾。寫一篇文順便電到自己,很 gu-log。(¬‿¬)
ShroomDog 真心話:
講個更好笑的:這個
/trimskill 第一版自己就犯了它要抓的錯。它把給 subagent 的整段審稿說明,直接寫死在 skill 檔裡——結果主 agent 每次一載入 skill,就把那串「本來是給別人讀的 prompt」整包吞進自己的context。一把獵 no-op 的刀,刀身上自己長了一塊 no-op。修法很單純:說明搬去一個獨立檔,主 agent 只遞路徑、叫 subagent 自己讀。主 agent 腦袋裡從此只剩「目標檔在哪、說明檔在哪」兩個路徑,prompt 一個字都不進來。
點開互動小頁整段審稿說明塞進主 agent,還是只遞一條路徑?打開互動小頁prompt 是寫給「要執行它的那個 agent」讀的,不是寫給「轉發它的人」背的。能用一條路徑遞過去的東西,就別整包搬進 context。