決定的 vs 確率的
TL;DR
エージェントシステムを開発していると、権限の範囲とアウトプットの品質という2つの管理が非常に難しい。この問題を解決するには、絶対に制御したい部分は決定的に、自由に生成させたい部分は確率的に、という2つのアプローチを意図的に組み合わせることが重要だと考えている。
概要
AIは24時間365日働き、文句も言わず、反復作業では人間より正確なことも多い。そのため多くの企業が、給与やコミュニケーションコストといった費用を削減すべく、自社のワークフローやバックエンドシステムへのAI統合を始めている。
「依頼して、修正してもらう」の次の段階は、明示的な指示がなくても自律的に問題を発見し解決するAIである。これがAgentic AIと呼ばれるもので、従来よりも大きな権限をAIに与えることになる。その成果は目覚ましい。人間は不要に見える情報やまれな情報を忘れがちだが、AI Agentは能動的に検索・grepし、適切なコンテンツを生成してタスク全体を完遂してくれる。
しかし、ここでジレンマが発生する。権限を与えるほど作業範囲は広がるが、同時にデータ漏洩や削除といった予測していない悪い出来事のリスクも増大するのだ。
このジレンマに対する私の答えは、決定的な作業(条件分岐などのルールベースの処理)と確率的な作業(LLMなどを用いた確率的な処理)を明確に分けることである。そうすることで、より安全かつ効果的にAI Agentを利用できるはずだ。
ルールだけではスケールしない例:自動運転
自動車の自動運転を考えてみよう(国に応じて交通ルールの詳細は異なるが、ここでは日本の例を挙げる)。
- 信号が緑であれば進行可能。直進したければそのまま進む。
- 右折したい時、直進車両が来ていれば、いなくなるまで待つ。
- 右折する時、歩行者がいれば右折せず止まる。
- 止まっている時に信号が変われば、止まったままでいる。
疑似コードで書くと、次のようになる。
if light == GREEN: if direction == STRAIGHT: go() elif direction == TURN_RIGHT: if oncoming_traffic_exists(): wait() else: if pedestrian_in_crosswalk(): stop() else: if light_changed_while_waiting(): stay_stopped() else: turn_right() elif light == YELLOW: if can_stop_safely(): stop() else: # 進む?そもそも「安全に」をどう定義する? ... elif light == RED: stay_stopped() # 緊急車両が接近してきたら? # 警察官が信号と異なる手信号をしていたら? # ボールが道路に転がってきたら? # ケースは無限に増えていく…
これらの処理をif文の条件分岐で書こうとすると、たちまちネスト地獄に陥る。現実世界はケースが多すぎて、全てをルールベースで管理することは不可能だ。ここにこそ、確率的な判断の出番がある。
ルールが絶対に必要な例:ファイル操作を行うAI Agent
打って変わって、ファイル操作を行うAI Agentを例に考えてみる。
この場合、自由に操作してよい範囲、絶対に閲覧できない範囲、リードオンリーの範囲といった明確なルールが必要である。どのフォルダに対してどの操作を行なってよいかは、決定的に決まるべきであり、モデルの判断に委ねてはいけない。
一方で、参照したドキュメントから生成・処理されるアクション、つまり何を生成しどう処理するかは、確率的で構わない。
境界線は決定的に引き、その内側で創造性を発揮させるのだ。
実務での応用
この原則は、AI Agentを用いたあらゆるシステムに適用できる。
最近「ハーネスエンジニアリング」という言葉が流行っているが、まさにこの考え方に合致する。ユーザーが特定のタスクの実行を求めるなら、その実行は決定的であるべきだ。例えば、機能実装の後には必ずテストを書くというチームの慣習があるとする。エージェントが覚えていることを祈るのではなく、シェルスクリプトのようにハーネス自体に組み込んでしまえばよい。
# タスク前 {Agent task} # タスク後:必ず実行される write tests
こうすればエージェントの判断に関係なく、テストのステップは100%実行される。リント、フォーマット、セキュリティチェックなど、必ず実行されるべき処理すべてに同じアプローチが使える。
文書生成でも同じ分割が有効だ。特定のキーワードを事前に登録してアウトプットの一部が必ず同じになるようにし、それ以外の箇所はモデルに自由に記述させる。固定部分と自由記述部分をうまく組み合わせることで、期待するアウトプットに近づけることができる。
まとめ
決定的 vs 確率的の使い分けは、AI Agentの力を最大化するためにも重要だろう。
絶対に制御したい箇所は決定的に、自由に生成・対応して欲しいときは確率的に。