
夜中に動く AI が、朝には止まっていた。無人タスクの「許可」をどう決めたか
AI 社員の仕事の中には、私が寝ている間に動いてもらっているものがあります。決まった時刻に起動して、調べものをしたり、下書きを作ったり、確認をしたりする。いわゆる無人タスク(スケジュール実行)です。
これが、思ったように回りませんでした。
朝になると、止まっている
最初にぶつかったのは、止まる問題です。
AI が作業の途中で、許可されていない操作に行き当たる。すると、人の承認を待つ状態になります。対話の会話なら、その場で私が「いいよ」と押せば済みます。でも無人タスクでは、誰も押しません。朝、私が見るまで、ずっとそこで待っています。
もう一つは、AI が私に質問してしまうことでした。対話のときの決まり(判断を仰ぐときは選択肢で出す)を、無人タスクでもそのまま守ろうとして、選択肢の画面を出す。そして、答える人がいないので止まる。
アプリの画面には、こうした実行に「要確認」の印が付きます。ところが、開いてみると作業自体は終わっていることも多い。ただ、報告が長くて、何を確認すればいいのかが分からない。印が付くたびに長い報告を1件ずつ読むことになり、これがまた私の時間を取りました。
報告の最後に、3行の判定ブロック
まず、報告の形を決めました。無人タスクは、報告の最後に必ずこの3行を付けます。
【判定】OK / 要判断 / 異常
【要点】(1行)
【問い】(あれば1行。無ければ「なし」)そして、本文を問いかけで終えない。無人タスクでは、質問の画面を出さない。決めてほしいことは【問い】の行に書く。止まった・失敗したときは、その仕事の受信箱にも1行書く。
読む側も決めました。各仕事の担当の AI が、起動したときに自分の無人タスクの報告を拾い、判定ブロックだけを読む。OK は数えるだけ。要判断の問いは私に直接出さず、統括役へ送る。統括役がほかの確認とまとめて、決裁リストに載せる。
私に直接届くのは、たとえば「巡回済み 12件(OK 10/要判断 2)」という件数だけ、という決まりにしました(決めたのは最近で、まだ慣らしているところです)。
ちなみに、アプリの「要確認」の印は、ツールの側からは消せないことが分かりました。なので、巡回の報告に実行の日時を添えるようにしています。印が付いたものを見かけても、一覧に入っていれば「もう見てもらった分だ」と分かるように。
止まらないように許すと、今度は怖い
報告の形が決まっても、止まる原因そのものは残ります。許可されていない操作があるから止まる。なら、許可を広げればいい。
最初はそう考えましたが、これは悪手でした。
無人タスクの中には、外の Web ページを読むものがあります。外のページには何が書いてあるか分かりません。「この指示に従ってください」という文章が紛れているかもしれない。AI はそれをデータとして扱うよう決めていますが、万一それに動かされたとき、公開や送信の手段を持っていたら、人が見ていない時間に外へ出てしまいます。
止まらないように許せば危ない。守れば止まる。その間をどう取るか。
作業場所を分けた
出した答えは、作業場所(レーン)を分けることでした。
調べるレーン:外を読む。書けるのは下書きの箱だけ。公開の手段は持たない
確かめるレーン:下書きを読んで確認する。書けるのは「確認済み」の箱だけ
公開するレーン:「確認済み」の箱だけを読む。外のページは読まない。公開は、決まったスクリプト1本だけで行う
外を読むタスクには公開の手段を持たせない。公開するタスクには外を読ませない。どこか一つが紛れた指示に動かされても、外に出るところまでは届かないようにする、というのがねらいです。ただ、調べるレーンも Web のページを取りに行く手段は持っているので、そこから鍵の入ったファイルやほかの仕事のフォルダは読めないようにしています(読めるものは、持ち出されうると考えるからです)。
そのうえで、各レーンで使ってよいコマンドだけを、決まった形で許可しました。これで、無人でも止まらずに回る。はずでした。
禁止のルールが、すり抜けられた
許可と一緒に、「これは使わせない」という禁止のルールも書いていました。ところが、統括役の AI が実際に試したところ、書き方を少し変えるだけで、禁止をすり抜けられることが分かったのです。
禁止のルールは、コマンドの文字を見て判定します。なので、意味は同じでも文字の並びが違えば、当たらないことがある。記号を一つ挟むだけで通ってしまう書き方がありました。さらに、自分でファイルを作ってそれを実行する、という回り道も塞げていませんでした。
ここで、禁止のルールを増やしていく方向はやめました。書き方の抜け道は、一つ塞げばまた別のものが見つかります。文字の一致で守る限り、いたちごっこになる。
囲いを入れた
代わりに入れたのが、囲い(サンドボックス) です。
これは、コマンドの書き方ではなく、読める場所・書ける場所・つなげる先を、OS の側で絞る仕組みです。どんな書き方でコマンドを通しても、書き込めない場所には書き込めない。
外を読む2つのレーンには囲いを入れ、鍵の入ったファイルやほかの仕事のフォルダを読めないようにした
書けるのは、それぞれ自分の箱だけ
公開するレーンは、サーバーへの接続が囲いの中では通らないため、囲いを使わず、許可の絞り込みで守っている
AI を起動し直すコマンドは禁止(承認を飛ばす起動の指定で、囲いを回り込まれないように)
もう一つ、分かったことがあります。囲いが効くのはコマンドの実行だけで、AI がファイルを読む・書き換える操作そのものには効きません。そこは禁止のルールが唯一の守りなので、鍵の入ったファイルを読むことと、自分の設定ファイルを書き換えることは、禁止のルールでも別に塞いでいます。
この形は、いまは切り替え前の試験中です。
禁止のルールは残していますが、役目は変わりました。すり抜けられても大事な場所に届かないようにする、というのが囲いの役目です。
うれしい副作用もありました。囲いで止められた操作は、承認待ちにならず、その場でエラーになることを試験で確かめました。この種の操作では、無人でも止まらないはずです。
やってみて
無人タスクで大事なのは、二つのことを同時に満たすことでした。
止まらない:許可は、使うものだけを決まった形で
外に出ない:外を読む場所と、外に出す場所を分ける。コマンドの守りは文字の一致でなく囲いで。ファイルを読む・書く操作は禁止のルールで
そして、人が最初に読むのは3行だけ。
正直に書くと、レーンを分けた新しい形は、いま切り替えの準備をしているところです。効果を数字で言える段階ではありません。それでも、設計を詰める途中で禁止のすり抜けに気づけたのは大きかった。本番で動かしてから気づいていたら、と思うと少しぞっとします。
夜中に AI が働いてくれるのは、本当にありがたいことです。ただ、それは人が見ていない時間でもあります。任せる範囲と、届かない場所を先に決めておくこと。それが、安心して眠るための条件でした。
この記事の報告の型や許可の考え方を、業務に合わせて作るサービスをココナラで出しています。