【AIエージェントの解剖学:第5回】暴走の防壁:Loop Controlと安全なコード実行サンドボックス
【新連載:AIエージェントの解剖学】
※本連載は、何も話せない空っぽの「チャットボット」の前に立ち、彼に命を吹き込みながら、自分の意志で動く「AIエージェント」へとパーツごとに作り上げていく開発ドキュメンタリーです。
1. プロローグ:次のパーツ「絶対に暴走させないための緊急安全弁」
前回、私たちはロボットの入力部に「フォーカスレンズ(コンテキストの最適化)」を装着し、彼に情報のノイズに溺れない高い集中力を実装しました。
しかし、手足(ツール)を手に入れ、自分の判断でコードを書いたり実行したりできるようになったロボットには、さらに恐ろしいリスクが潜んでいます。
もし、彼自身が生成したプログラムコードにバグがあり、「永久に終わらない無限ループ」に入ってしまったら?
あるいは、悪意がなくても、指示の解釈ミスによって「ローカルPCのシステムファイルをすべて削除する」といった破壊活動を行うコードを実行してしまったら?
今回は、ロボットのシステム自体が熱暴走を起こす前に物理的に回路を遮断する「Loop Control(ループ制御・タイムアウト)」の安全ヒューズと、あらゆる破壊的行動を無害化する隔離空間「コード実行サンドボックス」の安全カプセルをロボットに装着します。
彼に絶対的な「安全性の盾」を授けましょう。
2. エージェント開発におけるセキュリティの現実
AIエージェントに「ファイルの操作」や「プログラムコードの実行(Pythonの exec やシェルコマンド実行など)」といった権限を与えることは、極めて強力な能力になる一方、以下の致命的な暴走リスクを抱えることになります。
-
システムの破壊リスク:
「不要なキャッシュファイルを消して」という曖昧な指示に対し、AIがパスの判定ミスからrm -rf /(全ファイル削除)に相当するコードを出力・実行してしまう。 -
クラウドアラート(無限課金)リスク:
エージェントが「自分で自分のコードをテストして、エラーが出たら修正して再実行する」という自律ループを回している際、解決できないエラーのせいで永久にループから抜け出せなくなり、クラウドのAPI利用料金が数万〜数十万円に達するまで稼働し続ける。
これらをシステム側で防止するために、エージェント設計者は「絶対に超えてはならない防壁」を設計する必要があります。
3. 防壁1:Loop Control(ループカウンターとタイムアウト)
エージェントの自律ループ(Thought ➡ Action ➡ Observation)には、プログラムの実行を外側から監視する監視スレッド(またはプロセス)が必要です。
-
ループカウンター(Max Steps):
「最大で10ステップまで」のように、1つのタスクに対してエージェントが実行できる行動回数の上限を設定します。上限に達した場合、強制的に失敗と判定して停止させます。 -
実行タイムアウト(Timeout):
ツールの実行やプログラムコードの実行に対して、「最大3秒」などの時間制限を設定し、それ以上応答がない場合は強制的に処理をキル(Kill)します。
4. 防壁2:安全な隔離環境「サンドボックス」の構築
生成されたプログラムコードを、開発者のホストPCや本番サーバーの環境で直接実行することは絶対に避けるべきです。
コードを実行する際は、完全に周囲から遮断された無菌室である「サンドボックス」の中で走らせます。

※図:生成コードを隔離環境(Docker/WASM)内で走らせ、外部の安全タイマーで監視・タイムアウト遮断するループ構造(AI生成ダイアグラム)
-
Dockerコンテナの利用:
ファイルシステムやネットワーク、プロセスをカーネルレベルでホストから論理隔離する、最も代表的なサンドボックス手法です。実行後は使い捨て(Disposal)にします。 -
WASM(WebAssembly)の利用:
より軽量かつ高速に、ブラウザや小さなランタイム上でコードをセキュアに隔離実行させる最新の手法です。
5. 【体験】30行のタイムアウト制御ハーネスを動かそう
Pythonでコードを実行する際、もし無限ループに陥ってしまっても、外側から指定秒数で検知して安全に強制終了(タイムアウト)させる最小限のシミュレータコードです。
手元の環境で実行してみてください。
import threading
import time
# 暴走する無限ループの関数(エージェントが書いたバグコードのシミュレート)
def loop_forever():
print("🤖 エージェントコード: 処理を開始します...")
while True:
# 永久に終わらないループ
time.sleep(0.5)
print("🤖 エージェントコード: ループを実行中...")
# タイムアウト監視機能付きの実行用ハーネス(安全ヒューズ)
def execute_with_timeout(target_function, timeout_seconds: float):
# スレッドとして関数を実行
thread = threading.Thread(target=target_function)
thread.daemon = True # メインプロセス終了時にスレッドも強制終了させる設定
start_time = time.time()
thread.start()
# タイムアウト時間までスレッドの完了を待つ
thread.join(timeout=timeout_seconds)
if thread.is_alive():
print(f"\n🚨 警告: 処理時間が {timeout_seconds} 秒を超えました!")
print("⚡ 安全弁: 暴走を検知したため、スレッドの実行を強制中断し、安全に終了します。")
else:
print("✅ 正常終了しました。")
# 制限時間を「3秒」に設定して実行
execute_with_timeout(loop_forever, timeout_seconds=3.0)
このコードを実行すると、無限に回り続けるはずの危険なコードが、外側の監視機構によって3秒で強制的に遮断され、システム全体が救われる様子を体験できます。
6. エピローグ:安全弁を手に入れた知能

※画像:ロボットのハードウェアに、熱量や処理が暴走した瞬間に強制遮断する『緊急シャットダウン・バルブ』を取り付けるイメージ(AI生成画像)
これで、ロボットの心臓部に「Loop Control」の安全バルブが装着され、最悪のコードバグや暴走の熱量を瞬時に遮断する「安全性の盾」が手に入りました。これで彼は、どんな複雑な実験(自律実行)も、システムを破壊することなく安全に行うことができます。
しかし、現在の彼はまだ「1時間前に自分が実行したツールの結果」や「昨日ユーザーと交わした会話の内容」を長く覚えておくための、長期的な記憶装置を持っていません。
次回、第6回。
コンテキストウィンドウという一時的な脳のスペースを越えて、過去の経験をデータベースに蓄積し、必要に応じて引き出す脳の記憶貯蔵庫、「Memory & RAG Engineeringの実践」のパーツを彼に装着します。
ロボットが、時間と言葉を越えて「経験から学ぶ」ための記憶を獲得する瞬間へと進みましょう。