このページの目次
本番環境向けチェックリスト
これまでの全章を「評価セットの作成」から「グレープリリース」、そして「オンラインでの失敗ごとに回帰テストを追加」というリリースライフサイクルへと結びつけます。これはAIセクションの最終ページであり、いつでも参照できるチェックリストです。
概要
これまでの10数章では、モデル、コンテキスト、エージェント、アプリケーションパターンを個別に解説しました。本章ではその逆で、LLM/エージェントアプリケーションのリリース順序に従ってそれらを結びつけ、総括的なまとめとして、かつチェック可能なチェックリストとして機能させます。
一貫して貫かれる2つの核心的な信念があります。
- 評価なしに改善はあり得ない。 プロンプトを変更し、モデルを交換し、ツールを追加したとして、なぜ「良くなった」と言えるのか?——それは勘ではなく、評価(eval)によるものです(評価と観測可能性参照)。
- リリースするかどうかをまず確認し、次に方法について議論する。 ワークフロー で記述できるものはエージェントにせず、単一エージェント で対応できるものはマルチエージェントにしない——最も安定したシステムは、最もシンプルなものです。
リリースライフサイクル
flowchart TD
A["① レベルの選択<br/>ワークフロー?エージェント?マルチエージェント?"] --> B["② 評価セットの構築<br/>小さく現実的、境界ケースを含む"]
B --> C["③ プロンプト/モデル/イフェルトの調整<br/>評価セットに対して調整"]
C --> D["④ 保護の導入<br/>サンドボックス/権限/インジェクション/シークレット"]
D --> E["⑤ 観測可能性の接続<br/>トレース + 使用量 + 停止理由"]
E --> F["⑥ グレープリリース<br/>少量トラフィック、ロールバック可能"]
F --> G["⑦ オンラインでの失敗<br/>回帰評価として固定"]
G --> C
以下、各段階ごとのチェック項目を示します。各項目は、詳細な解説がある該当章へのリンクを指しています。
① レベルの選択:安易にエージェントを使わない
エージェントを導入する前に、4つの関門 を通過してください(いずれかでも「No」であれば、よりシンプルなレベルに戻ってください)。
- 複雑さ: タスクが複数ステップに分かれており、事前に完全に規定できないか?(フローをハードコードできる場合 → ワークフローを使用)
- 価値: その結果は、より高いコストとレイテンシに見合うか?
- 実現可能性: モデルは本当にこの種の仕事が得意か?
- エラーのコスト: 失敗した場合に検知およびロールバックできるか?(テスト/監査/フォールバックがあるか)
マルチエージェントの場合、さらに1つ質問を追加します。単一エージェント+良いツールでは解決できない場合にのみ、マルチエージェントを採用する(マルチエージェント オーケストレーション参照)——マルチエージェントは調整オーバーヘッド、コンテキスト同期、デバッグの複雑さを導入します。
② まず評価セットを作り、調整を始める
最も重要なプラクティス:手を動かす前に、小さく現実的な評価セットを持つこと。 20件程度の代表性のあるタスク(既知の失敗ケースや境界ケースを含み、ハッピーパスだけでなく)でも、単一の勘に頼るよりもはるかに優れています(評価と観測可能性参照)。
- 評価セットには、順調なシナリオだけでなく失敗/境界ケースが含まれている。
-
採点は信頼性の高い順:プログラム可能な検証 > LLM-as-judge > 結果スコアリング。
assertで検証できる場合は審判を呼ばない——構造化出力 を用いることで、この種の検証を安定して実行可能にする。 - LLM 審判はテスト対象から分離する(自己採点を避ける)、独立して判定可能なルーブリックを与える。
③ 勘ではなく評価セットに対して調整する
- プロンプト: 「必須」を羅列するのではなく、「いつ/境界」を記述する。正例は反例よりも優れている(プロンプトエンジニアリング参照)。
-
イフェルト (effort): 最初は
highで始め、評価セット上でmedium/high/xhighをスキャンして決定する——関係性は単調ではない(推論と思考参照)。 -
サンプリングパラメータ: 新モデルでは既に削除されている。旧コードの
temperatureは削除し、プロンプトとイフェルトに置き換える。 -
出力形状: 下流に渡す場合は
output_config.format/strictを使用する。「JSONを返してください」という頼みに頼らないこと。 - 知識: 私有/リアルタイム知識は RAG を通じて処理し、生成を調整する前にまず recall@k を最大化する。
- コンテキスト予算: 安定するまでプレフィックスを固定してキャッシュを確保し、動的なコンテンツは後続に配置する。長文の会話には圧縮 (compaction) やコンテキスト編集を使用する。
④ 保護の導入:モデルの出力は信頼できないものとする
リリース前に、セキュリティと保護 のゲートをすべて設置する。
- bash/ツール: 隔離された環境 + 許可リスト + タイムアウト + ログ;コマンドは信頼できない出力として扱う。
-
パス: 正規化 + 境界検証、
../シンボリックリンク/URLエンコードされたトラバーサルを拒否する。 - 危険な操作: 不可逆的な操作はヒューマン・イン・ザ・ループとし、可逆性に基づいて階層化し、最小権限を適用する。
-
インジェクション: ツールの出力はデータとして扱い、指示として扱わない。オペレータの指示は
role:systemの信頼できるチャネル経由で渡す。 - シークレット/PII: コンテキスト/メモリ/プロンプトに決して含めない。資格情報はプロキシ経由で注入し、マルチテナントを分離する。
-
出力側:
contentを読み取る前にstop_reasonを確認する(拒否処理を行う)。SQL/HTML/shell に出力する前に、パラメータ化されたエスケープを適用する。
⑤ 観測可能性の接続:「どのステップで問題が発生したか」に答えられるようにする
観測可能性なしでのリリース=大惨事。評価と観測可能性 を接続する。
-
トレース/スパン: 各
tool_use/tool_result/モデル呼び出しごとにスパンを作成し、レイテンシとコストを段階的に帰属させる(本サイトでは構築時にOTelを初期化している)。 -
使用量:
input/output_tokens、cache_read_input_tokens(長期間0の場合=キャッシュが静かに無効化されている)、cache_creation_input_tokensを監視する——合計はこれら3つの和であり、1つのフィールドだけを見てはいけない。 -
stop_reason の分布:
max_tokensが高い=出力が切り捨てられている;refusalが異常に高い=プロンプトが拒否をトリガーしている;pause_turnが多い=サーバー側のツールループが継続している。 - コスト/レートリミット: キャッシュヒット率、429 の頻度をダッシュボードに表示する(コスト、パフォーマンス、信頼性参照)。
⑥ グレープリリース:制御可能、ロールバック可能
- ストリーミング: 長入力/長出力はすべてストリーミングとし、非ストリーミングHTTPタイムアウトを回避する。
- リトライ/冪等性: 429/5xx のみリトライする。副作用のあるアクションには冪等キーと人間の確認を付与する。
-
帰属: 並列/Batches の結果は
custom_id/トレースIDで対応させ、順序に頼らない。 - 少量トラフィックから開始: 新しいプロンプト/モデルはまず少量のトラフィックでグレープリリースし、評価セットとオンライン指標を比較してから拡大する。ロールバック経路を残す。
- モデル変更時のキャッシュ注意: モデルを変更すると、該当セグメントのキャッシュは無効化され、トークンのベースラインを再計算する必要がある。メインループ内で中途半端に切り替えない(マルチエージェント オーケストレーション参照)。
⑦ 回帰:失敗ごとに防御線を追加する
- オンラインで失敗を発見するたびに、それを1つの評価ケースとして固定する——これこそが、時間が経つにつれて評価セットを強化する方法である(評価と観測可能性参照)。
- ③に戻って再調整し、完全な評価を実行して劣化がないことを確認してから、再度リリースする。
ベストプラクティス(全セクションの凝縮)
- まず評価し、その後改善する。 小さく現実的な評価セットは、すべての変更の審判である。それなしでは、すべての「最適化」は賭け事である。
- シンプルさを保つ。 ワークフロー > 単一エージェント > マルチエージェント;レベルを上げるごとに発生する調整コストが、リターンに見合う必要がある。
- ウィンドウを予算として管理する。 キャッシュのプレフィックス固定、検索による無理な埋め込みの回避、イフェルトによる深さの調整——これら3つがコストと品質を管理する。
- モデルの出力はすべて信頼できないものとする。 セキュリティの境界はホスト側の実行環境に設ける:サンドボックス、パス検証、危険な操作の承認、シークレットをコンテキストに入れない。
- 各ステップを定量化する。 トレース + 使用量 + stop_reason により「どのステップが間違っていたか」が見える化する。観測可能性が欠如していれば、それは闇雲な変更である。
- 作成とレビューは別のレーンで行う。 実行するエージェント自身を検証しない。別のレビュアー/検証者を独立したコンテキストで評価させる(マルチエージェント オーケストレーション参照)。
- オンラインでの失敗 → オフラインでの回帰。 各事故が1つの評価ケースとなり、防御線は増えるだけで減らない。
トレードオフと失敗パターン
- 評価なしでの調整: 勘で変更し、「良くなった」のか「別の間違い方に変えただけ」なのか区別できない → まず20件の現実的な評価セットを構築する。
- 反射的なエージェント/マルチエージェントの導入: 調整オーバーヘッド > リターン、かつデバッグがさらに困難になる → 4つの関門を通過し、ワークフローで済むならエージェントにしない。
- 観測可能性なしでのリリース: 問題が発生した際にどのステップで起きたか、トークンをどれくらい消費したかがわからない → トレース + 使用量 + stop_reason をまず接続する。
- キャッシュヒット率の監視漏れ: コストが気づかないうちに数倍になってから発見する →
cache_read_input_tokensをダッシュボードに追加する。 - ハッピーパスのみのテスト: オンラインで境界ケースに遭遇するとすぐに崩壊する → 評価セットに境界を含め、事故の発生とともに成長させる。
- 実行エージェントの自己評価: 自己認証となる → レビューは別の独立したレーンで行う。
- プロンプト/モデルの全量一括リリース: 回帰での比較ができず、事故発生時にロールバックが困難 → グレープリリース + ロールバック経路の確保 + 完全な評価の実行。
参考
- Anthropic 公式ドキュメント: Building Effective Agents、Building Evals、Observability、Handling Stop Reasons (platform.claude.com、実装前に公式情報を優先すること)
- 全セクションへのリンク: コンテキストエンジニアリング、トークンとサンプリング、モデルアーキテクチャ、推論と思考、エージェントループとツール、MCPとスキル、メモリと状態、マルチエージェント オーケストレーション、評価と観測可能性、RAGと検索拡張生成、プロンプトエンジニアリングと構造化出力、コスト、パフォーマンス、信頼性、セキュリティと保護
Keywords: 本番化, production checklist, リリースライフサイクル, eval-first, workflow vs agent, グレープリリース, canary, ロールバック, rollback, regression, 回帰, observability, trace, span, OTel, usage, stop_reason 分布, プロンプトキャッシュ, RAG, 構造化出力, 保護, サンドボックス, secret, human-in-the-loop, 冪等性, authoring vs review lane, チェックリスト