AIアシスタントの中身はどうなっているんだろうか

たまには下調べや引用などをせずに思ったことを適当に書き散らしてみたいと思う(いつもでは?)。なので、この記事には裏が取られた情報や5秒ググればわかることなどは書かれていない。すべて想像で書いている。

昨日Siriに少し話しかけており、ふとこいつはどうやって実装されているのだろうと思った。まず、音声認識から文字列に起こす。これは古典的なものから機械学習まで先行研究がたくさんあるだろう。得られた文字列を形態素解析して構文木的なものを作るのもよく研究されている。だから、この方法を取るなら既存研究をうまく活かして、よく分離されたコードで実装できるだろう。

その後はどうしているのだろう? 「近くの喫茶店を探して」のように命令形のものは形態素解析の結果から動詞(「探す」)と目的語(「喫茶店」)やそれを修飾している語(「近くの」)を取り出して、「探す」だからWebで検索、Googleに「喫茶店 近く GPS座標」を入力、とする……。しかし、これを実装する方法はたくさんあるだろう。自然言語の動詞はあいまいだ。「探す」は目的語によってするべきことが変わってしまう。喫茶店を探すならWebで検索することになるが、IoT家電を導入したので接続できるものを探して、という場合は? あるいは、PCの中にあるはずの家族写真を探して、だったら? テーブル引きにせよswitchmatchにせよ、早晩無理が来るように思える。

まあ、まだPCやiPhoneに関係する仕事だけなら、動詞からありえる操作が入った関数ポインタへのテーブルを作っておくのは不可能ではないだろう。自然言語による表現は揺れるものなので、単に動詞だけを与えられて必要な操作を唯一つ選び出すのは不可能だろうが、操作を意味する関数側が受け取れる目的語を選別できるように実装されていれば、一度テーブル引きをしたあとは総当りでも不可能ではない量になりそうだ。それに、ユーザー個人の履歴を残しておけば、この検索もより高速にできる。データベースを動的に変えていいなら、ユーザーに多少の設定をさせれば、好きな語彙から操作を呼び出すこともできそうだ。

だが、AIアシスタントはIoTの方に向かいつつあるように見える。確かに、人間ならば朝起きて電気のスイッチまで歩くよりも、ベッドの中から「光あれ」と呟いて電気を付けたいものだろう。家を出てから「鍵閉めたかな」と不安にもなるだろうし、実際に鍵が開いていたら遠隔で閉じたい。実際、そういったテクノロジーの断片がかろうじて射程に入り始めた瞬間には既に、こういったアイデアSF小説や漫画、娯楽雑誌などによってもてはやされていた。

さて、将来的にIoTに対応しようと考えるなら、上記のような実装は少し……というか大分、つらい気がする。素朴に考えるなら、「Hey Siri、暖房付けて」と言ったらSiriがエアコンに対して、リモコンで暖房をつけるときに送られる赤外線信号と同じようにエンコードされたビット列を同じく赤外線で送ればよい、と思ってしまう。確かにこれは動くが、実現可能かと言われれば否だろう。これを実装するには、Siriがありとあらゆるエアコンの赤外線信号と動作の対応表を持ちつつそれを内部のテーブルに保持しておく必要があるからだ。これは単純に不可能である。あるいは、ユーザーがSiriが入っているデバイスを購入したあと、所持しているエアコンの赤外線信号をリバースエンジニアリングし、エンコード方法をSiriに登録する必要がある。これは知識と意欲のあるニンジャ級ハッカーならできるだろう。が、多くの消費者はニンジャ級ハッカーではない。

となると、取り得る戦略はかなり少なくなる。少なくとも、家電側が歩み寄りを見せ、AIアシスタントの中央集権をやめないといけないだろう。家電がIoT対応をして、何らかの方法でそれを操作するインタフェースを提供し、AIアシスタントがそれに則って仲介役を果たすという形なら現実的になってくる。残る問題は、どこでAIアシスタントが処理を止めるか、言い換えると、各家電がどこまでやるかだ。

極論、各家電がそれぞれスマートアシスタントを持っていれば、Siriの仕事はなくなる。「Hey エアコン、暖房22度ね」で済むなら、「Hey Siri, 暖房22度にして」を聞いたSiriは単に同じ文章を、あるいはもう音声信号そのままを周囲の家電全員にブロードキャストすればよい。よくわからなかった家電はSiriにエラーを返し、Siriは全員が失敗したときだけ失敗を伝えればよい。Siriの実装コストは極端に下がる。が、各家電の実装コストは跳ね上がるし、Siriの存在意義が怪しい。

