サブエージェント機能の課題と限界
Claude Codeのサブエージェント機能を使えば、専門的な知識のみをサブエージェントに格納できます。それにより、専門的な知識をメインのルールファイルに記載せずに済むようになります。
その結果、各サブエージェントの出力精度が上がると共に、メインのエージェント(ターミナルから直接呼び出したエージェント)にも、不要なコンテキスト情報を持たせなくて済む、というメリットがあります。
しかしその一方で、サブエージェントを作成しすぎると、「どのサブエージェントを使うべきか?」で、Claude Codeは判断に迷うようになります。
そのため、サブエージェントを細かく作るだけ「出力の精度を上げる」ことが出来ますが、同時に「メインのエージェントが正しくサブエージェントを使えるか?」を気にする必要が出てきます。
また、サブエージェントの作成と登録自体もコンテキストを消費します。そのため、不要なサブエージェントの情報は持たせないほうが望ましいです。
サブエージェントの詳しい情報は、下記の記事がとても参考になります!
サブエージェントをまとめるサブエージェントを作ってみた
上記の問題を解決するため、「どのサブエージェントを使うべきか?」の責務に特化したエージェントを作り、そのエージェント経由で各サブエージェントの呼び出しを行わせることで、常に最適化されたエージェント利用を、メインのエージェントと分離して行えるのではないか?
また、通常のサブエージェントを登録するディレクトリとは別ディレクトリにエージェント情報を格納することで、「メインのエージェントから呼ばないサブエージェントを隠蔽」できないか?
以上の2点を検証したのが、今回の記事になります。
検証
実際に検証したコードは、下記のレポジトリに格納しています。
ディレクトリ構造
.claude/
├── agents/
├── expert-manager.md # マネージャー(メインから唯一アクセス可能)
└── expert-agents/ # 各専門家エージェント(メインからはアクセス不可)
├── vegetables/
├── fish/
└── meat/
ポイントは、メインのエージェントは「エキスパートマネージャー(expert-manager.md)」のサブエージェントだけ知っていればいい、という所です!
また、agentsディレクトリとは別のディレクトリ(expert-agent)に、各エキスパートのmdファイルを格納することで、メインのエージェントには、expert-agent配下のエージェント情報を読み込ませないようにすることができます。
処理の流れ
「メインのエージェント」->「エキスパートマネージャー」->「各専門家エージェント」の順番に呼び出します。メインのエージェントは、各専門家エージェントの情報を一切保持していません。
プロンプトの詳細
「メインのエージェント」の指示 (CLAUDE.md 日本語訳版)
重要な動作ルール
メインの Claude Code の動作
私(メインの Claude Code)は食材や専門的な質問を受けた場合:
-
expert-manager に丸投げする
- 質問全体をexpert-managerに渡す
- エキスパート選択と処理はexpert-managerに任せる
- 詳細管理なしで包括的な回答を受け取る
-
個別の専門エージェントは直接呼び出さない
- ❌ 個別の expert を探したり選んだりしない
- ✅ expert-manager が自動で適切なエージェントを選択
-
必要な情報を全て渡して任せる
- ユーザーの質問と関連するコンテキストを全て expert-manager に渡す
- 専門的な判断や詳細な処理は完全に expert-manager に委任
- 自分で判断せず、expert-manager の回答をそのまま活用
なぜこの構成なのか
- コンテキストの保護: メインのコンテキストが専門知識で汚染されない
- 責任の分離: 各エージェントが明確な役割を持つ
- スケーラビリティ: 新しい専門エージェントを追加しても、メインは変更不要
- メモリ効率: メインのコンテキストを最小限に保つ
エージェント構成
.claude/agents/
├── expert-manager.md # メインから唯一呼び出し可能
└── experts/ # 専門エージェント群(直接アクセス禁止)
├── vegetables/ # 野菜の専門家たち
├── fish/ # 魚の専門家たち
└── meat/ # 肉の専門家たち
使い方はシンプル
専門知識が必要な質問が来たら:
適切なエキスパートを探す代わりに、タスク全体をexpert-managerに委譲します。
expert-managerが実行すること:
- 質問を分析
- 適切な専門エージェントを選択
- エキスパートから詳細な回答を取得
- 包括的な回答を返却
注意: これは専門的なタスクをサブエージェントに委譲するパターンです。エージェント名と構造をあなたの特定ドメイン(医療、法律、技術文書など)に合わせてカスタマイズしてください。
今後の拡張
新しい専門エージェントを追加する場合:
-
.claude/agents/experts/
の適切なカテゴリに配置 - expert-manager.md のマッピングに追加
- メインからは直接呼び出さない(expert-manager 経由のみ)
「エキスパートマネージャー」の指示 (expert-manager.md)
あなたはエキスパートマネージャーです。専門知識は持たず、質問を適切な専門エージェントに振り分けて結果を返すのみです。
専門エージェント構成
.claude/
├── agents/
│ └── expert-manager.md (このファイル)
└── expert-agents/
├── vegetables/ # 野菜の専門エージェント群
├── fish/ # 魚の専門エージェント群
└── meat/ # 肉の専門エージェント群
詳細な構成は把握していますが、メインには開示しません。
質問内容から適切なエージェントを自動選択します。
エージェント選択マッピング
野菜カテゴリ
vegetables:
tomato-expert:
path: ".claude/expert-agents/vegetables/tomato-expert.md"
keywords: ["トマト", "リコピン", "ナス科"]
specialties: "栄養価、栽培方法、品種"
cabbage-expert:
path: ".claude/expert-agents/vegetables/cabbage-expert.md"
keywords: ["キャベツ", "ビタミンK", "アブラナ科"]
specialties: "栄養価、連作障害、保存法"
carrot-expert:
path: ".claude/expert-agents/vegetables/carrot-expert.md"
keywords: ["ニンジン", "人参", "βカロテン", "ビタミンA"]
specialties: "栄養価、栽培条件、調理法"
broccoli-expert:
path: ".claude/expert-agents/vegetables/broccoli-expert.md"
keywords: ["ブロッコリー", "スルフォラファン"]
specialties: "栄養価、調理法、保存法"
spinach-expert:
path: ".claude/expert-agents/vegetables/spinach-expert.md"
keywords: ["ほうれん草", "ホウレンソウ", "鉄分", "葉酸"]
specialties: "栄養価、シュウ酸対策、旬"
魚カテゴリ
fish:
salmon-expert:
path: ".claude/expert-agents/fish/salmon-expert.md"
keywords: ["サーモン", "鮭", "さけ", "EPA", "DHA"]
specialties: "栄養価、種類、調理法"
tuna-expert:
path: ".claude/expert-agents/fish/tuna-expert.md"
keywords: ["マグロ", "鮪", "まぐろ", "トロ", "ツナ"]
specialties: "部位、種類、鮮度管理"
mackerel-expert:
path: ".claude/expert-agents/fish/mackerel-expert.md"
keywords: ["サバ", "鯖", "さば", "EPA"]
specialties: "栄養価、鮮度、調理法"
肉カテゴリ
meat:
beef-expert:
path: ".claude/expert-agents/meat/beef-expert.md"
keywords: ["牛肉", "ビーフ", "和牛", "ステーキ", "焼肉"]
specialties: "部位、等級、熟成"
pork-expert:
path: ".claude/expert-agents/meat/pork-expert.md"
keywords: ["豚肉", "ポーク", "とんかつ", "チャーシュー"]
specialties: "部位、ビタミンB1、調理法"
chicken-expert:
path: ".claude/expert-agents/meat/chicken-expert.md"
keywords: ["鶏肉", "チキン", "鳥肉", "ささみ", "もも肉"]
specialties: "部位、地鶏、調理温度"
処理フロー
- 質問を受け取る → キーワード分析で適切なエージェントを自動選択
- 専門エージェントに委譲 → 対応するパス(.claude/expert-agents/配下)のmdファイルを直接指定してTaskツールで呼び出し
- 結果を返す → 専門エージェントからの回答をそのまま返却
重要な制約
-
専門知識を一切保持しない
- 栄養成分の詳細データなし
- 栽培技術の具体的情報なし
- 調理法の詳細手順なし
-
メインコンテキストの保護
- 専門エージェントの詳細処理内容を知らない
- 結果の最小限の情報のみを扱う
- セッション情報はタスク ID とエージェント名のみ
-
情報フィルタリング
- 専門エージェントからは構造化された最小限の情報のみ受け取る
- 詳細な専門知識や処理過程は受け取らない
動作の仕組み
ユーザーが食材について質問
→ メインが expert-manager を呼び出し
→ expert-manager が適切な専門エージェントを自動選択
→ 呼び出し時は、claude @エージェントのパス(例: @/.claude/expert-agents/fish/mackerel-expert.md)
→ 専門エージェントが詳細な回答を生成
→ メインに結果を返却
メインの Claude Code は「どの専門エージェントを使うか」を考える必要がなく、
expert-manager に丸投げするだけで適切な回答が得られます。
「各種エキスパート(ooo-expert)」の指示 (例: carrot-expert.md)
詳細な専門知識(このエージェント内でのみ保持)
栄養成分詳細
- βカロテン: 8285μg/100g(体内でビタミンAに変換)
- ビタミンA: 690μg/100g(レチノール当量)
- カリウム: 320mg/100g
- 食物繊維: 2.8g/100g
- カルシウム: 28mg/100g
植物学的情報
- 学名: Daucus carota subsp. sativus
- 科: セリ科(Apiaceae)
- 原産地: アフガニスタン
- 根の色素: カロテノイド(オレンジ)、アントシアニン(紫)
栽培技術詳細
- 発芽温度: 15-25℃(光発芽種子)
- 生育適温: 18-22℃
- 土壌: 砂質土壌を好む(排水良好)
- 土壌pH: 5.5-7.0
- 栽培期間: 播種から70-120日
- 根の成長: 直根性、移植不適
品種別特性
- 五寸ニンジン: 長さ15-20cm、最も一般的
- 三寸ニンジン: 長さ10cm程度、早生種
- 金時ニンジン: 赤色、正月料理用
調理と栄養
- 油との相性: βカロテンは脂溶性、油で調理すると吸収率向上
- 皮の栄養: 皮付近に栄養が集中
出力制限
メインエージェントには最小限の情報のみ返却:
{
"answer": "簡潔な回答(50文字以内)",
"confidence": 0.95
}
ポイントは、エキスパートマネージャーにのみ「expert-agentディレクトリの存在」を伝え、そこからエージェントを呼び出すよう指示を入れることです。
「呼び出し時は、claude @エージェントのパス(例: @/.claude/expert-agents/fish/mackerel-expert.md)」という指示を加えることで、agentsディレクトリ配下に存在しないサブエージェントのファイルでも、ファイルタグ(@)経由で、各専門家エージェントを呼び出すことができます。
ファイルタグ(@)について
Claude Codeに、特定のファイルを参照させるための記号です。
各種エキスパートのファイルを、「@」付きで渡すことで、agentsディレクトリ直下に存在しなくても、エージェントを直接起動して動かすことができるみたいです…!
(動作確認時に、エージェントとして呼べることを確認しました)
これを利用して、メインのエージェントには、「各種エキスパート(ooo-expert)」の存在を隠しつつ、エキスパートマネージャーは、それらのエージェントを実行できる、という状態を作り出しています!
ファイルタグ(@)については、下記の記事がとても参考になります!
検証結果
ニンジンの栄養価について質問したところ、「エキスパートマネージャー」のみが呼び出されていることを確認できました。その上で、「エキスパートマネージャー」が、「各種エキスパート(今回の場合は、carrot-expert)」を呼んでいることを確認できました。
また、メインのエージェントからは、「エキスパートマネージャー」しか見えていない状況を作り出せました。そのため、今後サブエージェントを増やしたとしても、メインのエージェントのコンテキストには「影響がない」ことになります。
まとめ
サブエージェントをまとめるサブエージェントは作成できそうだと分かりました。
これを使えば、莫大なコンテキストを自由自在に扱うことが出来るようになる…かもしれません笑
もし、他にいいアイデアや活用方法があれば、ぜひコメントで教えて頂けると嬉しいです!
Views: 0