原理と思想 — 本質理解
LLMの動作原理を理解し、業務で安全に活用するための判断軸を身につける
S1. 生成AIの正体 — 流暢なる無知
LLMは「それっぽいことを言う装置」である。流暢さと正確さは別物だ
実務での意味:流暢な出力は信頼の根拠にならない。特に数値・固有名詞・法的事実は必ず一次ソースで検証すること。
今日から何を変えるべきか:AIの出力を「叩き台」として扱い、SSOT照合・ボトムアップ検証・レビュー・承認のフローに組み込む。
素のLLMは確率的生成器である
LLMは「次に来る可能性が最も高いトークンを連続して選ぶ」という操作の繰り返しで動いている。入力テキストを数値ベクトルに変換し、学習済みの重みを通じて確率分布を計算し、そこからサンプリングする。検索でも計算でも記憶の呼び出しでもない。
LLM生成フロー — 確率的なトークン選択の繰り返し
タイピングアニメーション — 生成のしくみを体感する
実務では外部資料・SSOT・ツール・人間レビューが加わる
現実のAI活用では、素のLLMに加えて複数の補強機構が動作する。検索拡張(RAG)によって一次ソースの文書を文脈に注入したり、ツール呼び出しでリアルタイムのデータを取得したりする。それでも最終的な品質は人間のレビューと承認に依存する。
SSOT照合
数値・定義・固有名詞は必ずシステム・オブ・レコードと突き合わせる。AIの出力値をそのまま使わない。
ボトムアップ検証
合計と内訳が一致するか確認する。上から見て「それっぽい」ではなく、下から積み上げて正しいかを問う。
レビューと承認
生成物は必ずドメイン知識を持つ人間が確認する。流暢さを信頼の根拠にしない。
もっともらしさと正しさは別である
失敗例
AIに「我が社の昨年の売上を教えて」と尋ね、 返ってきた数値をそのまま報告資料に記載した。 実際は学習データにその情報が含まれておらず、 もっともらしい数値が生成されていた。
AIには「このCSV(実績データ添付)を 分析して傾向を要約して」と依頼する。 AIが使う数値は自分で提供したもの。 要約の論理はレビューで確認する。
良い運用
叩き台として使う
AIの出力を「完成品」ではなく「叩き台」として扱う。修正する前提で受け取る。
一次ソースで検証する
数値・固有名詞・法的事実は必ず一次ソース(SSOT)と突き合わせる。
ドメイン知識でレビューする
出力の論理・前提・結論を専門知識で評価する。「流暢かどうか」ではなく「正しいかどうか」を問う。
承認フローに組み込む
AI生成物は必ず人間の承認を経てから使用する。自動承認はしない。
判断基準
| 問い | AIに任せてよい | 人間が必ず確認する |
|---|---|---|
| 数値の正確性 | 傾向・パターンの指摘 | 具体的な数値そのもの |
| 事実の正確性 | 一般的な知識の整理 | 固有名詞・日付・法律 |
| 論理の整合性 | 構造の提案・要約 | 前提の正しさ・結論の妥当性 |
| 最新情報 | 学習カットオフ以前の知識 | リアルタイム・組織内情報 |
Stochastic Parrot問題 — "the underlying mechanism is still probabilistic pattern matching, not genuine reasoning or semantic grounding"
The Stochastic Parrot Problem and Why It Still Matters in AI System Design
S2. 文脈という有限資源
文脈は盛るものではなく設計するもの — 何を入れるかより何を残すか
実務での意味:「とにかく全部渡す」は逆効果になる。関連するものだけを精選し、必要な情報だけを提供することが品質を上げる。
今日から何を変えるべきか:プロンプトに情報を「盛る」発想をやめ、「何を残すか」を設計する発想に切り替える。
文脈は有限である
LLMが一度に処理できるテキストの量には上限(コンテキストウィンドウ)がある。Anthropicの表現を借りれば「LLMにはアテンションバジェットがある」。会話履歴・指示・参照ファイル・システムプロンプト、すべてがこの有限な空間を共有している。
コンテキストウィンドウの構成イメージ
長すぎるとノイズが増える
コンテキストが長くなるほど、AIは全体に均等に注目できなくなる傾向がある。重要な指示が文脈の途中に埋もれると、それが参照されにくくなる現象(context rot)が実務上問題になる。これは機構の詳細より「長い文脈では精度が落ちやすい」という現象として理解しておけば十分である。
添付します: - 過去3年分のすべての会議議事録 - 全部門の予算データ(未整理) - 関係するかもしれないメール200通 - 過去の類似案件資料 これを参考に提案書を書いてください。
目的:Q3の営業提案書(A4・2枚) 参照:今期の製品仕様書(添付) 制約:競合他社の名指し禁止 対象:製造業・中規模企業の調達担当 上記だけを根拠に構成案を出してください。
重要なのは「何を足すか」より「何を残すか」
Anthropicが「文脈エンジニアリング」と呼ぶ考え方の核心は、「LLM推論中に最適なトークンの集合をキュレーションし維持するための戦略」にある。「追加する」ではなく「最適化する」という発想の転換が必要だ。
補足: Transformerのアテンション機構とコンテキスト長の関係
Transformerモデルはアテンション機構により、入力全体の任意の位置に注目できる設計になっている。計算量はトークン数の二乗(n²)に比例するため、長い入力ほど計算負荷が増大する。
実装上、この計算量を抑えるための様々な近似手法が導入されているが、「長くなるほどすべての位置に均等に注目できなくなる」という傾向は残る。これがcontext rotとして知られる精度低下現象の背景にある。
断言できるのは「現象として精度が落ちやすい」こと。機構の内部動作の詳細は実装ごとに異なる。
補足: 文脈エンジニアリングとプロンプトエンジニアリングの違い
プロンプトエンジニアリングが「入力テキストの書き方」を最適化するのに対し、文脈エンジニアリングはより広い概念だ。何をシステムプロンプトに入れるか、どの資料を参照させるか、会話履歴をどの時点で切り捨てるか、といった設計全体を対象にする。
「良いプロンプトを書く」だけでなく、「AIが正しく動くために必要な情報の全体をどう設計するか」が問われている。
失敗例
ある担当者がドキュメント整理をAIに依頼した。「参考になるかもしれない」と判断した100ファイルを一括で貼り付けた結果、AIは重要な制約条件(ファイル末尾に記載)を参照できず、不適切な分類を大量に出力した。確認に要した時間は生成時間の10倍になった。
良い運用
目的を先に宣言する
最初に「何のための文脈か」を明示する。AIも人間も、目的が明確なほど不要な情報を除外しやすい。
資料は抜粋で渡す
全文でなく、関連する箇所のみを切り出して渡す。「ここに答えがある」という部分だけを提供する。
会話は適度に切る
長い会話セッションは途中でリセットする。蓄積された古い文脈が精度を下げる前に、新しいセッションで始める。
判断基準
| 状況 | 対処法 |
|---|---|
| 「念のため全部渡したい」と思ったとき | 一歩止まって、本当に必要な情報だけに絞る |
| AIの回答が途中からズレ始めたとき | セッションをリセットして指示を再設計する |
| 重要な制約を必ず守らせたいとき | 文脈の冒頭・末尾どちらかに明記する |
| 長い資料を参照させたいとき | 該当箇所を抜粋し、「この部分を参照してください」と明示する |
Anthropic文脈エンジニアリング — "the set of strategies for curating and maintaining the optimal set of tokens during LLM inference" / "LLMs have an attention budget"
Effective Context Engineering for AI Agents — Anthropic Engineering
S3. AIへの指示は「依頼」ではなく「設計」
指示の質が出力の質を決める — 6要素で設計する
実務での意味:「わかってくれるはず」が通じない。目的・条件・制約・入力・出力形式・評価観点の6要素を明示することで再現性が上がる。
今日から何を変えるべきか:指示を書いたら「この6要素のうち何が欠けているか」をチェックリストで確認してから送る。
指示の6要素
目的 — なぜやるのか
何のためのタスクかを最初に述べる。「営業提案書を書く」ではなく「製造業の調達担当を説得するための提案書を書く」と目的まで伝える。
条件 — どんな状況か
読者・業界・前提知識・役割などの文脈情報。「あなたはFP&Aアナリストです」という役割設定も条件の一部。
制約 — やってはいけないこと
「競合名を出さない」「専門用語は使わない」「3点以内に絞る」など。制約がないとAIは何でも足す方向に動く。
入力 — 参照する素材
AIに使わせたいデータ・文書・定義を具体的に提供する。「なんとなく知っているはず」は通用しない。
出力形式 — どんな形で返すか
箇条書き/散文、文字数、単位、言語、構成要素を指定する。Anthropicが「例は千の言葉に値する」と言うように、具体例を1つ示すと格段に精度が上がる。
評価観点 — 何をもって「良い」とするか
「簡潔さ・論理的整合性・実行可能性の順で優先」など、評価基準を示す。AIは明示されない基準は勝手に補完する。
Good/Bad比較 — なぜBadが失敗するのか
Badな指示では、AIが「空白」を確率的に補完する。学習データの中の「似た文脈でよく来るパターン」で埋めるため、意図と外れた出力が生成される。
売上データを分析して
Q3の月次売上(添付CSV)を分析し、 経営会議向けに3点の改善提案を 箇条書きで出してください。 金額は百万円単位、小数点1桁。
競合との違いをまとめて
競合製品Xとの機能比較表を作成してください。 制約:競合名は「他社製品A」と匿名化。 自社優位点は3点以内。根拠のない主張は禁止。
このメールに返信して
以下のメール(引用)に返信文を書いてください。 形式:ビジネス敬語、200字以内、 件名含む。謝罪は入れない。 --- (メール本文)
この企画書を改善して
添付の企画書を改善してください。 優先順位:1)論理構成の明確さ 2)実行可能性の具体性 3)読みやすさ 現在の文章は保持し、追記で改善点を示す形式で。
うちの商品の特徴を説明して
以下の製品仕様(添付)をもとに、 初めての顧客向けの特徴説明を書いてください。 専門用語は使わず、利用シーン3例を含む。 (製品仕様書の抜粋)
失敗例
ある担当者が「契約書のリスクを洗い出して」とだけ指示した。AIは「よくある契約書レビューのパターン」で確率的補完を行い、その会社特有の業法規制リスクを見落とした汎用的なチェックリストを返した。依頼者はそれをそのまま使い、後から弁護士に指摘を受けた。
判断基準
指示を送る前に次の問いを確認する。「AIがこの指示の空白部分を何で埋めるか」を想像できるなら、その空白は明示すべき箇所だ。
| 要素 | 欠けていると何が起こるか | 対処 |
|---|---|---|
| 目的 | 汎用的・当たり障りない出力になる | 「なぜやるか」を1文で先頭に書く |
| 条件 | 想定と異なる読者・立場で書かれる | 役割・業界・専門レベルを明示 |
| 制約 | 不要な情報が大量に足される | 「〜しない」を明記する |
| 入力 | 学習データの一般論で補完される | 参照させる資料を直接貼る |
| 出力形式 | 形式が毎回変わり再利用できない | 例を1つ示すか構造を明記する |
| 評価観点 | AIの評価基準で最適化される | 何を優先するかを順序立てて伝える |
Anthropic — "For an LLM, examples are the 'pictures' worth a thousand words"
Effective Context Engineering for AI Agents — Anthropic Engineering
S4. 実務での適用判断 — 加速装置の使いどころ
AIは万能ではない。向き・不向きを見極めて使う
実務での意味:タスクの特性(確定性・影響範囲・検証しやすさ)を3軸で評価し、AIを使うかどうかを判断する。
今日から何を変えるべきか:「AIで何でもできる」という発想を捨て、「このタスクの3軸はどうか」を毎回考える習慣をつける。
AIは加速装置である
AIはドラフト作成・構造化・パターン認識・要約といった反復的作業を劇的に速くする。しかし速さは正確さを保証しない。「速く間違える」リスクを理解した上で使う必要がある。特に、確定した正解が必要な場面・間違いの影響が大きい場面・一次ソースで検証しにくい場面では、人間の判断をAIに置き換えてはならない。
ユースケース分類
叩き台・ドラフト作成
企画書・メール・報告書の初稿。人間が内容を確認・修正することが前提であれば速度向上効果が高い。
要約・構造化
長い会議議事録の要点整理、散逸した情報の構造化。AIが出した構造を人間がレビューする前提で使う。
コードの叩き台
ルーティン処理・テンプレート的なコードの初稿生成。動作確認・テストは人間が行う。
データ分析の補助
パターン指摘・仮説生成には使える。数値の正確性は必ずSSOTと突き合わせる。AIが示した数値を直接使わない。
法律・会計の判断
ドラフトや論点整理には使えるが、最終判断は必ず専門家が行う。AIの出力を根拠に意思決定しない。
最新情報の取得
学習カットオフ以降の情報はない。最新の市場動向・法改正・競合情報はAIに依存せず一次ソースを確認する。
3軸判断表
以下の3軸でタスクを評価する。「高・高・低」の組み合わせは人間が主体で対応すべき領域だ。
| 判断軸 | AIが向いている(低) | 人間が必要(高) |
|---|---|---|
| 確定性が必要か 正解が一つに決まるか | 幅のある回答でよい(方針案、構成案) | 正確な数値・法的判断・固有の事実 |
| 間違いの影響が大きいか 誤りのコストはどうか | 影響小(内部メモ、叩き台) | 影響大(顧客提出物・法的文書・財務数値) |
| 一次ソースで検証しやすいか 出力を後から確認できるか | 検証しやすい(数値はCSVで確認可能等) | 検証しにくい(専門知識が必要・SSOTが存在しない) |
失敗例
ある担当者がAIに「競合調査をして」と依頼し、返ってきた競合情報をそのまま営業資料に使った。AIが生成した「競合の製品価格」はカットオフ以前の情報であり、現在の実際の価格と乖離していた。顧客提案の場で指摘を受け、信頼を損ねた。
良い運用
スピードと精度を分離する
「速く叩き台を作る」フェーズと「正確性を確認する」フェーズを意識的に分ける。両方を同時にAIに任せない。
失敗コストを先に見積もる
このタスクでAIが間違えたら何が起こるかを先に考える。コストが高い場面では検証コストも予算に入れる。
「加速」と「代替」を区別する
「AIが書いたから確認しなくてよい」ではなく「AIが書いたから速く確認できる」という使い方が正しい。
判断基準
タスクを前にして次の問いを立てる。「このタスクでAIが間違えた場合、どのフローで検出できるか」が答えられないなら、AIを主体で使うべきではない。
S1「生成AIの正体」で解説したハルシネーションの構造的原因、S5「なぜレビューと検証は省略できないか」の検証フロー設計と合わせて読むこと。
判断軸の詳細設計については Anthropic Engineering — Effective Context Engineering も参照。
S5. なぜレビューと検証は省略できないか
流暢な出力ほど危険である — 検証は生成コストより本質だ
実務での意味:検証コストを生成後に削減しようとすると失敗する。検証の手順と責任を先に設計することが品質の源泉である。
今日から何を変えるべきか:AI活用のフローに「誰が何を検証するか」を明示的に設計し、省略不可の工程として組み込む。
流暢な出力ほど危険である理由
人間は流暢で自信に満ちた文章を読むと、批判的思考が緩む傾向がある。AIの出力は構造的に流暢になるよう最適化されているため、誤った内容であっても自信を持って語られる。これは「ハルシネーション」が「明らかな間違い」として出てくるのではなく、「もっともらしい誤り」として出てくる理由でもある。
生成コストより検証コストの方が本質
AIを使えば生成コストは劇的に下がる。しかし検証コストは下がらない。むしろ「大量に・速く・流暢に」生成できるようになったことで、検証しきれずに誤りが通過するリスクが上がる。AI活用のROIは「生成が速くなった」ではなく「検証が追いついているか」で測るべきだ。
生成: 10分 → AIで2分(80%削減) 検証: 省略(「AIだから大丈夫」) 結果: エラーが本番環境に流入 コスト: 修正に元の10倍の時間
生成: 10分 → AIで2分(80%削減) 検証: 3分(定型チェックリスト) 合計: 5分(従来比50%削減) 品質: 保持または向上
数値・ロジック・コードで何をどう確認するか
ボトムアップで積み上げる
合計と内訳が一致するか。単位は正しいか。オーダーが合っているか(百万と億の混同など)。SSOTの対応する値と突き合わせる。
前提と結論を分離する
AIが使っている前提が正しいか。結論は前提から論理的に導けるか。「もっともらしい言い方」で繋いでいないか。
テストを先に書く
AIが生成したコードは「動くように見える」ことが多い。エッジケース・境界値・異常系を意識したテストを人間が書き、通過を確認する。
責任3層モデル
AI活用における責任は次の3層に分かれる。最終的な品質責任は必ず人間が負う。
層1 — AIの出力(生成)
確率的補完の結果。流暢さは保証されるが正確さは保証されない。ここで品質を担保しようとしてはいけない。
層2 — 担当者のレビュー(検証)
ドメイン知識を持つ担当者が数値・ロジック・事実を確認する。SSOT照合・ボトムアップ検証・チェックリストを使う。
層3 — 責任者の承認(品質保証)
業務上の影響を理解した責任者が最終承認する。AIが生成したからという理由で承認フローを短縮しない。
失敗例
ある担当者がAIに財務サマリーを作成させ、「AIが出したから正しいはず」という認識でそのまま経営会議に提出した。数値の単位(百万円と億円)が混在していたが、流暢な文体のため読み飛ばされた。会議の途中で指摘を受け、再集計に一週間かかった。
良い運用
検証手順を先に設計する
AIを使う前に「何を、誰が、どう確認するか」を決める。後から「なんとなく確認する」では漏れが出る。
チェックリストを定型化する
数値確認・ロジック確認・事実確認のチェックリストを作り、毎回同じ手順で確認する。判断を属人化しない。
「流暢さ」を信頼の根拠にしない
読みやすい・論理的に見える・自信がある、はいずれも確認を省略する理由にならない。むしろ流暢なほど注意深く読む。
リスクに応じて承認レベルを変える
影響が小さいものは担当者確認で十分。影響が大きいものは責任者承認を必須とする。一律の判断をしない。
判断基準
| 確認対象 | 確認方法 | 省略できない条件 |
|---|---|---|
| 数値 | SSOTと突き合わせ、ボトムアップ積み上げ確認 | 外部提出・意思決定に使う場合は常に必須 |
| ロジック | 前提の明示・前提→結論の論理確認 | 相手を説得する目的で使う場合は必須 |
| コード | テスト実行・エッジケース確認 | 本番環境に適用する場合は必須 |
| 事実 | 一次ソース(公式文書・データベース)確認 | 固有名詞・日付・法令は常に必須 |
| 引用・出典 | 原文の直接確認 | 引用として使う場合は常に必須 |
補足: なぜ「ハルシネーションを防ぐ」より「検証フローを設計する」の方が有効か
ハルシネーションは確率的生成の構造的な帰結であり、プロンプトの工夫で完全に防ぐことはできない。発生頻度を下げることはできるが、ゼロにはならない。
そのため「ハルシネーションを防ぐ」という問いの立て方より、「ハルシネーションが発生しても検出できるフローを設計する」という問いの方が実務的に有効だ。誤りが通過しないシステムを作ることが目標であり、誤りが発生しないシステムを作ることは現時点では不可能だ。
Stochastic Parrot問題 — "Validate outputs rather than trusting fluency. Add controls when stakes are high."
The Stochastic Parrot Problem and Why It Still Matters in AI System Design
Claude Code 運用設計 — 5つの制御レバー
ハーネスとは、AIを自律的な問題解決者としてではなく、アーキテクチャの制約が成果を形作る構成要素として扱う設計思想。
S6. CLAUDE.md — プロジェクトの憲法
何を書くか・何を書かないかを設計する
実務での意味: 書きすぎたCLAUDE.mdはノイズになり、AIが本当に守るべき制約を見失う。
今日から: 既存のCLAUDE.mdを「常設 / 必要時 / 実行時」の三列で仕分けし、不要な行を他へ移す。
結論
CLAUDE.mdはプロジェクトの憲法であり、セッションをまたいで常に有効な原則だけを記述する。コマンド一覧、制約、言語設定はここに置く。一方、チャートパターンやデプロイ手順のような「必要なときに参照する手順」はskillsへ、セキュリティチェックやログ出力のような「実行のたびに動く検査」はhooksへ分離する。この三分割が機能することで、CLAUDE.mdは軽量かつ確実に読まれる文書になる。
失敗例
# CLAUDE.md(肥大化版) コマンド: uv run pytest -x デプロイ手順: wrangler pages deploy ... チャート実装: floating bars [[start,end]]... セキュリティ: rm -rf を検知したらブロック ログ: tool_logger.py を呼べ 言語: 日本語出力
# CLAUDE.md(憲法版) ## コマンド uv run pytest -x # テスト uv run ruff check # Lint ## 制約 - Bash: > /dev/null 2>&1 - Cloudflare: 25MB制限 ## 言語 日本語出力。変数名は英語。
良い運用 — 三分表
| 置き場所 | 内容の性質 | 具体例 |
|---|---|---|
| CLAUDE.md | 常設原則 — 常に有効 | コマンド、言語設定、外部API制約 |
| skills/ | 必要時手順 — 参照型 | chart-patterns.md、deploy-rules.md |
| hooks/ | 実行時検査 — 自動起動 | security.py、tool_logger.py |
スコープは三階層で管理する。グローバル設定(~/.claude/)はモデル選択・認証のみ。プロジェクト設定(project/.claude/)はhooks・permissions・skills。サブプロジェクト(projects/X/)はそのプロジェクト固有の制約を上書きする。完全分離ではなく、共通文脈と局所文脈の階層化が目的だ。
- ~/.claude/ # グローバル: model, credentials
- settings.json
- .credentials.json
- project/.claude/ # プロジェクト: CLAUDE.md, hooks, skills
- CLAUDE.md # 常設原則
- hooks/
- security.py
- tool_logger.py
- skills/
- chart-patterns.md
- deploy-rules.md
- projects/X/ # サブプロジェクト: 局所上書き
- CLAUDE.md
判断基準
「これはセッションをまたいで常に守るべきか?」と問え。YESならCLAUDE.md。「必要なときだけ参照するか?」ならskills。「コード実行のたびに自動で走らせるか?」ならhooks。この問いを省略すると、肥大化したCLAUDE.mdが生まれ、AIは大量のノイズの中から本当の制約を見つけられなくなる。ハーネスなしにはAIは暴走する。
S7. 文脈衛生 — /clear, /compact, /context
文脈の蓄積をコントロールする3つのコマンド
実務での意味: 古い文脈が蓄積すると「文脈腐敗」が起き、AIの出力品質が低下する。
今日から: タスク完了後は反射的に /clear を打ち、新しいタスクを汚染なしで始める習慣をつける。
結論
Anthropicはコンテキストウィンドウが拡張するにつれてAIの性能が劣化する現象を「文脈腐敗(context rot)」と呼ぶ。長いセッションには過去の失敗、撤回された指示、関係のない情報が蓄積し、AIは新しい指示よりも古いノイズに引きずられる。これを防ぐのが文脈衛生だ。
セッションフローとコマンドの使いどころ
失敗例
A機能の実装が終わったあと、/clearを打たずにB機能の指示を出した。AIはAの実装で採用したアーキテクチャをBにも適用しようとし、要件が異なるにもかかわらず同じパターンで実装した。古い文脈が新しい判断を汚染した典型例だ。
良い運用 — 判断テーブル
| 状況 | 使うコマンド | 理由 |
|---|---|---|
| 別件・別タスクに移る | /clear | 文脈を完全リセット。汚染を断つ |
| 同じ作業を続けるが冗長になった | /compact | 重要部分を保ちつつトークン削減 |
| 今どの文脈にいるか確認したい | /context | AIが何を「覚えているか」を把握 |
| 長時間のセッション中に迷走を感じる | /compact → /context | 圧縮後に現状を確認して再整理 |
LangChainのコンテキストエンジニアリングでは、文脈操作をWrite(追加)・Select(選択)・Compress(圧縮)・Isolate(分離)の4操作として整理している。/compactはCompressに、/clearはIsolateに対応する操作として理解できる。これは「理解のレンズ」として有効だが、Claude Codeの3コマンドと直接1対1で対応するわけではない点に注意する。
判断基準
「前のタスクの情報は今のタスクに役立つか?」と問え。役立たないなら /clear。役立つが量が多いなら /compact。セッションを続けながらAIの現在地を知りたいなら /context。この判断を怠ることがAIの迷走の主因になる。文脈は設計するものだ。
S8. Plan Mode — 思考の整流器
いきなり書かせないための、実行前の構造化ステップ
実務での意味: 計画なしで書き始めると、後半で矛盾が露呈して全面書き直しになる。
今日から: 複数ファイルにまたがる変更や新機能追加には、最初の指示に「まず計画だけ出力して」を付ける。
結論
Plan Modeとはコードを書く前にAIに計画を出力させる運用パターンだ。Anthropicはエージェントの長期実行において「一度に一機能ずつ作業する」ことを推奨している。Plan Modeはこの原則を実践するための整流器として機能する。計画段階で矛盾・見落とし・依存関係の問題を発見することで、実装後の大規模な手戻りを防ぐ。
当チームの運用規律として、3ステップ以上にわたる実装は必ずPlan Modeを経由する。この「3ステップ以上」はチームが決めた閾値であり、一般的な正解ではない。ただし実際には、1ファイルの小修正を除くほぼすべての実装がこの基準に該当する。
失敗例
「ダッシュボードにYTD累積チャートを追加して」 → AIが即座にコードを書き始める → データ構造の前提が違った → 既存チャートのレイアウトを壊した → 全面書き直し
「ダッシュボードにYTD累積チャートを追加する。 まず実装計画だけ出力して。コードはまだ書かない」 → AIが計画を出力 → データ構造・影響範囲を確認 → 合意後に実装開始 → 一発で通る
良い運用 — Plan → Implement → Verify
ワークフロー: Plan Mode の3フェーズ
Planフェーズでは計画と受入基準の両方を合意する。「何を作るか」だけでなく「何をもって完了とするか」を先に決めることで、Verifyフェーズの判断が機械的になる。Anthropicの推奨する増分実行(incremental execution)とも整合する。
判断基準
「この実装は1ファイルの単純な修正か?」という問いから始める。NOであればPlan Modeを使う。当チームでは3ステップ以上を基準としているが、本質は「実装後の手戻りコストが計画のコストを上回る可能性があるか」だ。複数ファイル・データ構造変更・UI変更が重なるときは必ずPlanを先に出力させる。
S9. Hooks — 実行タイミングで機械的に差し込む
自然言語のお願いは抜ける。だから機械的に差し込む。
実務での意味: AIへの自然言語の制約は常に有効ではない。コード実行で強制する仕組みが必要だ。
今日から: 絶対に避けたいコマンドパターンを1つ特定し、PreToolUseのDangerousリストに追加する。
結論
hooksはClaude Codeがツールを呼び出す前後に自動実行されるスクリプトだ。自然言語で「危険なコマンドは実行しないで」と書いても、長いセッションの中でその制約が無視されることがある。hooksはその問題を解決する。実行タイミングで機械的に検査・記録することで、AIの挙動を構造的に制御する。ハーネスなしにはAIは暴走する — これがhooksの存在理由だ。
失敗例
CLAUDE.mdに「rm -rfは使わないこと」と書いていたが、AIが生成したクリーンアップスクリプトにそのコマンドが含まれていた。自然言語の制約はAIのトークン予測から「忘れられる」。PreToolUseがあればその瞬間にブロックされていた。
良い運用 — Hook ライフサイクル
Hook 実行フロー
コード例 — PreToolUse(危険コマンド検知)
# PreToolUse: 危険パターン検知 import json, sys DANGEROUS = ["rm -rf", "DROP TABLE", "force push"] data = json.load(sys.stdin) command = data.get("tool_input", {}).get("command", "") if any(p in command for p in DANGEROUS): print(json.dumps({"decision": "block", "reason": "危険コマンド検知"}))
security.py — 全コード
import json, sys DANGEROUS_PATTERNS = [ "rm -rf", "DROP TABLE", "DROP DATABASE", "force push", "--force", "git push -f", ] def main(): data = json.load(sys.stdin) tool_name = data.get("tool_name", "") tool_input = data.get("tool_input", {}) command = tool_input.get("command", "") if tool_name == "Bash": for pattern in DANGEROUS_PATTERNS: if pattern in command: result = { "decision": "block", "reason": f"危険コマンド検知: {pattern}" } print(json.dumps(result)) return if __name__ == "__main__": main()
コード例 — PostToolUse(ツール使用ログ)
# PostToolUse: ツール使用をJSONLログに記録 from datetime import datetime LOG_PATH = ".claude/logs/tool-usage.jsonl" data = json.load(sys.stdin) tool_name = data.get("tool_name", "") file_path = data.get("tool_input", {}).get("file_path", "") entry = {"ts": datetime.now().isoformat(), "tool": tool_name, "file": file_path} with open(LOG_PATH, "a") as f: f.write(json.dumps(entry) + "\n")
settings.json — Hook 登録設定
{
"hooks": {
"PreToolUse": [
{"command": "python .claude/hooks/security.py"}
],
"PostToolUse": [
{"command": "python .claude/hooks/tool_logger.py"}
]
}
}
判断基準
「これをCLAUDE.mdに書いても守られなかったことがあるか?」と問え。YESならhooksに移す。安全制約・強制ログ・外部APIへの二重呼び出し防止など、人間の監視なしに毎回確実に実行されなければならないものはすべてhooksの候補だ。hookは軽量なPythonスクリプトで足り、複雑なロジックは不要だ。
S10. Skills・Agents・パイプライン — 全体設計
5つの制御レバーを統合して安定した自律実行を設計する
実務での意味: どれか一つが欠けると、残りの仕組みがその穴を補おうとして肥大化し、全体が崩れる。
今日から: 現在のプロジェクト構成を5レイヤーに照らし合わせ、「どのレイヤーが空白か」を確認する。
結論 — 5レイヤーの分業
| レイヤー | 担当 | 例 | 節 |
|---|---|---|---|
| CLAUDE.md | 常設原則 | コマンド、制約、言語設定 | S6 |
| skills | 必要時手順 | chart-patterns、deploy-rules | — |
| Plan Mode | 事前整理 | 実装計画、受入基準 | S8 |
| hooks | 実行時検査 | security.py、tool_logger.py | S9 |
| agents | 役割分担 | impl-agent、reviewer、tester | — |
skillsはmarkdownファイルであり、AIが「必要なときに」参照する手順書だ。チャートの実装パターン、デプロイ規則、KPI定義など、常時メモリに置く必要はないが確実に正確であるべき知識を置く。agentsはサブエージェントとして特定の役割を持つ。Anthropicが推奨するtwo-agent pattern(例: impl-agentとreviewer)はお互いの盲点を補完する。
失敗例
skillsを作らずにすべての手順をCLAUDE.mdに書いたプロジェクトでは、CLAUDE.mdが6000トークンを超えた。AIはその冒頭にある「言語設定」すら参照できなくなり、英語で出力し始めた。必要時手順を常設ファイルに置いたことが、本来守るべき原則を見えなくした。
良い運用 — FP&Aダッシュボード生成パイプライン
FP&Aダッシュボード生成のデータフロー。各ステップは独立したPythonモジュールが担当する。
データ取得 — fetcher群
Fabric / BQ → Python fetcher → parquet/jsonl キャッシュ
データ整形 — preparers
KPI計算・セグメント集計・YTD累積処理
HTML生成 — html_generator
Chart.js テンプレートへのデータ注入・セクション結合
デプロイ — Cloudflare Pages
wrangler pages deploy → funnel-dashboard.pages.dev/
Anthropicが推奨するtwo-agent patternを拡張した5エージェント構成。
| エージェント | 役割 | 主な責務 |
|---|---|---|
| impl-agent | 実装担当 | 機能コード・ユニットテスト |
| reviewer | コードレビュー | 設計・セキュリティ・可読性 |
| tester | テスト設計 | 統合テスト・E2E・カバレッジ |
| debugger | デバッグ | エラー原因特定・修正提案 |
| verifier | 検証 | 数値整合・KPI検証・不変条件 |
各エージェントは .claude/agents/ 配下のmarkdownで定義される。役割の境界を明確にすることで、impl-agentがテスト設計の責務まで負わないよう制約する。これもハーネスの一形態だ。
デプロイはskills/deploy-rules.mdに手順を置き、AIが参照して実行する。
判断基準
5レイヤーのうちどれが欠けているかを確認する。CLAUDE.mdだけあってhooksがないなら、制約は自然言語のお願いに依存している。skillsがなくてCLAUDE.mdが肥大化しているなら、必要時手順を移す。agentsがなくて1つのプロンプトに実装・レビュー・テストを混在させているなら、役割分担を設計する。ハーネスなしにはAIは暴走する — この原則は5レイヤーすべてを貫く核心だ。
実践ショーケース — FP&A Master 環境の全体像
第一編・第二編の原則を適用した実際のClaude Code環境。24スキル・5エージェント・4フック・7プロジェクトが連動する
S11. 実環境の全体像 — ハーネスの実装例
SaaS FP&Aモノレポで稼働中の構成をそのまま公開する
環境サマリー
ディレクトリ構成 — 5レイヤーの物理配置
24 Skills — カテゴリ別一覧
全スキルは自動起動。description の "Use when..." でAIが文脈に応じて自動参照する。CLAUDE.mdに書くには多すぎる知識を、必要な瞬間にだけロードする仕組み。
Hooks — 4つの機械的検査
S9で解説したhooksの実装。「お願い」では漏れる検査を、イベント駆動で100%実行する。
ツール呼び出し
Edit / Bash / Read...
security.py
PreToolUse
危険コマンド検知
実行
ツール処理
tool_logger.py
PostToolUse
全操作をJSONL記録
| Hook | タイミング | 役割 |
|---|---|---|
| security.py | PreToolUse | rm -rf / force push / --no-verify 等の危険操作をブロック |
| tool_logger.py | PostToolUse | 全ツール呼び出しを .claude/logs/tool-usage.jsonl に記録 |
| quality.py | PostToolUse | コード品質チェック(Edit後の構文検証等) |
| session_start.py | SessionStart | ブランチ状態・最新verify結果・教訓の自動ロード |
5 Agents — 役割分担
Anthropicの two-agent pattern を拡張。メインはOpus、サブエージェントはSonnet/Haikuでトークンコスト最適化。
impl-agent
チケットに基づく機能実装。コード+ユニットテスト。最もトークンを消費するためSonnet。
reviewer
設計・依存関係・破綻点のレビュー。実装提案は控える。
tester
テスト作成と実行。カバレッジ確認。軽量タスクのためHaiku。
debugger
エラー根本原因分析。スタックトレース解析→修正提案。
verifier
テスト・lint・型チェック・数値整合の実行と合否判定。
7 Projects — モノレポ内の独立ダッシュボード群
autonomous-fpa
全社FP&A統合ダッシュボード。Finance / Funnel / ABM / Marketing の全モジュール統合。
abm
ABM専用ダッシュボード。Leaflet地図+企業スコアリング。
budget-fy27
FY27予算策定。B/S・P/L・C/F三表連結モデル。
hr-dashboard
人事ダッシュボード。ヘッドカウント・退職率。
data-portal
データカタログ&ポータル。スキーマ管理。
CLAUDE.md — 常設原則の実物
S6で「何を書くか・何を書かないか」を設計すると述べた。実際のCLAUDE.mdは以下の構造で、約40行に収まっている。
| セクション | 内容 | 例 |
|---|---|---|
| 言語 | 出力言語の固定 | 日本語出力。変数名・関数名は英語 |
| ワークフロー | 実行フロー定義 | Plan → Implement → Verify(エラー時Debug) |
| スキル一覧 | 24スキルの分類 | Workflow / Chart / Fabric / Finance / Quality |
| コマンド | テスト・Lint・検証 | uv run pytest -x / uv run ruff check --fix |
| 制約 | 環境固有の注意 | Bash: > /dev/null 2>&1(> nul 禁止) |
| 参照テーブル | ドキュメントへのポインタ | KPI定義 → skills/domain/kpi-definitions.md |
永続記憶 — Auto Memory
セッションを超えて蓄積されるファイルベースの記憶システム。MEMORY.md(インデックス)+ 個別の記憶ファイルで構成。
ユーザー記憶
役割・好み・スキルレベル。応答のパーソナライズに使用。
フィードバック記憶
過去の修正指示。同じミスを繰り返さないためのガードレール。
プロジェクト記憶
進行中の作業・決定事項。文脈の引き継ぎ。
参照記憶
外部システムへのポインタ。Fabric WS / BQテーブル等。
教訓 — 失敗から学ぶ自動フィードバック
session_start hookが毎セッション冒頭で直近の教訓をロードする。過去の失敗をAIが繰り返さないための仕組み。