← 試験の目次へ

Architect Foundations ドメイン4: プロンプトエンジニアリングと構造化出力(20%)

この章で学ぶこと: 誤検知を減らす明確な基準、few-shot 例、tool_use と JSON スキーマによる構造化出力、検証と再試行のループ、バッチ処理、複数インスタンス・複数パスのレビュー。

本番の60問のうち約12問が出ます。

タスクステートメント この章の節
4.1 明確な基準で精度を上げ、誤検知を減らす 第1節
4.2 few-shot で一貫性と質を上げる 第2節
4.3 ツール利用と JSON スキーマで構造化出力を強制する 第3節
4.4 検証・再試行・フィードバックのループ 第4節
4.5 バッチ処理の戦略 第5節
4.6 複数インスタンス・複数パスのレビュー 第6節

Developer Foundations で学んだ基本(ここでは繰り返しません):


1. 明確な基準で誤検知を減らす(4.1)

1.1 あいまいな指示 と 明確な基準

あいまい 明確
「コメントが正確か確認して」 「コメントの主張が、実際のコードの動きと矛盾するときだけ指摘する」
「重要な問題だけ報告して」 「報告する: バグ(誤った結果・例外)、セキュリティ(注入、認可の抜け)。報告しない: 命名の好み、空白、ローカル変数の書き方」
「控えめに」「確信度の高いものだけ」 何を報告し何を飛ばすかを、カテゴリで決める

「控えめに」「確信度が高いものだけ」のような一般的な指示は、具体的なカテゴリの基準ほど精度を上げません。モデル自身の確信度は、当てになる目盛りではないからです(第5章 5.2)。

1.2 誤検知の多いカテゴリが信頼を壊す

あるカテゴリ(例: 「性能の指摘」)の誤検知が多いと、開発者は正確なカテゴリ(例: 「セキュリティの指摘」)まで読まなくなります。

対策:

  1. 誤検知の多いカテゴリを一時的に止める(報告しない)
  2. そのカテゴリのプロンプト(基準と例)を直す
  3. 精度を確かめてから戻す

1.3 重大度の基準にはコード例を付ける

重大度 基準 例
高 データの損失、セキュリティの穴 SQL を文字列の連結で組み立てている
中 誤った結果になりうる 割り算の前にゼロのチェックがない
低 保守性 同じ処理のコピーが3か所

例があると、分類が回ごとにぶれにくくなります。


2. few-shot プロンプト(4.2)

2.1 なぜ few-shot か

詳しい指示を書いても結果がぶれるとき、few-shot 例が、形のそろった、実行できる出力を得る最も効果的な方法です。公式のプロンプトのドキュメントも、例を「出力の形・口調・構造を導く最も確かな方法の1つ」とし、いくつかのよく作った例(関係が深い、多様、<example> タグで囲む)を勧めています。試験ガイドは「あいまいなシナリオ向けに2〜4個」と書きます。数より「的を絞った多様な例」が要点です。

2.2 何を見せるか

目的 例の作り方
あいまいな場面の判断 「この依頼ではツール A を選ぶ。B ではない理由は〜」のように、選んだ理由ともっともらしい代案を退けた理由を示す
出力の形をそろえる 場所、問題、重大度、修正案を毎回同じ形で書いた例
誤検知を減らす 「この書き方は問題ない(理由)」と「これは本当の問題(理由)」の対の例
さまざまな文書構造 本文中の引用と巻末の参考文献一覧、方法論の章と本文に埋め込まれた方法の説明、それぞれの正しい扱い
必須の項目が空になる 形式の違う文書から正しく抜き出した例を足す
くだけた表記 「2コ」「半ダース」「約3kg」などの単位の扱い

few-shot 例は、見せたケースだけでなく、新しいパターンにも判断を一般化させます。抽出のハルシネーション(文書にない値を作る)を減らすのにも効きます。

2.3 例の置き方


3. ツール利用と JSON スキーマで構造化出力(4.3)

3.1 試験ガイドの考え方

方法 構文の正しさ
プロンプトで「JSON で答えて」 壊れた JSON が出ることがある
JSON スキーマを持つツールを定義し、tool_use の入力として受け取る スキーマに合った構造。JSON の構文エラーがなくなる(strict: true で保証)
tools = [{
    "name": "record_invoice",
    "description": "請求書から抜き出した値を記録する。文書にない値は null にする。",
    "strict": True,
    "input_schema": {
        "type": "object",
        "properties": {
            "invoice_number": {"type": "string"},
            "issue_date": {"type": ["string", "null"], "description": "YYYY-MM-DD"},
            "total": {"type": "number"},
            "currency": {"type": "string", "enum": ["JPY", "USD", "EUR", "other"]},
            "currency_detail": {"type": ["string", "null"]},
            "category": {"type": "string", "enum": ["goods", "services", "unclear", "other"]},
        },
        "required": ["invoice_number", "issue_date", "total", "currency", "currency_detail", "category"],
        "additionalProperties": False,
    },
}]
# 応答の content から type == "tool_use" のブロックを探し、block.input を取り出す