逆の極端として、各家電はシリアライズされたデータを受け取り、それを内部で展開すると考えてみよう。これはリモコンが赤外線信号を送っているのと同じだ。だがそのままだと先述の通りうまく行かないので、ニンジャ級ハッカーがするであろうことを肩代わりする必要が出てくる。つまり、各家電が自身に送ってほしいデータのシリアライズ方法を説明できるようにしておき(例えば、JSONで送ることにしておき、必要なフィールドと型を指定するなど)、それをSiriに先に伝えておくのだ。あるいは、そのような処理をパッケージ化したデバイスドライバを同梱しておき、購入後AIアシスタント側にそれがインストールされるようにする。そうすれば、Siriは自然言語処理をしたあと、iPhone側で行うことと同様の流れで処理ができるようになる。こっちの方が現実的だろう。

この場合に問題になることがあるとしたら、まず全家電と全AIアシスタントが同意したプロトコルを先に決めておく必要があることだ。家電メーカーもAIアシスタントメーカーも、自社のプロトコルをそのままデファクトにしてしまいたいという欲求をちゃんと抑えて、それぞれのプロトコルの長所短所をしっかりと認識して突き合わせ、止揚しなければならない。それを国際規格にして、以降全員が(ある程度拡張はされるだろうが)その国際規格に準拠する。規格制定には時間がかかる気がするが、ちゃんとできればよい方法だ。既存の何かに乗っかってもよいわけだし。あと、この方法だとと、家が巨大になるとスケールしない可能性があるのではないか。というのも、家電が増えるに連れてAIアシスタントが持っている可能な操作のテーブル、あるいはデバイスドライバのリストがどんどん肥大化するからだ。高性能でたくさんの可能な操作を持っている家電を大量に買う富豪の家に買われたAIアシスタントは大変だ。受け付けるべき命令が増え続け、それでも人間を待たせてはいけない。なんだかんだ現実的な範囲では問題にならないかもしれないが、少し不安ではある。これから先、どんな奇妙な家電が増えるかわかったものではないからだ。

先の2つの解決策の中間に、「構文解析を終えた命令文を直接対象の家電に送る」というものがある。Siriは音声認識構文解析をし、自身がするべき操作(Webで検索、5分計るなど)は今まで通りこなし、自分ができる操作ではないと判断したら、できそうな家電に命令の構文木をそのまま送る。各家電は、構文木を渡されると自分で何をすべきか解釈する。すると、AIアシスタントのするべきことはかなり減る。家電側の実装コストは高くなるが、前処理済みの構文木が渡されるならスマートアシスタントを実装するのに比べるとするべきことは十分少ないだろう。また、このやり方なら家電の数が増えてもSiriがするべき仕事があまり増えないという利点もある。最悪全員にブロードキャストすればよいのだし、関係のありそうな家電にのみ送るにしても、キーワードから家電のIPへのテーブルさえ持っていればよい。家電の種類に線形にテーブルサイズは大きくなるが、家電の機能に比例してテーブルが大きくなる心配はない。いいとこ取りのような気もするが、面倒そうなところも両取りになっており、最終的には手放しで喜べる状況でもなさそうだ。この場合も規格制定は必要で、特に構文木を送るプロトコルを定める必要があり、結構面倒な気がする。家電メーカーも中途半端に賢いドライバを書かないといけない。三方一両損な形だ。やはり、各家電がAIアシスタント用のドライバを持っていて、購入時にインストールされるようにしておくのがよいのだろうか。

しかし、ずっとハッシュテーブルのようなものを持っておくと想定して考えてきたが、ここの速度と精度は性能に聞いてくるので、いろいろ試してみるべきだろう。「構文木から必要な操作を取り出す」というタスクを、「パターンに対応するラベルを貼る」という操作に置き換えることを考えると、流行りの機械学習が強みを発揮しそうな気がする。さらに、ユーザーがある程度アシスタントの動きを訂正してくれるなら、オンザフライでユーザーの癖を学習できるかもしれない。とはいえ、ユーザーが懇切丁寧に子供を育てるようにAIアシスタントに言葉とするべき仕事を教えてくれるとは思えないので、ある程度汎用で機能するような重みを先に学習して持っておく必要もある。どうせテーブル引きの場合でもテーブルを作る必要があるので、教師データを作るのが面倒ということもないだろう。ただ、テーブルがそんなに大きくならず、検索もそう難しくないとかならわざわざ学習をするまでもない。実際どういう実装になっているんだろうか。

というようなことを考えて、「Hey Siri, ソースコード見せて」と聞いてみたが、はぐらかされてしまった。今は色々と話しかけつつ、うまく口説き落とせないか試してみている。