マイクロソフトのこの最新研究論文は、スキルドキュメントの書き方を変えるかもしれません。
あなたはすでに、CLAUDE.md、best_skill.md、エージェント指示書など、様々なスキルやエージェント向けのドキュメントを書いていることでしょう。
私と同じように、あなたも1時間、2時間、あるいは半日かけて、エージェントがより賢くなることを願い、指示書を丹念に磨き上げているかもしれません。
しかし、このマイクロソフトの論文の結論は、少し耳が痛いものです。あなたが手書きしたものは、ほぼ最適ではないのです。
マイクロソフトの研究チームは、SkillOptと呼ばれる手法を提案しました。その核心的なアイデアは次の通りです。
SkillOpt アーキテクチャ概要 (出典: 論文)
その結果、この手法は52のテスト組み合わせすべてで最適または同等最適を達成し、平均23.5ポイントの向上を示し、人間が手書きしたスキルを圧倒しました。
スキルについて
Claude Code、Codex、Cursorなどのツールは、ユーザーが「指示ドキュメント」を作成してエージェントの動作を指示することをすでにサポートしています。Claude CodeのCLAUDE.md、CodexのAgents.md、あるいは様々なスキルドキュメントに共通するのは、
例えば、「Excelの数式に遭遇した場合、まずワークシートの構造を確認し、Excelの自動再計算に頼るのではなく、静的な値を書き込む」と書けば、エージェントはSpreadsheetBenchのようなタスクを処理する際に、その指示に従います。
これは非常に理にかなっており、何の問題もないように思えます。
しかし問題は、自分が書いた数個のルールが本当に最善かどうか、どうやって分かるのか?ということです。
経験に基づいて5つのルールを書いたとしても、重要な3つを見落とし、さらに2つは十分に正確でないかもしれません。さらに厄介なことに、考えられるすべての記述方法を網羅的に試すことはできないため、自分が何を見落としているのかさえ分からないのです。
柔軟性と指導性の間で、適切なバランスを見つけるのは非常に難しいのです。
SkillOptの出発点は、人間がうまく書けないなら、AI自身に自分のマニュアルを最適化させよう、というものです。
訓練ループ
SkillOptの核心的なアイデアを一言でまとめると、次のようになります。
スキルドキュメントはエージェントが変更できる唯一の外部状態であるならば、それを「重み」として訓練する。
エージェントのモデルパラメータは凍結されており変更できませんが、スキルドキュメントはプレーンテキストであり、自由に編集できます。それならば、ニューラルネットワークを訓練するのと同じように、完全な最適化プロセスを用いてこのドキュメントを反復的に最適化できないでしょうか?
このように考え始めると、方法論全体が自然と出来上がっていきます。
SkillOpt 訓練フロー (出典: 論文)
ここで、深層学習における様々な概念が、このテキスト空間にどのようにマッピングされるかを見てみましょう。
ニューラルネットワークの訓練では、データを入力して順伝播 (forward pass) を行いますが、SkillOptでこれに対応する操作はロールアウト (rollout)と呼ばれます。これは、エージェントに現在のスキルドキュメントを持たせて一連のタスクを実行させ、その成否を収集するものです。
順伝播の後には勾配 (gradient) を計算しますが、SkillOptでこれに対応する操作はリフレクション (reflection)と呼ばれます。これは、オプティマイザモデルを用いて、どのタスクが失敗したのか、なぜ失敗したのかを分析し、改善の方向性を導き出すものです。
勾配が得られたら重みを更新 (weight update) しますが、SkillOptでこれに対応する操作は編集 (edit)です。これは、スキルドキュメントに対して「追加」「削除」「置換」の3種類の構造化編集を行うものです。
訓練には学習率 (learning rate) があり、ステップ幅を制御しますが、SkillOptにもテキスト学習率 (textual learning rate)があります。これは、1ラウンドあたり最大L_t個のルールしか変更できない(デフォルトは4個)というもので、コサイン減衰 (cosine decay) も適用されます。
最後に、訓練では検証セットを用いてチェックポイントを作成し、最適なモデルを保存しますが、SkillOptも同様に検証ゲーティング (validation gating)を備えています。変更後に検証セットでスコアを確認し、スコアが向上しなければ、その変更は受け入れられません。
この一連のプロセスは、要するに深層学習の訓練ループを、テキスト編集のループに一対一で翻訳したものです。
二つのモデルの役割分担
SkillOptでは、二つのモデルを使用します。
一つはターゲットモデル (target model)と呼ばれ、普段使用しているエージェント(GPT-5.5やClaudeなど)のことです。これはスキルドキュメントを携えてタスクを実行する役割を担い、モデル自体は凍結されて変更されません。
もう一つはオプティマイザモデル (optimizer model)と呼ばれ、別の非常に強力な最先端モデルです。これは、ターゲットモデルのパフォーマンスを分析し、修正提案を行う役割を担います。
たとえるなら、ターゲットモデルは工場の現場作業員で、オプティマイザモデルはそばで観察する経営コンサルタントのようなものです。作業員は操作マニュアル通りに作業し、コンサルタントは作業員の不得意な点を観察してマニュアルを修正します。
この役割分担には、オプティマイザモデルのコストは訓練段階でのみ発生し、デプロイ時には一切不要であるという利点があります。
論文では、同レベルのモデルをオプティマイザとして使用した場合の効果(例:GPT-5.4自身のスキルをGPT-5.4で最適化)についても検証しています。
その結果、同レベルオプティマイザも機能し、強力なオプティマイザによる向上効果の約56%〜74%を回復できることが分かりました。しかし、より強力なオプティマイザを使用した方が、ターゲットモデル自身では気づけない問題を発見できるため、明らかに効果は高くなります。
自制の学問
ここで、SkillOptが1ラウンドあたり最大4つのルールしか変更しないという設計があります。
直感的には、「AIに最適化させるなら、なぜドキュメント全体を一度に書き換えさせないのか?」と思うかもしれません。
研究チームは実際にそれを試しましたが、結論は制限しない方がむしろ悪化するというものでした。
無制限の書き換え (unbounded) では、L_t=4の場合よりも2〜3ポイント低いスコアとなりました。
理由は簡単で、ニューラルネットワークの訓練で学習率が大きすぎると発振を起こすのと同じで、一度に多くの変更を加えすぎると、良い変更と悪い変更が混ざり合い、検証セットではどれが有効かを正確に判断できなくなってしまうからです。
また、拒否された編集バッファ (rejected-edit buffer) と呼ばれる設計もあります。
検証セットで拒否された修正は、単に破棄されるのではなく、バッファに保存されます。後続のリフレクション段階では、これらの「過去の教訓」を参照することで、同じ過ちを繰り返すことを避けます。
これは、訓練におけるネガティブフィードバックのようなもので、最適化プロセスに記憶を与えます。
もう一つの重要なメカニズムは低速/メタ更新 (slow/meta update)と呼ばれ、深層学習におけるモメンタムに相当します。
各エポックの終了時に、オプティマイザはそのエポックと前のエポックのスキルドキュメントを振り返り、エポックを跨いだ縦断的な更新を一度だけ行います。この低速更新の内容は保護されており、ステップレベルの編集で上書きすることはできません。
アブレーション実験によると、低速/メタ更新を削除すると、SpreadsheetBenchのスコアが77.5から55.0へと、実に22.5ポイントも急落しました。
各コンポーネントのアブレーション実験結果
時に、自制は急進よりも効果的なのです。
驚異的な効果
設計について多くのことを説明しましたが、その効果はどうでしょうか?
一言で言うと、驚異的です。
研究チームは、単発の質疑応答、複数ターンのコード生成、ドキュメント操作、マルチモーダルなドキュメント理解、数学的推論、そして身体化された環境との相互作用をカバーする6つのベンチマークでテストを実施しました。
GPT-5.5との直接対話の結果と比較すると:
訓練プロセス中のスコア変化曲線
SpreadsheetBenchとOfficeQAはそれぞれ39ポイント向上しました。これは小手先の微調整などではなく、「ほとんど使えない」状態から「かなり使える」状態への質的変化と言えるでしょう。
しかも、直接対話のシナリオだけでなく、Codex実行環境では平均+24.8ポイント、Claude Code実行環境では平均+19.1ポイントの向上を示しました。
全モデル×環境の完全な結果
52のテストマスすべてで、最適または同等最適。一つも負けていません。
人間の手書きを圧倒
こう疑問に思うかもしれません。「人間が手書きしたスキルと比べるとどうなのか?」と。
研究チームは専用の比較実験を行いました。
SkillOpt vs すべてのベースライン手法
人間が注意深く作成したスキルドキュメント(145-516トークン)をベースラインとした場合、GPT-5.5との直接対話におけるSkillOptの平均スコアは82.3でしたが、人間の手書きスキルを含む他のすべての手法の「ベンチマークごとの最良選択」を組み合わせた場合の平均スコアは76.9に過ぎませんでした。
つまり、各ベンチマークで最も成績の良いベースライン手法を選択して組み合わせても、その平均スコアはSkillOptに劣るのです。
比較対象となった手法には、One-shot LLMで生成されたスキル、Trace2Skill(軌跡から蒸留)、TextGrad(勾配スタイル最適化)、GEPA(パレートリフレクション進化)、EvoSkill(スキルフォルダ進化)が含まれています。
すべて、圧倒されました。
AIが学んだこと
では、最適化されたスキルドキュメントは実際どのようなものになるのでしょうか?
論文では、学習されたいくつかのルールが紹介されています。これらを見ると、人間には確かに思いつかないが、一度見れば「確かにそう書くべきだ」と納得させられるものばかりです。
これらのルールにはいくつかの共通点があります:
極めて具体的 「注意深く確認する」「真剣に考える」といった上司が好むような曖昧な表現はなく、すべてが操作レベルまで正確に記述されています。
直感に反する 扱うシナリオは、人間がスキルを書く際には全く思いもよらないものです。
コンパクト 最終的なスキルファイルはわずか379〜1995トークンで、中央値は約920トークンです。あるベンチマークでは、たった一つの修正が受け入れられただけで39ポイントも向上しました。
進化のプロセス
最終的なルールだけを見ても、あまりピンとこないかもしれません。
そこで論文では、スキルドキュメントの完全な進化プロセスも紹介しており、白紙のスキルがどのように最終版へと段階的に成長していくかを見ることができます。
ALFWorldを例に取ります:
SpreadsheetBenchの進化も非常に似ています。初期のスキルは一般的な自動化命令に過ぎませんでしたが、数ラウンドの最適化を経て、エージェントはワークブックのヘッダーと範囲の確認、キーの正規化、数式への依存を静的な値で置き換えること、補助的な計算列の保持など、一連のきめ細かい操作を学習しました。
最終的な効果は、40.4から78.9へ、38.5ポイントの向上です。
これらの進化プロセスが示しているのは、優れたスキルドキュメントとは、誰かが座って考え出すものではなく、実践の中から生まれてくるべきだということです。
モデルや環境を跨いで
SkillOptにはもう一つ、最適化されたスキルはモデルや実行環境を跨いで移行できるという特性があります。
つまり、あるモデルで最適化したスキルは、別のモデルやツール、さらには別のタスクに適用しても、高い確率で有効なのです。
訓練コストは一度だけ支払うもので(オフラインで完了)、デプロイ時の追加コストはゼロです。最適化されたスキルファイルは単なるプレーンテキストであり、そのまま使用できます。
訓練コスト
では、この最適化プロセスにはどれくらいの費用がかかるのでしょうか?
論文で示されたデータによると、フローベースのベンチマーク(SearchQA、DocVQA)では、絶対テストスコアを1ポイント向上させるために60万〜360万の訓練トークンが必要です。複雑な軌跡ベースのベンチマーク(SpreadsheetBench、ALFWorld)では、3790万〜4640万トークンが必要です。
この費用は決して高くはなく(むしろかなり安いと言えます)、重要なのは訓練は一度だけ行えば良いという点です。
訓練済みのスキルファイルは、使用するたびに追加コストが発生することはありません。エージェントが何千、何万回もタスクを実行するなら、この程度の訓練コストはすぐに償却され、もたらされる向上効果を考えれば、非常に価値があります。
例えるなら、コンサルタントを雇って操作マニュアルを一度作成してもらい、その後は全従業員がそのマニュアルに従って作業するようなものです。コンサルタントは一度使えばそれでお役御免です。
大小問わず効果あり
論文では、異なる規模のモデルでのパフォーマンスもテストされています。
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の恩恵を受けるために必ずしも最も高価なモデルを使う必要はなく、最適化されたスキルを備えた小規模モデルでさえ、何も持たない大規模モデルの生の性能を上回る可能性があることを示しています。
もう一つのデータは、訓練データ量が効果に与える影響です。
SpreadsheetBenchを例にとると、訓練データの1%を使用して最適化した場合のスコアは47.5でしたが、訓練データを100%使用するとスコアは78.0まで上昇しました。
データが多ければ多いほど、スキルの最適化は進みます。しかし、データ量が多くなくても、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現在、SearchQA、SpreadsheetBench、OfficeQA、DocVQA、LiveMathematicianBench、ALFWorldの6つのベンチマークをサポートしています。それぞれに対応する設定ファイルがconfigs/ディレクトリにあります。
訓練が完了すると、出力ディレクトリにはbest_skill.mdが生成されます。これが最終的に最適化されたスキルファイルで、そのまま使用できます:
outputs/<run_name>/
├── best_skill.md # 最適なスキルドキュメント
├── history.json # 訓練履歴
├── skills/skill_vXXXX.md # 各ステップのスナップショット
└── steps/step_XXXX/ # 各ステップのパッチと評価評価のみを単独で実行することも可能です:
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プロジェクト全体は、中断からの再開訓練もサポートしています。中断後に同じコマンドを再実行すると、最後に完了したステップから自動的に続行されます。
もう手書きは不要
マイクロソフトのこの論文が示すシグナルは次の通りです:
手書きのスキルドキュメントは良い出発点かもしれませんが、最終地点であるべきではありません。
もちろん、論文はこの手法の限界も率直に認めています。SkillOptは、タスクに自動評価可能な基準(完全一致または自動採点機能)が必要であり、オープンエンドなタスクには現時点ではあまり適していません。
まとめると、SkillOptのコアループは次の通りです:
エージェントにタスクを実行させる → 失敗原因を分析する → 修正提案を生成する → 検証セットで検証する → 受け入れるか拒否する。このフローは、あなたが手動で真似することも完全に可能です。つまり、エージェントがどのタスクでミスを犯すかを観察し、エラーパターンを分析し、的を絞ってルールを補充し、その効果を検証するのです。
スキルドキュメントは、一度書いたら放置しておくものではなく、モデルの重みのように継続的に最適化されるべきものなのです。