3.2 tool_choice(試験ガイドの書き方)

値 抽出での使い方
"auto" テキストだけ返すことがある。抽出には不向き
"any" 抽出スキーマが複数あり、文書の種類がわからないとき。必ずどれかのツールを呼ぶ
{"type": "tool", "name": "extract_metadata"} 補強(enrichment)の前に、メタデータの抽出を必ず先にやらせる

今のモデルでの書き方(2026年11月時点): Claude Opus 5.5・Sonnet 5.5・Fable 5.1・Mythos 5.1 と、手動の extended thinking では、"any" と {"type": "tool"} が 400 エラーになります。公式ドキュメントが勧める代わりは次のとおりです。

試験では、ガイドの書き方(tool_use + tool_choice の強制)で答えます。

3.3 スキーマが防げるもの・防げないもの

防げる(構文) 防げない(意味)
壊れた JSON、項目の欠け、型の違い 明細の合計が総額と合わない
enum にない値 値が別の項目に入る(請求日に支払期日が入る)
— 文書にない値をそれらしく作る

意味のエラーには、第4節の検証が必要です。

3.4 スキーマ設計のこつ

こつ 理由
文書にないかもしれない項目は nullable(任意)にする 必須にすると、モデルが値をでっち上げて埋める
enum に "other" と、詳細を書く文字列の項目を足す 想定外の分類を受け止められる(拡張できる)
あいまいなとき用に "unclear" を足す 無理にどれかへ入れさせない
書式の正規化ルールをプロンプトに書く 例: 「日付は YYYY-MM-DD に直す」「金額は数字だけ」。元の書式がばらばらでも、スキーマに合う値にそろう

「任意」の書き方は2つあります。required に入れない(項目ごと省ける)か、required に入れたまま型に null を許す(nullable。値がないと明示できる)かです。上の例は後者で、「文書になかった」ことが null で残るので下流で扱いやすくなります。

厳密な構造化出力(strict: true や output_config.format)の注意(2026年11月時点の公式ドキュメント):


4. 検証・再試行・フィードバックのループ(4.4)

4.1 エラーを伝えて再試行

1回目: 抽出する
検証する(Pydantic などで、意味のチェック)
  例: 明細の合計 9,800 ≠ 総額 10,800
2回目のリクエストに入れるもの:
  - 元の文書
  - 失敗した抽出の結果
  - 具体的な検証エラー(「明細の合計と総額が 1,000 円ずれている。明細を見落としていないか確認して」)

具体的なエラーを渡すと、モデルは何を直せばよいかわかります。「もう一度やって」だけでは同じ間違いをくり返しがちです。

4.2 再試行が効く場合・効かない場合

効く 効かない
書式の不一致(日付の形が違う) 必要な情報が元の文書にそもそもない
出力の構造のエラー 情報が、渡していない別の文書にしかない(例: 請求書の総額が、添付していない注文書にだけある)
明細の見落とし —

効かない場合は、再試行をくり返さず、null にする、人のレビューに回す、必要な文書を追加で取ってくる、のどれかにします。

4.3 自己修正の検証フローを組み込む

項目 役割
stated_total 文書に書かれている総額
calculated_total 明細から計算した総額
conflict_detected(真偽値) 元の文書の中で値が矛盾しているか

2つの総額を並べて抜き出させると、食い違いが機械で見つけられます。矛盾は「直す」のではなく「印を付けて」下流や人に知らせます。

4.4 フィードバックループ: detected_pattern

コードレビューの指摘に detected_pattern(どのコードの書き方が指摘を生んだか)の項目を足します。

{"file": "api/orders.py", "line": 42, "issue": "例外を握りつぶしている",
 "severity": "medium", "detected_pattern": "except Exception: pass"}

開発者が却下した指摘を detected_pattern ごとに集計すると、「どの書き方で誤検知が多いか」がわかり、基準と例を体系的に直せます。


5. バッチ処理の戦略(4.5)

5.1 Message Batches API の要点

特徴 内容
コスト 50% 削減
処理時間 最大24時間。多くは1時間以内に終わるが、レイテンシの保証(SLA)はない
対応づけ custom_id でリクエストと結果を対応づける(結果の順番は送った順とは限らない)
複数ターンのツール呼び出し 1つのリクエストの途中で、自分のツールを実行して結果を返すことはできない。1リクエスト = 1回の応答
完了の確認 ポーリング(processing_status が ended になるまで)

「複数ターン非対応」の意味: 過去の会話の履歴(複数ターンの messages)を入れて送ることはできますが、バッチの処理の中でエージェントループを回すことはできません。ツールを何度も使う仕事はバッチに向きません。

5.2 どちらを使うか

