見出し画像

AIに任せる部分と任せない部分を分けるガードレール【スマホで周回!#5】

こんにちは、スマホ投資パパです。

スマホだけでできる米国株の自動分析システムの第5回目になります。

第4回では、AIコーディングエージェントやチャットパックなど、改善サイクルを速く・深く回すための4つの方法を紹介しました。

ただ、サイクルを何ヶ月か回していると、もう一段階別の壁にぶつかります。

それは、生成AIそのものが”壊れる”ことです。

具体的には、こんな症状が出てきます。

  • コードを出してもらう → バグ → 直して → 別のバグ → 直して → さらに別のバグ……の無限ループ

  • 一度合意したはずの仕様を、次のやり取りでは平気で無視する

  • 「この関数だけ直して」と頼んだのに、既存の別処理まで勝手に書き換えてくる

  • そもそも既存コードをちゃんと読まずに、雰囲気で修正を提案してくる

これ、全部私が実際に何度もやられました。
そして何度もシステムを壊しました。

今回は、このAI暴走を防ぐために私がたどり着いた3つのガードレールを紹介します。

  • 会話を腐らせないタイミング管理

  • 影響範囲を可視化するdiff出力

  • 既存コードを守るシステムプロンプト実例

特に3つ目のシステムプロンプトは、私も実際に使っている設定をそのまま公開します。


1. なぜ生成AIは長く使うと”壊れる”のか


生成AIは、会話を重ねるごとに賢くなる……と思われがちですが、実は逆です。
会話が長くなるほど、AIの判断は雑になっていきます。

理由は大きく2つあります。

1つ目はコンテキスト汚染。
過去のやり取りが増えると、AIは全部を公平に参照できなくなります。
古い指示と新しい指示が混線し、合意事項を忘れ、同じミスを繰り返す。
しかもAIは「混乱しています」とは言いません。
表面上は流暢に返事をしながら、中身はめちゃくちゃ、ということが普通に起きます。

2つ目は影響範囲の無理解
AIはリポジトリ全体を同時に見ているわけではありません。
目の前の1ファイルだけを見て、雰囲気で修正を提案します。
だから「この関数を直して」と頼むと、その関数の呼び出し元や、同じCSVを読んでいる他の処理のことを考えず、独断で書き換えてしまいます。

この2つが重なると、冒頭で書いた症状が一気に噴出します。
そしてAIは「これで直りました!」と自信満々に言ってきます。
中身はめちゃくちゃなのに。

ここから先、この2つの問題を潰すための3つのガードレールを順に紹介します。

会話が長くなると、AIは静かに壊れていく。

2. ガードレール①:会話が長くなったら引き継ぎ or 新規チャット


一番シンプルで、一番効く方法です。
会話が20〜30往復を超えたら、私は必ずチャットを切り替えます。

切り替え方は2通り。

  • 引き継ぎ方式:現在の会話の要点と最新コードをAIに要約させ、それを新しいチャットに貼り付ける

  • 新規チャット方式:最新のコードとリポジトリURL、目的だけ伝えて再スタート


大きな改修の途中なら引き継ぎ、小さな修正の積み重ねなら新規、という使い分けです。

切り替えタイミングは、こんな兆候が出たら迷わずです。

  • AIが同じミスを繰り返す

  • 既に伝えた仕様を忘れる

  • 合意したことと違うことをやり始める

  • 指示していないことを勝手にやる


「あれ?」と思った時には、もう遅いこともあります。
早めに切り替える方が安全です。

ちなみに引き継ぎ方式のとき、AIへの要約依頼はこんなプロンプトが効きます。

この会話の要点、合意事項、現時点の最新コードを
新しいチャットに引き継げる形で1つのテキストにまとめて。

これで生成されたテキストを丸ごと新チャットの冒頭に貼れば、合意事項を失わずに続きが回せます。

生成AIがポンコツになってきたと気づいたら、さっさと引っ越ししましょう

3. ガードレール②:変更範囲は必ずUnified diffで受け取る


2つ目は「AIに影響範囲を意識させる」、コーディングエージェントを利用している場合に効果的な仕掛けです。

多くの人はAIに「ファイル全体を出して」と頼みます。
でもこれには問題があります。

  • ファイルが長いとAIが省略する(「… 以下同様 …」みたいな)

  • 全体を出されると、どこが変わったか目視で追えない

  • 既存処理を”良かれと思って”書き換えられても気づきにくい

解決策は、Unified diff形式で出させることです。

会話の冒頭、または依頼のたびに、この1行を添えます。

出力はUnified diff形式のみ。ファイル全体は出力しないこと。

これで以下のメリットが得られます。

  • 変更箇所だけが出力されるので、目視レビューが楽

  • コーディングエージェント(Codex、Claude Code、GitHub Copilot)にそのまま渡せる

  • 省略のリスクがなくなる(diffは差分だけなので省略する余地がない)

  • AIが不必要な改修をするとdiffにすぐ表れるので、事故が事前に防げる


この形式で受け取ると、「あれ? 頼んでない関数まで変更が入ってる」とレビュー段階で気づけます。
ファイル全体で受け取っていたら、気づかずmainにpushしていたはずです。

スクショはClaud。後述のシステムプロンプトによりデフォルトでdiff出力してくれる。


