9. LLMの指示に依存する設計とコードによる制御の境界線

プロンプトの「指示」とコードの「実行」の混同

LLMのプロンプトは、人間が対話する際の「指示」や「思考のガイドライン」を記述する場です。しかし、この指示をそのままシステムロジックとして扱うと、予期せぬ入力やLLMの誤解釈によって、システム全体が不安定になります。

プロンプトとコードの役割の分離

この分離を理解することが、堅牢なエージェント設計の第一歩です。

プロンプトの役割(知性・判断):LLMに期待するのは、知識の検索、情報の要約、次のアクションの「提案」や「判断軸の提示」です。これは、人間が思考するプロセスを模倣する部分です。

スクリプトの役割(実行・制御):スクリプトは、外部APIの呼び出し、データ型の強制変換、リソースの確保・解放など、副作用を伴う「物理的な操作」を担います。これは、システムが物理的に動くための「筋肉」です。

「判断」と「実行」の境界線引きの技術的アプローチ

境界線を引くための最も強力な手法は、**「思考の出力」を「実行可能なデータ構造」に強制変換する**ことです。

レイヤー 出力形式 OpenClawでの実装
思考フェーズ JSON Schemaに準拠した構造化テキスト(例:{ "action": "call_api", "params": { "endpoint": "user/profile" } }) LLMの出力検証とパース(最も重要)
実行フェーズ 実行すべき具体的なコマンド引数やデータ(例:user_id=123, action=fetch) スクリプトが直接受け取り、実行する引数として利用する

プロンプトの「ガードレール」としての利用

プロンプト自体にもガードレールを設けるべきです。例えば、「もし次のステップで外部APIを呼び出す必要がある場合は、必ずJSON形式で『...』タグで囲んで出力し、それ以外の形式で出力した場合は、そのステップはスキップせよ」といった指示を組み込むことで、LLMの出力を構造化された「命令」として扱う訓練をさせる必要があります。

まとめ:信頼性を担保する「実行の壁」の構築

プロンプトは「何を考えるか」を定義し、スクリプトは「何を実行するか」を定義します。この二つを明確に分離し、スクリプト側でLLMの出力を厳密に検証する仕組みを組み込むことが、実用的なAIエージェントの設計指針となります。