2つのAIタスクが同じマウスを奪い合ってしまった話
並列化されたエージェントのデモは素晴らしく見えます。しかし、2つのタスクが同じマウスを使おうとした瞬間に、それらは失敗します。
あるタスクはサイトにログインし、別のタスクはブラウザを開き、3つ目のタスクはステータスの更新を要求します。すると突然、システムが間違った場所をクリックしたり、誤った実行をキャンセルしたりします。これはロジックのエラーではありません。リソースの競合(resource contention)なのです。
私は、デスクトップ自動化のためのローカルコントロールプレーンである CliGate を構築している時に、このことに気づきました。
コードにおいて並列処理は有効です。ランタイムセッションが動作している間に、天気情報の検索を実行できます。バックグラウンドでの要約処理が何かをブロックする必要はありません。
デスクトップは異なります。物理的なキーボード、マウス、画面はそれぞれ1つしかありません。もし2つのエージェントがその操作領域を占有しようとすれば、互いに妨害し合うことになります。
最初に私が考えたのは、新しいタスクが届いたら古いタスクをキャンセルすることでした。しかし、それは間違いでした。「進捗はどうなっている?」と尋ねるユーザーのために、ログインフローを強制終了させてしまうべきではないからです。
私は、並行処理をプロンプトの問題として扱うのをやめました。これはリソースの問題なのです。
私は3つのシンプルなルールを実装しました:
- 独立したタスクは並列で実行する。
- デスクトップを必要とするタスクはキューに入れる。
- キャンセルはユーザーが要求した場合のみ行う。
CliGate では、デスクトップ入力はリース(lease)のように機能します。マウスを使用するタスクがデスクトップの保持者(holder)となり、他のタスクは待機しなければなりません。
新しいロジックは以下のフローに従います:
- 新しいタスクが届く。
- デスクトップを必要とするか?
- いいえ、ならば並列で実行する。
- はい、かつデスクトップが空いているなら、占有する。
- はい、かつデスクトップが使用中なら、キューに入れる。
- ユーザーが停止を命じた場合のみキャンセルする。
リトライ(再試行)は、デスクトップ自動化を悪化させることがよくあります。2つ目のタスクがマウスを掴もうとし続けると、干渉が増えてしまいます。無理にリトライするのではなく、アシスタントは次のように言うべきです。「デスクトップは使用中です。現在キューに入っています。空き次第開始します。」
これにより、失敗を予測可能な挙動へと変えることができます。
また、強力なルールを一つ追加しました。エージェントは自分自身の実行中のプロセスをキャンセルできない、というルールです。これにより、エージェントがパニックになって自分自身の停止スイッチを連打してしまうのを防ぎます。
AIの挙動が悪くなる原因の多くは、賢すぎようとすることにあります。ユーザーが必要としているのは、もっとシンプルなものです:
- 競合しないタスクは実行する。
- 物理リソースを巡って競合するタスクはキューに入れる。
- ステータスログからステータスに関する質問に答える。
- ユーザーが停止を命じたら停止する。
デスクトップを操作するAIツールを構築する場合は、このことを覚えておいてください。タスクの並列化は問題ありませんが、物理リソースには明確な所有権(ownership)が必要です。
Source: https://dev.to/codekingai/my-two-ai-tasks-kept-fighting-for-the-same-mouse-1hij