Architect Foundations ドメイン1: エージェント型アーキテクチャとオーケストレーション(27%)
この章で学ぶこと: エージェントループの制御、コーディネーターとサブエージェントの分担、サブエージェントへの情報の渡し方、フックによる強制、タスクの分け方、セッションの再開とフォーク。
いちばん配点の大きいドメインです。本番の60問のうち約16問が出ます。
| タスクステートメント | この章の節 |
|---|---|
| 1.1 エージェントループを設計・実装する | 第1節 |
| 1.2 コーディネーター・サブエージェント型の編成 | 第2節 |
| 1.3 サブエージェントの呼び出し・コンテキストの受け渡し・生成 | 第3節 |
| 1.4 強制と引き継ぎのパターンを使う多段階ワークフロー | 第4節 |
| 1.5 Agent SDK のフックで横取りと正規化 | 第5節 |
| 1.6 タスク分解の戦略 | 第6節 |
| 1.7 セッションの状態・再開・フォーク | 第7節 |
Developer Foundations で学んだ基本(ここでは繰り返しません):
- ツール利用のループのコードと
stop_reason→ Developer D1 第2.2節 - Agent SDK のループ、組み込みツール、権限モード、
max_turns→ Developer D1 第2.3節 - フックの種類と書き方(
permissionDecision、updatedToolOutput) → Developer D1 第2.5節 AgentDefinitionの項目、サブエージェントが受け取るもの → Developer D1 第3.2節- 5つのワークフローパターン(チェーン、ルーティング、並列化、オーケストレーター・ワーカー、評価・最適化) → Developer D1 第1.4節
この章では、その上の「設計の判断」に言葉を使います。
名前の注意: 試験ガイドはサブエージェントを起動するツールを「Task ツール」と呼びます。今の公式ドキュメントでは名前が
Agentに変わりました(Claude Code v2.1.63 から。system:initのツール一覧では今も"Task"と表示されます)。試験では「Task ツール = Agent ツール」として読みます。allowedToolsに入れる名前は、今は"Agent"です。
1. エージェントループ(1.1)
1.1 ループの判断は stop_reason だけで行う
| stop_reason | 意味 | ループの動き |
|---|---|---|
"tool_use" |
Claude がツールを呼びたい | ツールを実行し、tool_result を履歴に足して、もう一度送る |
"end_turn" |
Claude が自分で終えた | ループを終える |
"max_tokens" など |
上限などで止まった | エラーではない。続きを頼む、上限を上げるなど(Developer D4) |
ツールの結果は会話の履歴に足します。だから Claude は、新しい情報を使って次の手を考えられます。
1.2 モデル主導と決定木の違い
| モデル主導(エージェント) | 事前に決めた決定木・ツール順序 | |
|---|---|---|
| 次に何をするか | Claude が文脈から考える | コードが決める |
| 向く場面 | 手順が前もって読めない仕事 | 手順が決まっている仕事、必ず守る順番があるところ |
| 試験での使い方 | ふだんはモデル主導 | 「必ずこの順番」(例: 本人確認の後に返金)だけ、第4節のゲートで強制する |
両方を組み合わせるのがふつうです。全体はモデルに任せ、外してはいけない順番だけをコードで止めます。
1.3 アンチパターン(試験によく出る)
| アンチパターン | なぜだめか | 正しい方法 |
|---|---|---|
| 応答の文に「完了しました」とあれば終える | 自然言語は形が決まっていない。途中でも書くことがある | stop_reason を見る |
| 反復の上限(例: 10回)を主な停止手段にする | 仕事の途中で切れる。上限は安全装置 | 上限は暴走防止として残し、主な判断は stop_reason |
| 応答にテキストがあれば完了とみなす | Claude はツールを呼ぶ前にも説明を書く | stop_reason が "tool_use" なら続ける |
max_turns や max_budget_usd は「安全装置」です(Developer D1 第2.3節)。設定するのは正しいですが、「これで終わりを決める」は誤りです。
2. コーディネーター・サブエージェント型(1.2)
2.1 ハブ・アンド・スポーク
┌─ Web検索サブエージェント
コーディネーター ─┼─ 文書分析サブエージェント
(ハブ) ├─ 統合サブエージェント
└─ レポート作成サブエージェント
- サブエージェント同士は直接話さない。すべてコーディネーターを通る
- 理由: 可観測性(何が起きたか1か所で見える)、エラー処理をそろえる、情報の流れを制御する
- サブエージェントは分離されたコンテキストで動く。コーディネーターの会話履歴は自動では届かない(第3節)
2.2 コーディネーターの仕事
| 仕事 | 内容 |
|---|---|
| タスク分解 | 大きな問いをサブタスクに分ける |
| 委任 | どのサブエージェントに何を頼むか決める |
| 動的な選択 | 問いの複雑さで呼ぶ相手を変える。簡単な問いに毎回フルパイプラインを通さない |
| 範囲の割り当て | サブトピックや情報源の種類ごとに分け、重複を減らす |
| 集約と評価 | 結果をまとめ、抜けがあれば絞った問いで再委任する |
2.3 分解が狭すぎるリスク
コーディネーターの分解が狭いと、サブエージェントが全員正しく動いても、報告全体に穴が開きます。
例: 「AI が創造的な産業に与える影響」を、デジタルアート・グラフィックデザイン・写真の3つだけに分けた。音楽・文章・映画が抜ける。
見分け方: 各サブエージェントは「頼まれたこと」は正しくこなしている。問題は「何を頼んだか」。原因はコーディネーターの分解です。下流のエージェントを直しても治りません。
2.4 反復改善ループ
- コーディネーターがサブタスクを配る
- 結果を統合する
- コーディネーターが抜けを評価する(どの観点が足りないか)
- 抜けの部分だけ、絞った問いで検索・分析サブエージェントに再委任する
- 十分に網羅できるまで 2〜4 をくり返す
Anthropic の調査システムでも、リードエージェントが結果を見て「もっと調べるか」を判断し、必要ならサブエージェントを追加しています(Multi-agent research system)。
3. サブエージェントの呼び出しと情報の渡し方(1.3)
3.1 呼び出しのしくみ
| 項目 | 試験ガイドの書き方 | 今の公式ドキュメント |
|---|---|---|
| サブエージェントを起動するツール | Task ツール | Agent ツール(旧名 Task) |
| コーディネーターに必要な設定 | allowedTools に "Task" |
allowedTools に "Agent"。検出のコードでは両方の名前を確かめるよう勧めている |
| サブエージェントの定義 | AgentDefinition(説明、システムプロンプト、ツール制限) |
同じ。description、prompt、tools など |
AgentDefinition の tools で、種類ごとに使えるツールを絞ります(第2章 2.3 の「ツールの配分」とつながる)。
3.2 コンテキストは明示的に渡す
サブエージェントは、親の会話履歴もツールの結果も受け取りません。呼び出し間でメモリも共有しません。受け取るのは、自分のシステムプロンプトと、呼び出しのプロンプトです(フォークは例外。下の 3.5)。
だから:
- 前のエージェントの結果を、次のサブエージェントのプロンプトに丸ごと入れる。例: Web検索の結果と文書分析の結果を、統合サブエージェントのプロンプトに入れる
- 「さっきの結果を使って」は通じない。中身を書く
3.3 構造化して出典を保つ
エージェント間で結果を渡すときは、本文とメタデータを分けた構造にします。
{
"claims": [
{
"claim": "2025年の市場規模は約120億ドル",
"source_url": "https://example.com/report",
"document_name": "業界レポート2025",
"page": 14,
"excerpt": "...市場規模は約120億ドルに達した...",
"published_date": "2025-03-01"
}
]
}
散文の要約だけで渡すと、どの主張がどの出典から来たかが消えます(第5章 5.6 の出典管理)。
3.4 並列に生成する
複数のサブエージェントを同時に動かしたいときは、コーディネーターの1回の応答の中に、複数の Task(Agent)ツール呼び出しを並べます。1つずつ別のターンで呼ぶと、順番に待つことになり遅くなります。
| やり方 | 結果 |
|---|---|
| 1回の応答に3つの Agent 呼び出し | 3つが並列に動く |
| 3ターンに分けて1つずつ呼ぶ | 前が終わるまで次が始まらない |
Anthropic の調査システムでは、リードエージェントが3〜5個のサブエージェントを並列に起動し、複雑な問いの調査時間を最大90%縮めたと報告しています(Multi-agent research system)。
3.5 コーディネーターのプロンプトの書き方
- 手順を細かく指示するより、調査の目的と品質の基準を伝える。サブエージェントが状況に合わせて動ける
- 各サブエージェントへの依頼には、目的、出力の形、使うべきツールや情報源、仕事の範囲(どこまでやるか)を書く。Anthropic の記事も、あいまいな依頼は重複や抜けを生むとしている
3.6 フォーク型のセッション
共通の分析を終えた時点から、別々の方針を試したいときはフォークします(第7節)。フォークしたサブエージェントは、親の会話をコピーして始まります。
4. 強制と引き継ぎ(1.4)
4.1 プロンプトの誘導 と プログラムの強制
| プロンプトによる誘導 | プログラムによる強制(フック、前提条件ゲート) | |
|---|---|---|
| 守られる確率 | 高いが100%ではない | 決定的(コードが止める) |
| 向く場面 | 好み、書き方、ふつうの手順 | お金、本人確認、法令、取り消せない操作 |
| 例 | 「まず顧客を確認してください」とシステムプロンプトに書く | get_customer が確認済み ID を返すまで process_refund を拒否する |
試験の目印: 「本番で 12% のケースで確認を飛ばした」「誤った返金が起きた」のように、失敗に金銭的な影響があるなら、答えはプログラムによる強制です。few-shot 例やプロンプトの強調は「確率的」なので不十分です。
4.2 前提条件ゲートの例(考え方)
verified_customer_id = None # セッションの状態
async def gate_refund(input_data, tool_use_id, context):
# PreToolUse フック: 確認済みの顧客がいなければ、注文・返金のツールを止める
name = input_data["tool_name"]
if name.endswith(("lookup_order", "process_refund")) and verified_customer_id is None:
return {"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "先に get_customer で顧客を確認してください",
}}
return {}
拒否の理由は Claude に届くので、Claude は次に get_customer を呼べます。MCP ツールの名前は Agent SDK では mcp__<サーバー名>__<ツール名> の形になるため、例では末尾で判定しています。
4.3 複数の問題を含む依頼
顧客が1通のメッセージで「返品したい」「請求が二重」「住所を変えたい」と言ったとき:
- 個別の項目に分ける
- 共有のコンテキスト(顧客 ID、注文一覧)を使って、それぞれを並列に調べる
- 1つの回答にまとめて返す
4.4 人への引き継ぎ(エスカレーション)の要約
人の担当者は、エージェントの会話記録を見られないことが多いです。だから、引き継ぎには構造化した要約を付けます。
| 項目 | 例 |
|---|---|
| 顧客 ID | C-10293(確認済み) |
| 問題の要約 | 同じ注文で二重に請求された |
| 根本原因の分析 | 決済の再試行で2回目の請求が成立した |
| 金額 | 返金予定 12,800円 |
| すでにしたこと | 注文と請求履歴を確認。返金は上限を超えるため止めた |
| 推奨アクション | 2回目の請求の取り消しを承認する |
「会話の全文を渡す」は答えになりにくいです。担当者が読む時間がかかり、要点が埋もれます。
5. Agent SDK のフック(1.5)
フックの書き方は Developer D1 第2.5節 で学びました。ここでは試験の2つの使い方をおぼえます。
5.1 PostToolUse: 結果をそろえてからモデルに渡す
MCP ツールごとに、データの形がばらばらなことがあります。
| ツール | 日付 | ステータス |
|---|---|---|
lookup_order |
Unix タイムスタンプ 1767225600 |
数字 3 |
get_shipping |
ISO 8601 2026-01-01T00:00:00Z |
文字 "delivered" |
PostToolUse フックで、モデルが読む前に1つの形(例: ISO 8601 と文字のステータス)にそろえます。今の Agent SDK では、PostToolUse の戻り値 updatedToolOutput で結果を差し替えられます(additionalContext で情報を足すこともできる)。
利点: プロンプトで「Unix 時刻は変換して読んで」と頼むより確実で、トークンも少なくてすみます。
5.2 PreToolUse: ルール違反の操作を止めて別の流れへ
例: 500ドルを超える返金は人の承認が必要。
process_refundの PreToolUse フックで金額を見る- 上限を超えたら
permissionDecision: "deny"と理由を返す - 理由に「escalate_to_human を使って」と書けば、Claude は人へのエスカレーションに切り替えられる
5.3 フックか、プロンプトか
| 要件 | 選ぶもの |
|---|---|
| 必ず守る業務ルール(上限額、本人確認、禁止操作) | フック |
| データの形をそろえる | PostToolUse フック |
| 口調、説明のしかた、判断の目安 | プロンプト |
公式の Claude Code のドキュメントも、「必ず決まったときに動かすこと」は CLAUDE.md ではなくフックに書くよう勧めています(Memory)。
6. タスク分解の戦略(1.6)
6.1 固定のチェーン と 動的な分解
| プロンプトチェーン(固定の逐次パイプライン) | 動的な分解 | |
|---|---|---|
| 形 | 段階が前もって決まっている | 途中の発見から次のサブタスクを作る |
| 向く仕事 | 予測できる多面的な仕事(例: コードレビュー、決まった項目の抽出) | 答えの決まっていない調査(例: 「なぜ遅いのか調べて」) |
| 利点 | 各段階が簡単で、検証しやすい | 新しい発見に合わせて計画を変えられる |
6.2 大きなコードレビューを分ける
多くのファイルを1回で見ると、注意が分散します。詳しく見るファイルと浅いファイルが出て、同じ書き方を片方では指摘し、もう片方では見逃します。
- ファイルごとのパス: 各ファイルのローカルな問題を見る
- 統合パス: ファイルをまたぐデータの流れ、呼び出しの整合性を見る
これは第4章 4.6 の「複数パスのレビュー」と同じ考えです。
6.3 答えの決まっていない仕事の分け方
例: 「レガシーコードに十分なテストを追加して」
- まず構造を把握する(モジュール、入口、依存関係)
- 影響の大きい部分を特定する(よく使われる、壊れると困る、テストがない)
- 優先順位付きの計画を作る
- 依存関係がわかるたびに、計画を見直す
最初から全ファイルに順番にテストを書く、は誤りです。
7. セッションの状態・再開・フォーク(1.7)
7.1 道具
| 道具 | どこで | 意味 |
|---|---|---|
claude --resume <名前> |
Claude Code CLI | 名前を付けたセッションを再開する(/rename で名前を付ける) |
resume(セッション ID) |
Agent SDK | 特定のセッションを再開する |
continue / continue_conversation |
Agent SDK | このディレクトリの最新のセッションを再開する |
fork_session(Python)/ forkSession(TypeScript) |
Agent SDK | 元の履歴をコピーした新しいセッションを作る。元は変わらない |
--fork-session |
Claude Code CLI | --resume と一緒に使い、新しい ID で分ける |
フォークの例: 認証モジュールの分析を終えたセッションから、「JWT の方針」と「OAuth2 の方針」を別々に試す。2つの枝は別々に再開できます(Session management)。
7.2 再開するか、要約で新しく始めるか
| 状況 | 選ぶ方法 |
|---|---|
| 前のコンテキストがほぼ有効(ファイルは変わっていない、続きの質問) | 再開する |
| 前のツール結果が古い(ファイルが大きく変わった、日をまたいでデータが更新された) | 構造化した要約を入れた新しいセッション |
| 一部のファイルだけ変わった | 再開して、どのファイルがどう変わったかを具体的に伝える。全体の再探索ではなく、絞った再分析をさせる |
公式の Agent SDK のドキュメントも、別のホストで再開する方法の1つとして「再開に頼らず、必要な結果(分析、決めたこと、差分)をアプリの状態として保存し、新しいセッションのプロンプトに入れる。こちらのほうが堅牢なことが多い」としています。
古いツール結果のまま再開すると、Claude はもう存在しない関数やデータを前提に考えることがあります。
8. 試験に向けたまとめ
| 問われ方 | 答えの考え方 |
|---|---|
| ループをいつ止めるか | stop_reason が "end_turn"。文章や反復の上限ではない |
| 報告に分野の抜けがある。各サブエージェントは正常 | コーディネーターの分解が狭い |
| サブエージェントが前の結果を知らない | プロンプトに中身を明示的に入れる |
| サブエージェントを速く動かす | 1回の応答で複数の Task(Agent)呼び出し |
| 出典が消える | 本文とメタデータを分けた構造で渡す |
| お金・本人確認の順番を必ず守らせる | フックや前提条件ゲート。プロンプトではない |
| ツールごとに日付の形が違う | PostToolUse フックで正規化 |
| 上限を超える返金 | PreToolUse フックで止め、エスカレーションへ |
| 人に引き継ぐ | 顧客 ID、根本原因、金額、推奨アクションの構造化要約 |
| 予測できる多面的な仕事 / 答えの決まっていない調査 | プロンプトチェーン / 動的な分解 |
| 同じ分析から2つの方針を比べる | fork_session |
| ファイルが変わった後の再開 | 変わったファイルを伝える。古すぎるなら要約で新規 |
9. 用語集
| 用語 | 意味 |
|---|---|
| コーディネーター | サブエージェントに仕事を配り、結果をまとめるエージェント |
| ハブ・アンド・スポーク | すべての通信が中心(ハブ)を通る形 |
| Task ツール / Agent ツール | サブエージェントを起動するツール。今の名前は Agent |
| 前提条件ゲート | 前のステップが終わるまで次のツールを止めるしくみ |
| 正規化 | ばらばらなデータの形を1つにそろえること |
| フォーク | 会話の履歴をコピーして、別の枝を作ること |
出典
- Claude Certified Architect – Foundations Exam Guide(PDF、Version 1.0、2026年7月): 第6章 ドメイン1 のタスクステートメント、第9章のサンプル問題
- How the agent loop works(Claude Code Docs): ループ、メッセージの種類、上限
- Subagents in the SDK(Claude Code Docs):
AgentDefinition、コンテキストの受け渡し、Task から Agent への名前の変更、フォーク - Intercept and control agent behavior with hooks(Claude Code Docs): PreToolUse / PostToolUse、
permissionDecision、updatedToolOutput - Session management(Claude Code Docs): continue、resume、fork、再開に頼らない方法
- Memory(Claude Code Docs): 必ず動かすものはフックに
- How we built our multi-agent research system(Anthropic Engineering): リードエージェントとサブエージェント、並列化、依頼の書き方
- Building effective agents(Anthropic Engineering): ワークフローとエージェント、プロンプトチェーン
注意: 第4.2節のコードは考え方を示す例で、そのまま動く完全なプログラムではありません。Agent SDK と Claude Code は更新が速いので、本番前に公式ドキュメントで確かめてください(2026年11月時点の内容)。内容は上の出典を要約・言い換えたものです(ライセンスに配慮して書き直しています)。