ワークフロー API
マージ前のチェック(開発者が待っている) 同期の Messages API
夜間の技術的負債レポート、週次の監査、夜間のテスト生成 Message Batches API

「両方バッチにして、遅ければ同期に切り替える」は複雑すぎる。「両方同期のまま、バッチは結果の順番が合わないから」は誤解(custom_id で対応づけられる)。

5.3 SLA から投入の間隔を計算する

例: 結果を30時間以内に出す約束(SLA)。バッチは最大24時間かかる。

試験ガイドの例は「4時間ごと」です。考え方は「SLA − 最大処理時間 = 投入までに使える時間」で、その範囲に入る間隔を選びます。

5.4 失敗の処理

  1. 結果の種類(succeeded、errored、canceled、expired)を見る
  2. 失敗したものだけを custom_id で特定する
  3. 原因に合わせて直す(例: コンテキストの上限を超えた文書は分割する)
  4. 失敗したものだけを再投入する(全部をやり直さない)

5.5 大量に流す前にサンプルで試す

1万件をいきなり投入しない。まず数十件のサンプルで、プロンプトとスキーマを直し、初回の成功率を上げる。再投入のコストと時間が減ります。バッチの各リクエストの検証は非同期なので、形は先に通常の Messages API で確かめます。


6. 複数インスタンス・複数パスのレビュー(4.6)

6.1 自己レビューの限界

同じセッションでコードを生成し、そのままレビューさせると、モデルは生成のときの推論をコンテキストに持っています。だから自分の判断を疑いにくいです。

やり方 効果
同じセッションで「自分の出力を見直して」 限定的
extended thinking を増やす 生成の文脈は残ったまま
生成の推論を持たない、独立した2つ目の Claude インスタンスでレビュー 微妙な問題を見つけやすい

6.2 複数パスのレビュー

大きな複数ファイルのレビューは、1回にまとめると注意が分散し、深さがばらつき、矛盾する指摘が出ます(同じ書き方を一方では指摘、もう一方では承認)。

  1. ファイルごとのパス: ローカルな問題
  2. 統合のパス: ファイルをまたぐデータの流れ、インターフェースの整合

誤答の定番:

誤答 なぜだめか
コンテキストの大きいモデルで1回にまとめる 大きなウィンドウでも注意の質の問題は解けない
3回レビューして2回以上出た指摘だけ たまにしか見つからない本当のバグを消してしまう
開発者に PR を3〜4ファイルに分けさせる システムを直さず、負担を人に移すだけ

6.3 確信度を付ける検証パス

検証のパスで、各指摘に確信度を自己申告させます。それを使って、確信度の高い指摘は自動でコメント、低い指摘は人が確かめる、のように振り分けます。

注意: 自己申告の確信度はそのままでは当てになりません。ラベル付きのデータでしきい値を調整してから使います(第5章 5.5)。


7. 試験に向けたまとめ

問われ方 答えの考え方
誤検知が多い 何を報告し何を飛ばすかを、カテゴリで具体的に決める。「控えめに」ではない
1つのカテゴリの誤検知で全体の信頼が落ちた そのカテゴリを一時的に止め、プロンプトを直す
指示を詳しくしても形がぶれる few-shot 例(2〜4個、理由付き、多様に)
壊れた JSON をなくす JSON スキーマ付きのツール(tool_use)、strict: true
文書の種類がわからない / 特定の抽出を先に tool_choice: "any" / 特定ツールの強制(新しいモデルでは代わりの方法)
モデルが値を作ってしまう その項目を nullable に
想定外の分類 enum に "other" と詳細の項目、"unclear"
合計が合わない スキーマでは防げない。検証して、具体的なエラーを渡して再試行
情報が文書にない 再試行は効かない
却下された指摘を分析 detected_pattern
マージ前のチェック / 夜間レポート 同期 / バッチ
SLA 30時間、バッチ24時間 6時間以内に投入(例: 4時間ごと)
バッチの一部が失敗 custom_id で特定し、直して失敗分だけ再投入
自分で書いたコードのレビュー 独立したインスタンス
14ファイルの PR のレビューがぶれる ファイルごとのパスと統合のパス

8. 用語集

用語 意味
誤検知(false positive) 問題でないものを問題として報告すること
few-shot プロンプトにいくつかの例を入れること
nullable 値として null を許すこと
意味のエラー 形は正しいが、中身が正しくないエラー
custom_id バッチのリクエストと結果を対応づける ID
SLA 処理を終える約束の時間
複数パス 1つの仕事を、目的の違う何回かの処理に分けること

出典

注意: 第5.3節の「4時間ごと」は試験ガイドの例で、計算の考え方は筆者の説明です。strict: true のスキーマの細かい条件は変わることがあるので、使う前に公式ドキュメントで確かめてください(2026年11月時点)。内容は上の出典を要約・言い換えたものです(ライセンスに配慮して書き直しています)。