金曜日, 8月 29, 2025
金曜日, 8月 29, 2025
- Advertisment -
ホームニューステックニュースClaude Codeで、サブエージェントをまとめるサブエージェントを作って、コンテキストを汚染させないようにしてみた

Claude Codeで、サブエージェントをまとめるサブエージェントを作って、コンテキストを汚染させないようにしてみた


サブエージェント機能の課題と限界

Claude Codeのサブエージェント機能を使えば、専門的な知識のみをサブエージェントに格納できます。それにより、専門的な知識をメインのルールファイルに記載せずに済むようになります。

その結果、各サブエージェントの出力精度が上がると共に、メインのエージェント(ターミナルから直接呼び出したエージェント)にも、不要なコンテキスト情報を持たせなくて済む、というメリットがあります。

しかしその一方で、サブエージェントを作成しすぎると、「どのサブエージェントを使うべきか?」で、Claude Codeは判断に迷うようになります。

そのため、サブエージェントを細かく作るだけ「出力の精度を上げる」ことが出来ますが、同時に「メインのエージェントが正しくサブエージェントを使えるか?」を気にする必要が出てきます。

また、サブエージェントの作成と登録自体もコンテキストを消費します。そのため、不要なサブエージェントの情報は持たせないほうが望ましいです。

サブエージェントの詳しい情報は、下記の記事がとても参考になります!

https://zenn.dev/tacoms/articles/552140c84aaefa

サブエージェントをまとめるサブエージェントを作ってみた

上記の問題を解決するため、「どのサブエージェントを使うべきか?」の責務に特化したエージェントを作り、そのエージェント経由で各サブエージェントの呼び出しを行わせることで、常に最適化されたエージェント利用を、メインのエージェントと分離して行えるのではないか?

また、通常のサブエージェントを登録するディレクトリとは別ディレクトリにエージェント情報を格納することで、「メインのエージェントから呼ばないサブエージェントを隠蔽」できないか?

以上の2点を検証したのが、今回の記事になります。

検証

実際に検証したコードは、下記のレポジトリに格納しています。

https://github.com/sean-sunagaku/claude-code-expert-manager

ディレクトリ構造

.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)は食材や専門的な質問を受けた場合:

  1. expert-manager に丸投げする

    • 質問全体をexpert-managerに渡す
    • エキスパート選択と処理はexpert-managerに任せる
    • 詳細管理なしで包括的な回答を受け取る
  2. 個別の専門エージェントは直接呼び出さない

    • ❌ 個別の expert を探したり選んだりしない
    • ✅ expert-manager が自動で適切なエージェントを選択
  3. 必要な情報を全て渡して任せる

    • ユーザーの質問と関連するコンテキストを全て expert-manager に渡す
    • 専門的な判断や詳細な処理は完全に expert-manager に委任
    • 自分で判断せず、expert-manager の回答をそのまま活用

なぜこの構成なのか

  1. コンテキストの保護: メインのコンテキストが専門知識で汚染されない
  2. 責任の分離: 各エージェントが明確な役割を持つ
  3. スケーラビリティ: 新しい専門エージェントを追加しても、メインは変更不要
  4. メモリ効率: メインのコンテキストを最小限に保つ

エージェント構成

.claude/agents/
├── expert-manager.md    # メインから唯一呼び出し可能
└── experts/            # 専門エージェント群(直接アクセス禁止)
    ├── vegetables/     # 野菜の専門家たち
    ├── fish/          # 魚の専門家たち
    └── meat/          # 肉の専門家たち

使い方はシンプル

専門知識が必要な質問が来たら:

適切なエキスパートを探す代わりに、タスク全体をexpert-managerに委譲します。

expert-managerが実行すること:

  1. 質問を分析
  2. 適切な専門エージェントを選択
  3. エキスパートから詳細な回答を取得
  4. 包括的な回答を返却

注意: これは専門的なタスクをサブエージェントに委譲するパターンです。エージェント名と構造をあなたの特定ドメイン(医療、法律、技術文書など)に合わせてカスタマイズしてください。

今後の拡張

新しい専門エージェントを追加する場合:

  1. .claude/agents/experts/の適切なカテゴリに配置
  2. expert-manager.md のマッピングに追加
  3. メインからは直接呼び出さない(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: "部位、地鶏、調理温度"

処理フロー

  1. 質問を受け取る → キーワード分析で適切なエージェントを自動選択
  2. 専門エージェントに委譲 → 対応するパス(.claude/expert-agents/配下)のmdファイルを直接指定してTaskツールで呼び出し
  3. 結果を返す → 専門エージェントからの回答をそのまま返却

重要な制約

  1. 専門知識を一切保持しない

    • 栄養成分の詳細データなし
    • 栽培技術の具体的情報なし
    • 調理法の詳細手順なし
  2. メインコンテキストの保護

    • 専門エージェントの詳細処理内容を知らない
    • 結果の最小限の情報のみを扱う
    • セッション情報はタスク ID とエージェント名のみ
  3. 情報フィルタリング

    • 専門エージェントからは構造化された最小限の情報のみ受け取る
    • 詳細な専門知識や処理過程は受け取らない

動作の仕組み

ユーザーが食材について質問
→ メインが 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)」の存在を隠しつつ、エキスパートマネージャーは、それらのエージェントを実行できる、という状態を作り出しています!

ファイルタグ(@)については、下記の記事がとても参考になります!

https://zenn.dev/spacemarket/articles/d331ca4c7757b8#1.-%40ファイルタグ

検証結果

ニンジンの栄養価について質問したところ、「エキスパートマネージャー」のみが呼び出されていることを確認できました。その上で、「エキスパートマネージャー」が、「各種エキスパート(今回の場合は、carrot-expert)」を呼んでいることを確認できました。

また、メインのエージェントからは、「エキスパートマネージャー」しか見えていない状況を作り出せました。そのため、今後サブエージェントを増やしたとしても、メインのエージェントのコンテキストには「影響がない」ことになります。

まとめ

サブエージェントをまとめるサブエージェントは作成できそうだと分かりました。

これを使えば、莫大なコンテキストを自由自在に扱うことが出来るようになる…かもしれません笑

もし、他にいいアイデアや活用方法があれば、ぜひコメントで教えて頂けると嬉しいです!



Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -