Skills の自動最適化 — TextGrad を応用して提案書生成スキルを「学習」させる実験と過学習の発見
@yusuke_post 氏が、Claude Code の Skills を深層学習の手法で自動最適化する実験を公開し、大きな反響を呼んでいます。
最初のポスト(いいね 1,226、ブックマーク 2,265)では TextGrad を応用した Skills 最適化の概念を紹介し、続報のポスト(いいね 126、ブックマーク 132)では追加実験の結果として以下の知見を報告しています。
わかったのは、 ・3イテレーションくらいで過学習する。 ・1回だけでなく、3回くらいイテレーションを回すことで徐々にスコアが改善する。 ・学習を始めて最初の方は、「提案書に何を書くか」を学び出して、最後の方では「提案書のそれぞれの項目をどう書くか」を自動で学習する。
特に「全体最適→局所最適の順番で AI が自動で学んだ」という発見は、深層学習の訓練過程と同様の振る舞いが Markdown のプロンプトでも起きることを示唆しています。本記事では、この実験の背景・手法・発見を解説します。
TextGrad とは何か
「テキスト版の誤差逆伝播」
TextGrad(論文: arXiv 2406.07496)は、Stanford 大学の Zou グループが開発し、Nature に掲載されたフレームワークです。深層学習における誤差逆伝播(backpropagation)の概念を、テキストに適用します。
[深層学習の最適化]
入力 → ニューラルネット → 出力 → 損失関数 → 勾配計算 → パラメータ更新
↑ 数値の勾配
[TextGrad の最適化]
入力 → LLM → 出力 → 評価(LLM) → テキスト勾配 → プロンプト更新
↑ 自然言語のフィードバック
従来の深層学習では数値的な勾配を計算してパラメータを更新しますが、TextGrad では LLM が自然言語で「どう改善すべきか」をフィードバックし、それを「テキスト勾配」としてプロンプトを更新します。
PyTorch と同じインターフェース
TextGrad は PyTorch のインターフェースを踏襲しており、深層学習の経験があれば直感的に使えます。
| 深層学習(PyTorch) | TextGrad |
|---|---|
model.parameters() | プロンプトのテキスト変数 |
loss.backward() | LLM によるテキストフィードバック生成 |
optimizer.step() | フィードバックに基づくプロンプト書き換え |
| エポック(学習の繰り返し) | イテレーション |
| 過学習(overfitting) | 過学習(同様に発生する) |
実績
TextGrad は以下の成果を報告しています。
| タスク | 改善 |
|---|---|
| GPT-4o のゼロショット質問応答 | 51% → 55%(精度) |
| LeetCode-Hard のコーディング問題 | 20%の相対的性能向上 |
| 推論タスクのプロンプト最適化 | GPT-3.5 の性能を GPT-4 に近づける |
Skills の自動最適化 — 実験の構造
Skills とは
Claude Code の Skills は、.claude/skills/ ディレクトリに配置する Markdown ベースの指示ファイルです。特定のタスク(提案書作成、コードレビュー、監査など)の手順・基準・知識を記述し、Claude Code がそれに従って作業します。
Skills の品質は、記述の精度に直結します。しかし、最適な Skills を手動で書くのは困難です。何を書くべきか、どの程度詳細に書くべきか、どの順序で記述すべきかは、試行錯誤が必要です。
実験の設計
yusuke_post 氏の実験は、この試行錯誤を自動化するものです。
[Skills 自動最適化のループ]
1. Forward(順伝播)
Skills(skill.md)→ Claude Code → 提案書を生成
2. Loss(損失計算)
生成された提案書 vs 正解データ → 評価スコア算出
3. Backward(逆伝播)
「どう改善すべきか」をテキスト勾配として生成
4. Update(パラメータ更新)
skill.md のテキストを書き換え
5. 1〜4 を繰り返す(イテレーション)
| 実験条件 | 内容 |
|---|---|
| タスク | 提案書の生成 |
| 学習データ | 7件 |
| 評価データ | 3件(学習に使用せず、評価のみ) |
| 正解データ | AI が生成したもの(簡易的な実験) |
| 最適化対象 | skill.md のテキスト |
深層学習と同様に、学習データと評価データを分離しています。これにより、Skills が学習データに過剰に適応(過学習)していないかを検証できます。
発見 — Skills にも過学習が起きる
発見1: 3イテレーションで過学習する
3イテレーションくらいで過学習する。
深層学習でモデルが訓練データに過剰に適応するのと同様に、Skills のテキストも学習データに特化しすぎる現象が発生しました。
[イテレーションとスコアの推移(概念図)]
スコア
↑
│ ╭─── 評価データのスコア(検証)
│ ╭╯
│ ╭╯
│ ╭╯ ╭───── 学習データのスコア
│╭╯ ╭╯
├╯─╭╯
│╭╯
├╯
│
└─────────────────→ イテレーション
1 2 3 4 5
↑
この辺りから過学習
(学習スコアは上がるが
評価スコアが停滞/低下)
これは極めて重要な発見です。Skills を手動で改善する場合でも、特定の事例に合わせすぎると汎用性が失われるリスクがあることを示しています。
発見2: 複数イテレーションで段階的に改善
1回だけでなく、3回くらいイテレーションを回すことで徐々にスコアが改善する。
1回のフィードバックでは最適な Skills に到達しません。深層学習で1エポックでは収束しないのと同じで、複数回の「生成→評価→改善」ループが必要です。
発見3: 全体最適→局所最適の順序で学習する
面白かったのは、提案書について、“全体最適→局所最適"の順番でAIが自動で学んだこと。
最も興味深い発見は、学習の順序です。
| 学習フェーズ | Skills が学ぶ内容 | 深層学習での類似現象 |
|---|---|---|
| 初期(全体最適) | 「提案書に何を書くか」— 構成要素、セクション構成 | 粗い特徴の学習(エッジ、輪郭) |
| 後期(局所最適) | 「それぞれの項目をどう書くか」— 表現、詳細度 | 細かい特徴の学習(テクスチャ、パターン) |
深層学習では、ニューラルネットワークが初期に大局的な特徴(画像のエッジなど)を学び、後に細部(テクスチャなど)を学ぶことが知られています。Markdown のプロンプトでも同じ順序が再現されたことは、テキスト最適化が深層学習の訓練と構造的に類似していることを示唆しています。
なぜこのアプローチが重要か
手動 Skills チューニングの限界
現在、ほとんどの Skills は人間が手動で書いています。その問題点は明確です。
| 手動 Skills チューニング | 自動最適化 |
|---|---|
| 暗黙知に依存(書く人のスキルに左右される) | データに基づく客観的な改善 |
| 試行錯誤の回数が限られる | 数十〜数百イテレーションを自動実行 |
| 全体最適と局所最適を同時に考える必要がある | 自然に全体→局所の順で最適化される |
| 過学習に気づきにくい | 評価データとの乖離で検出可能 |
深層学習のノウハウが転用できる
TextGrad のアプローチが示す最大のインパクトは、深層学習で蓄積された膨大なノウハウがプロンプト最適化に転用できることです。
| 深層学習のテクニック | Skills 最適化への適用 |
|---|---|
| 早期打ち切り(Early Stopping) | 過学習が始まったらイテレーションを停止 |
| データ拡張(Data Augmentation) | 学習データのバリエーションを増やす |
| 正則化(Regularization) | Skills が複雑になりすぎないよう制約を加える |
| 交差検証(Cross Validation) | 複数の評価データセットで汎用性を確認 |
| 学習率のスケジューリング | 初期は大きく改善、後期は微調整 |
関連フレームワーク: DSPy
DSPy(GitHub)は、Stanford NLP グループが開発したプロンプトの体系的最適化フレームワークです。TextGrad が「テスト時の反復改善」に特化しているのに対し、DSPy は「コンパイル時のパイプライン全体の最適化」を行います。
| 観点 | TextGrad | DSPy |
|---|---|---|
| アプローチ | テキスト勾配による反復改善 | 宣言的プログラミング + コンパイル時最適化 |
| 最適化対象 | 単一のプロンプト/出力 | パイプライン全体(複数ステップ) |
| 強み | 単一タスクの深い最適化 | 複数ステップの協調最適化 |
| Skills への応用 | 1つの skill.md の改善 | 複数 Skills の連携最適化 |
yusuke_post 氏の実験は TextGrad のアプローチに基づいていますが、将来的には DSPy のようなパイプライン最適化も Skills に適用できる可能性があります。
今後の展望
yusuke_post 氏は、今後の方針として以下を示しています。
今後は、実際の過去の人の成果物を正解データとして使い、DeepResearch、Notionツール、ほかMCPなどの使い方も自律的に学習させる方針。
| 現在の実験 | 今後の方向 |
|---|---|
| AI 生成の正解データ | 人間の過去の成果物を正解データに |
| 提案書の生成タスクのみ | DeepResearch、Notion、MCP など複合タスク |
| skill.md のテキスト最適化のみ | ツールの使い方(いつ・どう使うか)も最適化 |
特に「ツールの使い方を自律的に学習させる」という方向性は、Skills の最適化が単なるプロンプト改善を超え、AI エージェントの行動パターンそのものの最適化に向かっていることを示しています。
実践への示唆
Skills を改善する際のチェックリスト
TextGrad の実験から、手動で Skills を改善する場合にも適用できる知見があります。
- 評価データを用意する: 学習に使わない事例を2〜3件確保し、改善後の Skills がそれらでも機能するか確認する
- 3回以上イテレーションする: 1回の改善で満足せず、「生成→評価→改善」を最低3回繰り返す
- 過学習に注意する: 特定の事例に合わせすぎていないか、別の事例でも検証する
- 全体構成から改善する: まず「何を書くか」(構成・セクション)を固め、その後「どう書くか」(表現・詳細度)を調整する
- 改善の記録を残す: 各イテレーションでの変更点とスコアの変化を記録し、過学習の兆候を検出する
自動最適化の導入ステップ
yusuke_post 氏のアプローチを自分のプロジェクトに導入する場合の概念的なステップは以下の通りです。
1. 対象タスクの選定
└── 繰り返し実行する定型タスク(提案書、レポート、コードレビュー等)
2. 正解データの収集
└── 過去の成果物から「良い出力」を5〜10件収集
3. 評価関数の設計
└── LLM に「正解データとの比較」でスコアリングさせる
4. 最適化ループの実行
└── 生成→評価→テキスト勾配→skill.md 更新を3〜5回
5. 過学習チェック
└── 評価データ(学習に使わない事例)でスコアを確認
まとめ
- TextGrad を Skills に適用: 深層学習の誤差逆伝播の概念を Markdown のスキルファイルに適用し、LLM のテキストフィードバックで自動改善する手法
- 3イテレーションで過学習: 深層学習と同様に、学習データに過剰適応する現象が発生。評価データとの分離が重要
- 全体最適→局所最適の順序: AI は自然に「何を書くか」(構成)を先に学び、次に「どう書くか」(表現)を学ぶ。深層学習の粗→細の学習順序と一致
- 深層学習のノウハウが転用可能: 早期打ち切り、データ拡張、正則化など、確立されたテクニックがプロンプト最適化にも適用できる
- 今後はツールの使い方も最適化: skill.md のテキスト改善に留まらず、MCP やリサーチツールの使用パターンの最適化へ発展する可能性
参考
- @yusuke_post のポスト(追加実験結果)
- @yusuke_post のポスト(初回: Skills 自動最適化の概念)
- @yusuke_post のポスト(プラグイン作成中)
- TextGrad 公式サイト
- TextGrad: Automatic “Differentiation” via Text - arXiv
- TextGrad - GitHub(zou-group)
- TextGrad: AutoGrad for Text - Stanford HAI
- DSPy - Stanford NLP
- DSPy - GitHub(stanfordnlp)
- Beyond Prompt Engineering: TextGrad and DSPy - Medium
- How we built open-source automated prompt optimization - Evidently AI
- Automatic Prompt Optimization - Cameron R. Wolfe