ひとつ注意点。
大規模リファクタのときだけは例外です。
ファイルの大半を書き換える場合は、diffよりファイル全体の方が読みやすいです。
普段使いはdiff、リファクタ時はファイル全体、という使い分けがおすすめです。

ちなみに、このdiff指示は毎回会話に書くのは面倒です。
次のガードレール③で、これも含めてまとめて常設する方法を紹介します。


4. ガードレール③:システムプロンプトに”絶対禁止事項”を入れる


3つ目が本丸です。
AIは放っておくと、頼んでもいないことを勝手にやります。
“善意のリファクタ”、“勝手なファイル追加”、“Slack出力フォーマットの改善”……。
どれもAI本人は良いことをしたつもりですが、運用者としては迷惑でしかありません。

これを防ぐのが、システムプロンプト(または会話冒頭)に一度書いたら常に有効な指示を置くこと。
ガードレール②のdiff指示も、ここに入れてしまえば毎回書かなくて済みます。

私がコパイロット向けに使っているガードレール全文を、そのまま公開します。シンプルですが効きます。
コピペしてお使いください。

最小限の修正を行え。
指示されない限り、既存の入出力形式・ファイル構造・戻り値・
外部通信・Slack/CSV出力は一切変更禁止。
許可される追加は標準出力ログのみとし、余計なファイルは
勝手に増やさないこと。
報告内容は日本語で。
コードはUnified diff形式で出力すること。


この6行で、以下のAI暴走がほぼ止まります。

  • 勝手なリファクタ → 「最小限の修正」で封じる

  • CSV列の勝手変更 → 「一切変更禁止」で封じる

  • 新規ファイル追加 → 「余計なファイルは勝手に増やさない」で封じる

  • 英語での報告 → 「日本語で」で封じる

  • 全文出力による変更見落とし → 「Unified diff形式」で封じる


もちろん、自分の運用スタイルに合わせて調整してください。
例えば「CSV列追加OK、ただし既存列は維持」みたいな個別ルールを足すのもアリです。

ポイントは、性善説でAIを信じるのではなく、性悪説で明示的に禁止しておくこと。
頼んでもいないことを「やらないでください」と先に書く。
これだけで、後工程のレビュー負荷がかなり減ります。

ChatGPTなら「カスタム指示」、Claudeなら「プロジェクトのカスタム指示」、Codexならconfigファイル、というように、それぞれのツールでシステムプロンプトを常設できる場所があるので、一度書いたらそこに置いておくのが楽です。

chatGPTの例。パーソナライズメニューのカスタム指示より。

5. 実例:ガードレールを入れる前の私のAI暴走3連発


ここまでが予防策。最後に、実際に私がAIに壊された実例を3つ紹介します。
ガードレールを入れる前の話です。

ケース1:バグ修正の無限ループ

「この関数にバグがあるから直して」と頼む。
→ AIが修正コードを出す。
→ 動かしてみると別の箇所でエラー。
→ 「今度はこっちがエラー」と伝える。
→ AIが直す。
→ また別の箇所でエラー。

これを5回くらい繰り返したところで気づきました。
AIは毎回、前回の修正の影響を考えずに次の修正を出していたんです。
結果、最初のバグは直ったが、別の場所に3つ新しいバグを埋め込まれていました。

ケース2:合意したことを平気で変えてくる

「CSVの列順は変えないでね」と会話の序盤で合意。
→ 10往復後、AIが出してきたコードで列順が変わっている。
→ 「列順変えないでって言ったよね?」と指摘。
→ 「失礼しました、修正します」と謝る。
→ さらに20往復後、また違う列順で出してくる。

AIは自分が合意した内容を、数ターン後には忘れている
謝るが覚えていない、のループでした。

ケース3:既存処理を顧みない改修

「この銘柄スコア計算関数を新しいロジックに差し替えて」と依頼。
→ AIが差し替え版を出してくる。
→ 動かすと、別のSlack通知処理がエラーで落ちる。
→ よく見ると、AIはスコア関数の戻り値の型を勝手に変えていた。

その関数の戻り値を使っていた下流の通知処理があるのに、それをまったく読まずに修正していました。
あとから聞いたら「このファイルだけ見て修正しました」と白状してきました。

どれも、私の指示は悪くなかった。
AIも悪気はなかった。
でも結果は災害。

だからこそ、ガードレールが必要なんです。

ガードレールで大きな事故を予防して進みましょう

6. まとめ ー 「AIを使いこなす」ではなく「AIを壊さない」

生成AIを使いこなすコツは、実はAI側にはありません。
人間側のワークフロー設計にあります。

今回の3つのガードレールをまとめると、こうなります。

  1. 会話の区切り:腐る前に切り替える

  2. diff出力:変更範囲を最小化・可視化する

  3. システムプロンプト:AIの善意を性悪説で制限する


この3つを守るだけで、AIとの付き合いが劇的に楽になります。
事故の回数も、レビューの負担も、体感で半分以下になります。

次回は、スマホで日々の運用を完結するにあたって避けては通れない証券会社の話をします。


最後にひとつだけ。
この記事は、米国株の売買そのものをおすすめするものではなく、あくまで分析や仕組み作りの考え方をまとめたものです。
実際の投資判断は、ご自身の責任でお願いします。

いいなと思ったら応援しよう!