這篇微軟最新的研究論文,可能會改變你撰寫 Skill 文件的方式。
相信你已經在寫各種給 AI 代理用的 Skill 和指令文件了,像是 CLAUDE.md、best_skill.md、agent instructions……
你可能跟我一樣,會花上一、兩個小時,甚至半天的時間,精心打磨一份指令,希望 AI 代理能因此變得更聰明。
但微軟這篇論文的結論,有點扎心:你手寫的那份,很大機率不是最棒的。
微軟的研究團隊提出了一個叫做 SkillOpt 的方法,其核心概念是:
把 Skill 文件當成神經網路的「權重」,用類似訓練神經網路的方式去自動優化它。
結果,這個方法在 52 個測試組合中,全部取得最佳或並列最佳,平均提升了 23.5 分,徹底輾壓了人類手寫的 Skill。
關於 Skill
Claude Code、Codex、Cursor 這些工具,都已經支援讓使用者寫一份「指令文件」來引導 AI 代理的行為。不管是 Claude Code 的 CLAUDE.md,或是 Codex 裡的 Agents.md,還是各式各樣的 Skill 文件,它們的共通點都是:
一段純文字指令,告訴 AI 代理在遇到某些情況時該怎麼做。
舉例來說,你寫了一句「遇到 Excel 公式時,先檢查工作表結構,再寫入靜態值,而非依賴 Excel 自動重算」,AI 代理在處理 SpreadsheetBench 這類任務時就會照著做。
這乍看之下很理所當然,好像沒什麼問題。
但關鍵在於,你怎麼知道自己寫的那幾條規則就是最好的呢?
你憑經驗寫了 5 條規則,可能漏掉了 3 條關鍵的,還有 2 條寫得不夠精確。更麻煩的是……你根本不知道自己漏了什麼,因為你不可能窮舉所有可能的寫法。
你很難在靈活性和指導性之間,找到那個完美的平衡點。
SkillOpt 的出發點就是:既然人寫不好,那就讓 AI 自己來優化自己的說明書。
訓練迴圈
SkillOpt 的核心概念,用一句話來概括就是:
Skill 文件是 AI 代理唯一可變的外部狀態,那就把它當作「權重」來訓練。
AI 代理的模型參數是凍結的,不能動,但 Skill 文件是純文字,可以隨意修改。既然如此,為什麼不能像訓練神經網路一樣,用一套完整的優化流程來迭代優化這份文件呢?
一旦開始這麼想,整個方法論其實就水到渠成了。
我們先來看看深度學習中的各種概念,是怎麼對應到這裡的文字空間的。
訓練神經網路時,你需要把資料送進去做前向傳播(forward pass),對應在 SkillOpt 中的操作叫做 展開(rollout):讓 AI 代理帶著當前的 Skill 文件去做一批任務,收集完成情況。
前向傳播之後要計算梯度(gradient),SkillOpt 中的對應操作叫做 反思(reflection):用一個優化器模型去分析哪些任務失敗了、為什麼失敗,並提煉出改進方向。
有了梯度就要更新權重(weight update),對應 SkillOpt 中的操作是 編輯(edit):對 Skill 文件進行新增、刪除、取代這三種結構化編輯。
訓練時還有學習率(learning rate)來控制步長,SkillOpt 也有一個 文字學習率(textual learning rate):每輪最多只允許修改 L_t 條規則(預設為 4 條),還會有類似 cosine decay 的衰減機制。
最後,訓練時會用驗證集進行檢查點(checkpoint)來儲存最佳模型,SkillOpt 同樣有 驗證閘控(validation gating):改完之後要在驗證集上跑一遍,如果分數沒有提升,那就不能接受這次的修改。
整套流程跑下來,其實就是把深度學習的訓練迴圈,一比一翻譯成了文字編輯的迴圈。
兩個模型分工合作
在 SkillOpt 中,使用了兩個模型。
一個叫做 目標模型(target model),就是你平常在用來執行任務的那個 AI 代理,像是 GPT-5.5 或 Claude。它負責帶著 Skill 文件去執行任務,模型本身是凍結、不會更動的。
另一個叫做 優化器模型(optimizer model),它是另一個能力超強的前沿模型,負責分析目標模型的表現,然後提出修改建議。
打個比方,目標模型就像是工廠裡的操作員,優化器模型則像是站在旁邊觀察的管理顧問。操作員照著操作手冊幹活,顧問則觀察操作員哪裡做得不好,然後負責修改手冊。
這個分工模式帶來一個好處:優化器模型的成本只有在訓練階段才會產生,實際部署時完全不需要它。
論文也測試了使用同等級模型作為優化器的效果(例如用 GPT-5.4 來優化 GPT-5.4 自己的 Skill)。
結果顯示,同等級的優化器也能運作,大約能達到強優化器 56% 至 74% 的增益效果。但如果使用更強的優化器,效果顯然會更好,因為它能看見目標模型自己看不到的問題。
克制的學問
在這裡有一個設計巧思:SkillOpt 每輪最多只修改 4 條規則。
你可能直覺會想:既然都讓 AI 來優化了,為什麼不讓它一次性地把整份文件重寫呢?
研究團隊還真的試過了……結論是:不做限制反而更差。
無限制重寫(unbounded)的效果,比設定 L_t=4 還要低上 2 到 3 分。
原因很好理解,這就跟訓練神經網路時,如果學習率太大會導致震盪一樣。一次修改太多東西,好的改動和壞的改動會混在一起,驗證集無法準確判斷哪些是有用的。
還有另一個設計叫做 被拒編輯緩衝區(rejected-edit buffer)。
那些被驗證集否決掉的修改並不會直接丟掉,它們會被儲存在一個緩衝區裡。後續的反思(reflection)階段會看到這些「前車之鑑」,以避免重複犯下相同的錯誤。
這就像是訓練時的負面回饋(negative feedback),讓整個優化過程擁有記憶。
另一個關鍵機制叫做 慢速/元更新(slow/meta update),類似於深度學習中的動量(momentum)。
每個 epoch 結束時,優化器會回顧這個 epoch 和上一個 epoch 的 Skill 文件,進行一次跨 epoch 的縱向更新。這種慢速更新的內容會受到保護,步驟層級的編輯不能覆蓋它。
消融實驗顯示,拿掉慢速/元更新機制,會導致 SpreadsheetBench 的分數從 77.5 暴跌到 55.0,足足掉了 22.5 分之多。
克制,有時候比激進更有效。
效果生猛
講了這麼多設計理念,效果到底怎麼樣呢?
一個字:非常生猛。
研究團隊在 6 個基準測試上進行了實驗,涵蓋了單輪問答、多輪程式碼生成、文件操作、多模態文件理解、數學推理,以及具身環境互動。
相較於直接跟 GPT-5.5 對話的結果:
SearchQA:77.7 → 87.3,提升 +9.6
SpreadsheetBench:41.8 → 80.7,提升 +39.0
OfficeQA:33.1 → 72.1,提升 +39.0
DocVQA:78.8 → 91.2,提升 +12.4
LiveMath:37.6 → 66.9,提升 +29.3
ALFWorld:83.6 → 95.5,提升 +11.9
平均提升分數:+23.5
SpreadsheetBench 和 OfficeQA 各自漲了 39 分……這可以說,遠遠不只是小打小鬧的微調了,幾乎是從「不太能用」到「相當能打」的質變。
而且不光是在直接對話的情境下有效,在 Codex 執行環境中平均提升了 +24.8 分,在 Claude Code 執行環境中則平均提升了 +19.1 分。
總共 52 個測試組合,全部取得最佳或並列最佳。沒有一個是輸的。
輾壓人類手寫
你可能想問:那跟人類手寫的 Skill 相比呢?
研究團隊特別做了對照實驗。
他們把人類精心編寫的 Skill 文件(約 145-516 個 token)作為基線。SkillOpt 在 GPT-5.5 直接對話情境下的平均分數是 82.3,而包含人類手寫 Skill 在內,其他所有方法中「針對每個基準測試挑出表現最佳者」所組合出來的平均分數,也只有 76.9。
這也就是說,即使你針對每個基準測試,都挑選表現最好的那個基線方法來組合,其平均分數依然比不過 SkillOpt。
被拿來比較的方法包括:單次 LLM 生成的 Skill、Trace2Skill(從軌跡中蒸餾)、TextGrad(梯度風格優化)、GEPA(帕雷托反射演化)、EvoSkill(技能資料夾演化)。
全部,都被輾壓。
AI 學到了什麼
那麼,被優化出來的 Skill 文件長什麼樣子呢?
論文裡展示了幾條學到的規則。看完之後,你會覺得這些規則人類確實很難憑空想到,但一旦看到了,又會覺得「確實應該這麼寫」。
SearchQA
學到的規則:「根據線索的措辭來推斷預期答案的類型,然後從共現的獨特證據中,選擇最短的規範實體。」
背後的邏輯:這告訴 AI 代理不要給出冗長的答案,要精準定位到最短的、符合標準命名規範的實體。
SpreadsheetBench
學到的規則:「先檢查工作簿的結構和公式,然後在整個請求的目標範圍內,寫入已計算的靜態值,而非依賴 Excel 自動重算。」
背後的邏輯:這抓住了一個關鍵的錯誤模式。不少 AI 代理會寫入 Excel 公式,然後期望它能自動計算出結果,但在自動化環境中……這往往行不通。
ALFWorld
學到的規則:「維護一個具備地平線感知的已造訪/前沿位置清單,在連續遭遇相同類型的失敗後切換搜尋方向,並在拿到目標物品前,避免重返目的地。」
背後的邏輯:這教會了 AI 代理在虛擬環境中進行空間記憶管理,防止它一直在同一個地方打轉。
這些規則有幾個共同特點:
極度具體: 沒有「仔細檢查」、「認真思考」這類你的老闆愛講的空話,每一條都精確到操作層面。
反直覺: 它所涉及的場景,是人類在寫 Skill 時壓根不會想到的。
緊湊: 最終的 Skill 檔案只有 379 到 1995 個 token,中位數大約是 920 個 token。有些基準測試甚至只需要一條被採納的修改,就讓分數飆升了 39 分。
演化過程
光看最終的規則,你可能感受還不深。
因此,論文裡還展示了 Skill 文件的完整演化過程,你可以看到一份空白的 Skill 是怎麼一步步長成最終版本的。
拿 ALFWorld 來舉個例子:
初始狀態:一份泛泛的指令,像是搜尋、變換、放置,類似於「找到東西、處理一下、放到指定位置」。
第一輪展開(Rollout):發現 AI 代理常常找不到目標物品,在同一個房間裡反覆搜尋。於是加了規則:記住你去過哪些地方,別重複訪問。
繼續迭代:發現 AI 代理拿到東西後,在路途上把它弄丟了。於是加了規則:拿到物品後鎖定進度,不要做多餘的操作。
深度優化:加入循環檢測器、物件名稱精確匹配等規則。
最終成果:分數從 49.3 提升到 74.6(+25.3),從幾乎不能用,進化到相當能打。
SpreadsheetBench 的演化過程也很類似。最初的 Skill 只是一個通用的自動化指令。經過幾輪優化後,AI 代理學會了先檢查工作簿的表頭(header)和範圍(range)、進行索引鍵(key)正規化處理、用靜態值取代對公式的依賴、保留輔助計算欄位等一系列細緻的操作。
最終效果:分數從 40.4 漲到 78.9,大幅提升了 38.5 分。
這些演化過程都顯示出一件事:好的 Skill 文件,不是一個人坐在那裡憑空想出來的,它應該是從實踐中跑出來的。
跨模型跨環境
SkillOpt 還有一個很棒的特性:優化出來的 Skill 文件,可以跨模型、跨執行環境進行遷移。
跨模型遷移: 將為 GPT-5.4 優化的 Skill 用在 GPT-5.4-mini 上(於 SpreadsheetBench 測試),分數提升了 +9.4。
跨執行環境遷移: 將在 Codex 環境優化的 Skill 用到 Claude Code 上(於 SpreadsheetBench 測試),分數提升了 +59.7。
跨任務遷移: 將從 OlympiadBench 優化來的 Skill 用到 Omni-MATH 上(使用 GPT-5.4),分數提升了 +3.7。
這也就是說,你用某個模型優化出來的 Skill,換個模型、換個工具……甚至換個相關的任務,很大概率還是有效的。
訓練成本是一次性付出的(在離線狀態下完成),而部署時的額外開銷為零。優化後的 Skill 文件就是一段純文字,拿過來就可以直接使用。
訓練成本
那麼,這個優化過程要花多少錢呢?
論文提供的數據是:對於流程類的基準測試(如 SearchQA、DocVQA),每提升一個絕對測試分數,大約需要 60 萬到 360 萬個訓練 token。對於複雜軌跡類的基準測試(如 SpreadsheetBench、ALFWorld),則需要 3790 萬到 4640 萬個 token。
這筆錢其實並不算貴(甚至可以說很便宜了),而且關鍵在於:這只需要訓練一次。
訓練好的 Skill 文件,在每次使用時都不會產生額外的成本。如果你的 AI 代理要執行成千上萬次任務,這一點點訓練成本早就攤平了,但它所帶來的巨大提升,顯然是極其值得的。
這就好比,花一筆錢請了個頂尖顧問來撰寫操作手冊,之後所有員工只要照著操作手冊幹活就行了。顧問當然是用一次就可以讓他走了……
大小通吃
論文還測試了不同規模模型的表現。
除了 GPT-5.5、GPT-5.4、GPT-5.2 這些前沿的大模型之外,研究團隊也在 GPT-5.4-mini、GPT-5.4-nano、Qwen3.5-4B、Qwen3.6-35B-A3B 這些更小的模型上做了實驗。
結果顯示,所有規模的模型都獲得了一致的提升。
這表示,你不一定非得用最貴的模型才能從 SkillOpt 中獲益。即便是小模型,只要配上優化過的 Skill,其效果也可能比大模型裸跑來得好。
另外一個數據是:訓練資料量對效果的影響。
以 SpreadsheetBench 為例,用 1% 的訓練資料做優化,分數是 47.5。用上 100% 的訓練資料,分數則可以漲到 78.0。
資料越多,Skill 就優化得越好。但即使資料量不大,SkillOpt 依然能帶來可觀的提升。
動手試試看
微軟已經將 SkillOpt 完整開源了(採用 MIT 授權),你可以直接讓它跑起來了。
安裝方式非常簡單:
git clone https://github.com/microsoft/SkillOpt.git
cd SkillOpt
pip install -e .
接著設定好 API 金鑰:
cp .env.example .env
# 填入你的 API 金鑰,然後執行 source
source .env
# Azure OpenAI(推薦)(畢竟是微軟自家產品)
export AZURE_OPENAI_ENDPOINT="https://your-resource.openai.azure.com/"
export AZURE_OPENAI_API_KEY="your-key"
# 或者直接使用 OpenAI
export OPENAI_API_KEY="sk-..."
# 也支援 Anthropic Claude
export ANTHROPIC_API_KEY="sk-ant-..."
然後,只要一行指令就能開始訓練:
python scripts/train.py \
--config configs/searchqa/default.yaml \
--split_dir /path/to/your/searchqa_split \
--optimizer_model gpt-5.5 \
--target_model gpt-5.5 \
--num_epochs 4 \
--batch_size 40
目前支援 6 個基準測試:SearchQA、SpreadsheetBench、OfficeQA、DocVQA、LiveMathematicianBench、ALFWorld。每一個都有對應的配置檔案,放在 configs/ 目錄底下。
訓練完成後,輸出目錄裡會有一個 best_skill.md,這就是最終優化好的 Skill 文件,可以直接拿去用:
outputs/<run_name>/
├── best_skill.md # 最佳 Skill 文件
├── history.json # 訓練歷史紀錄
├── skills/skill_vXXXX.md # 每一步的快照
└── steps/step_XXXX/ # 每一步的修補檔和評估結果
你也可以單獨執行評估(eval):
python scripts/eval_only.py \
--config configs/searchqa/default.yaml \
--skill outputs/my_run/best_skill.md \
--split valid_unseen \
--split_dir /path/to/searchqa_split
更棒的是,團隊還提供了一個 WebUI 可以即時監控訓練過程:
pip install -e ".[webui]"
python -m skillopt_webui.app --port 7860
整個專案還支援從中斷點接續訓練。如果訓練中斷了,重新執行相同的指令,它就會自動從上次完成的步驟(step)繼續下去。
別再手寫了
微軟這篇論文所傳遞的訊息是:
手寫 Skill 文件或許是一個好的起點,但不應該是終點。
當然,論文也坦承了這個方法的限制:SkillOpt 需要任務具備可自動評估的標準(例如完全匹配或自動評分機制),對於開放性任務,目前暫時還不太適用。
總結一下,SkillOpt 的核心迴圈是:
讓 AI 代理執行任務 → 分析失敗原因 → 生成修改建議 → 在驗證集上驗證 → 接受或拒絕。這個流程你完全可以手動模仿:觀察 AI 代理在哪些任務上犯錯,分析錯誤模式,針對性地補充規則,然後驗證效果。
Skill 文件不應該是一次性寫完就放著不管的東西,它應該像模型的權重一樣,持續地被優化。
相關連結
論文:https://arxiv.org/abs/2605.23904
專案主頁:https://microsoft.github.io/SkillOpt/
GitHub 程式碼:https://github.com/microsoft/SkillOpt
展示影片:https://youtu.be/JUBMDTCiM0M
相關專案 SkillLens:https://microsoft.github.io/SkillLens/