「なぜこの値なのか」が書かれていないパラメータは、AIにとって「最適化対象」に見えます。
本番システムのエラー許容閾値が2.0に設定されている理由をAIは知りません。「最適化しましょう」と提案し、回帰テストで少しだけ良い結果が出る1.5に変更します。しかしその2.0は、2022年の高負荷期間で生き残れた値です。本記事では、意思決定変数を「PARAMETER.md」に明文化し、AIが根拠なくパラメータを変更しない仕組みを構築した実践を記録します。
問題:AIが「善意で」パラメータを変える
実際に起きたこと
リファクタリングの依頼中に、AIがスコア閾値を勝手に変更しました。
1人間: 「スコアリングモジュールのリファクタリングをお願いします」2AI: 「リファクタリングしました。なお、MIN_TOTAL_SCOREが1.9に設定されていましたが、3 コード分析の結果、2.0の方が切りが良く適切と判断し変更しました」4人間: 「その1.9は3ヶ月の回帰テストで最適化した値なんだが...」AIに悪意はありません。「1.9」という半端な値を見て、「これは仮の値だろう」と判断したのです。しかし実際には、その0.1の差が判定結果の発生頻度を15%変えます。
変更されたパラメータの例
| パラメータ | 元の値 | AIが変更した値 | 影響 |
|---|---|---|---|
| MIN_TOTAL_SCORE | 1.9 | 2.0 | 判定結果15%減少 |
| リスク調整係数 | 0.25 | 0.5 | バッチサイズ2倍(リスク増大) |
| エラー許容閾値 | 2.0 | 1.5 | 許容幅25%縮小(誤検知に弱くなる) |
どれも「AIの判断としては合理的」でした。リスク調整係数0.5は教科書的に正しいです。エラー許容閾値1.5は回帰テストの期待値が若干高いです。しかし本番では、教科書的な値が最適とは限りません。
解決策:PARAMETER.mdの導入
基本フォーマット
各パラメータについて「値」「理由」「変更条件」「最終変更日」を記録します。
1## MIN_TOTAL_SCORE2- 値: 1.93- 設定理由: 回帰テスト2022-06-29〜で最適化。1.5だと誤判定過多、2.5だと判定結果不足4- 変更条件: 100件以上の新規回帰テストで統計的優位性が確認された場合のみ5- 最終変更: 2025-11-156
7## RISK_ADJUSTMENT_FRACTION8- 値: 0.25(理論最適値の1/4)9- 設定理由: 理論最適値(1.0)は理論上最適だが、推定誤差に敏感。10 1/4値(0.25)は期待成長率の75%を維持しつつ、11 パフォーマンス低下を大幅に抑制(最大低下幅: Full 40% → Quarter 10%)12- 変更条件: システム障害確率シミュレーション(10,000回)で障害確率 < 1%を維持する範囲13- 最終変更: 2025-10-2014- 参考: Ralph Vince "The Mathematics of Money Management" Ch.415
8 collapsed lines
16## ERROR_TOLERANCE_MULTIPLIER17- 値: 2.0(変動幅指標倍率)18- 設定理由: 2022年の高変動期間(外部メトリクス > 30)で、19 1.5倍だと60%が誤検知で処理中断。2.0倍で30%に低下。20 2.5倍はコスト対効果比が悪化21- 変更条件: 3ヶ月以上の本番データで、成功率とコスト対効果比の22 両方が改善する場合のみ23- 最終変更: 2025-09-03フォーマットの設計意図
4つのフィールドにはそれぞれ役割があります。
1# PARAMETER.mdのフィールド設計2PARAMETER_FIELDS = {3 "値": "現在の設定値。コード中の値と一致していること",4 "設定理由": "なぜこの値なのか。代替値との比較を含む",5 "変更条件": "どういう条件なら変更してよいか。安全弁",6 "最終変更": "いつ変更されたか。Git履歴と照合可能",7}8
9# 「設定理由」に含めるべき情報10REASON_TEMPLATE = """11- 回帰テスト期間: {start_date}〜{end_date}12- 代替値A({alt_value_a})の結果: {alt_result_a}13- 代替値B({alt_value_b})の結果: {alt_result_b}14- 採用理由: {why_chosen}15"""実際のPARAMETER.mdの内容
リスク管理パラメータ
1## CircuitBreaker: DAILY_LOSS_LIMIT2- 値: 5%(日次損失上限)3- 設定理由: リソースの5%以上を1日で失うと、心理的に冷静な判断ができなくなる。4 学術研究(Odean 1998)でも、大きな損失後の意思決定品質低下が確認されている。5 3%だと正常なパフォーマンス低下でも頻繁に停止。7%だと損失許容が大きすぎる6- 変更条件: システム規模が2倍以上に変化した場合に再検討7- 最終変更: 2025-08-158
9## CircuitBreaker: CONSECUTIVE_LOSS_LIMIT10- 値: 3(連続失敗回数の上限)11- 設定理由: 連続3回の失敗は統計的に「処理ルールが機能していない可能性」を示唆する。12 成功率55%のロジックで3連続失敗する確率は約9%。稀だが起こりうるレベル。13 5連続失敗(確率1.8%)まで待つとパフォーマンス低下が深くなりすぎる14- 変更条件: 処理ルールの成功率が大幅に変化した場合(±10%)15- 最終変更: 2025-09-01スコアリングパラメータ
1## SUCCESS_THRESHOLD_MULTIPLIER2- 値: 3.0(変動幅指標倍率)3- 設定理由: エラー許容閾値=2.0に対して成功判定閾値=3.0でコスト対効果比1:1.5を確保。4 閾値=2.0(コスト対効果比 1:1)だと成功率55%でも期待値が薄い。5 閾値=4.0だと到達率が低下(回帰テストで35%→22%)6- 変更条件: 100件以上で到達率とコスト対効果比の積が現在値を上回る場合7- 最終変更: 2025-11-15CLAUDE.mdとの連携
参照ルールの追加
CLAUDE.mdに以下のルールを追加します。
1## Critical Rules2
3### パラメータ変更ルール(BLOCKING)4- パラメータを変更する前に **PARAMETER.md** を確認すること5- PARAMETER.mdに記載されているパラメータは、6 「変更条件」を満たす場合のみ変更可能7- 変更した場合は PARAMETER.md の「最終変更」を更新すること8- PARAMETER.md に未記載のパラメータを新規追加する場合は、9 同時に PARAMETER.md にもエントリを追加すること10
11### Key References12| Document | Description |13|----------|-------------|14| PARAMETER.md | 意思決定変数の値・理由・変更条件 |実際の効果
ルール追加後、AIの振る舞いが変わりました。
1人間: 「回帰テスト結果を踏まえてスコア閾値を調整してください」2AI: 「PARAMETER.mdを確認しました。MIN_TOTAL_SCOREの変更条件は3 '100件以上の新規回帰テストで統計的優位性が確認された場合のみ'4 です。今回の回帰テストは78件なので、変更条件を満たしません。5 追加のテスト期間を延長しますか?」AIが「変更条件」を読んで、自律的に判断を保留しました。これが意図した動作です。
パラメータ変更のワークフロー
変更が必要な場合の手順
1# パラメータ変更の手順(PARAMETER.mdに準拠)2PARAMETER_CHANGE_WORKFLOW = [3 "1. PARAMETER.mdで現在の値と変更条件を確認",4 "2. 変更条件を満たすエビデンスを準備",5 " - 回帰テスト結果(100件以上)",6 " - 統計的検定(p値 < 0.05)",7 " - Wilson信頼区間の下限が基準以上",8 "3. PARAMETER.mdに新しい値・理由・日付を記録",9 "4. コード変更をコミット",10 "5. PARAMETER.md変更を同じコミットに含める",11]Gitでの履歴追跡
PARAMETER.mdをGit管理することで、パラメータの変更履歴を追跡できます。
1# PARAMETER.mdの変更履歴を確認2git log --oneline -p -- PARAMETER.md3
4# 特定パラメータの変更履歴をgrepで抽出5git log -p -- PARAMETER.md | grep -A 5 "MIN_TOTAL_SCORE"1出力例:2commit a3f2d1b (2025-11-15)3- - 値: 2.14+ - 値: 1.95+ - 設定理由: 回帰テスト2022-06-29〜で最適化。6
7commit 8e4c5a9 (2025-09-03)8- - 値: 2.59+ - 値: 2.110+ - 設定理由: 判定結果不足のため閾値を引き下げ。1つのファイルのgit logだけで、全パラメータの変更理由と日付が追跡できます。
PARAMETER.mdに書くべきか迷うケース
書くべきもの
1- 本番のリスク管理に影響する値(エラー許容閾値/成功判定閾値/リスク調整係数/CircuitBreaker)2- 回帰テストで最適化した値(スコア閾値・フィルター閾値)3- ビジネスロジックに直結する値(最大リソース数・リクエスト間隔)書かなくてよいもの
1- ログレベル(DEBUG/INFO/WARNING)2- リトライ回数(3回)、タイムアウト(30秒)3- ファイルパス、ディレクトリ名4- UIの表示設定判断基準は「AIが勝手に変えたら本番に影響するか」です。影響するならPARAMETER.mdに書きます。
学んだこと
1. 「なぜこの値か」がないとAIは最適化の名目で変更する
AIにとって、理由のない定数は「改善の余地がある」ように見えます。1.9を2.0にする、0.25を0.5にする——どちらも「合理的な改善」として提案されます。PARAMETER.mdに理由を書くことで、「この値は意図的に設定されている」とAIに伝えられます。
2. 変更条件の明記が安全弁になる
「100件以上の回帰テストで統計的優位性が確認された場合のみ」という変更条件は、人間にとってもAIにとっても明確な基準です。曖昧な「必要に応じて変更」では安全弁になりません。
3. パラメータの履歴追跡がGitで可能
PARAMETER.mdを1ファイルにまとめることで、git log -p -- PARAMETER.mdだけで全パラメータの変更履歴が見えます。パラメータが分散していると、変更を追跡するのに複数ファイルを調べる必要があります。
まとめ
PARAMETER.mdによるパラメータ管理で重要なのは以下の3点です。
- 「値」と「理由」をセットで記録: 半端な値(1.9, 0.25)には必ず理由がある。代替値との比較を含めて記録することで、AIが「切りの良い値」に変更するのを防止
- 変更条件を具体的に定義: 「100件以上」「p値 < 0.05」のような定量的な基準を設定。CLAUDE.mdから参照させることでAIが自律的に条件を確認
- Git管理で履歴を残す: PARAMETER.mdの
git logで全パラメータの変更理由と日付を一元追跡。「いつ、なぜ変えたか」が失われない