現在のAI技術を前提にあらためてBotによるIoTアプリの可能性を考えてみた


## 畑Botのデモ
https://youtu.be/nFT_H-3EguU

これはLINEを使って畑と対話するIoTアプリです。

Raspberry Piを使ったセンサーデバイスから土壌湿度情報を計測し、クラウドのデータベースに定期的に情報を保存し、それをWebコンソールで可視化しています。ここまではIoTのごく一般的かつ最もベーシックなユースケース。

この仕組みを裏側で動作させつつ、BotをLINE上で動作させてLINEをアプリのUIとし、「畑と対話する」ことを可能にする例です。

このアプリ自体は非常にシンプルな仕様ですが、BotをUIとすることでこれまでのアプリとは少し異なるシステムが構築できる可能性を示唆していると思います。

その構成要素について少しばかり詳しく見ていきたいと思います。

## Botとは？

![スクリーンショット 2016-07-28 18.05.19.png](https://qiita-image-store.s3.amazonaws.com/0/26079/371a6441-6266-4380-709a-0813231a22b2.png "スクリーンショット 2016-07-28 18.05.19.png")


Botは **人の代わりに何かをしてくれるプログラム** と解釈して大きな乖離はないと思います。

従来は悪意のあるプログラムやウィルス、という認識もありましたが、現在では自動応答をこなしたり、スケジュール通りにタスクを実行したり、お願いしたことを実行してくれたりと、使い方によっては中々便利なヤツという認識が広がってきていると思います。

もっとも身近な例で言えば、iOSに搭載されているSiriもBotの一種。人間が自然に話しかけた内容を理解して仕事を実行してくれる、いわゆるコンシェルジュタイプのBotです。Siriの他にもAmazonさんからは音声認識エンジンAlexaが搭載されたAmazon Echoが発売されたり、GoogleさんからはチャットアシスタントのAlloがアナウンスされたりと、今最もホットな領域の一つだと思います。

## なぜ今Botが熱いのか？

自然言語処理技術の進歩がBotブームに火がついた一因になっていると思います。これは「AI」的な能力を持つBotを開発する上で不可欠な要素です。

Siriに代表されるようにコンシェルジュ型のBotは人間の話言葉を理解し、それに答えてくれます。このとき、重要なのはまず人間からお願いの「意図」を把握することです。これはIntentという単語で多くのAI系自然言語処理のAPIやサービスで共通して登場する概念です。

要は「何をしてほしいのか」をまず理解するところが最も重要なステップになります。それに加えて例えばお好み焼きを注文する場合には「意図」は「お好み焼きの注文」ということになりますが、この注文が完結するためには、お好み焼きの種類、数といったパラメーターが最低限必要です。

こういった自然言語を理解し、構造化して意図とパラメーターを抽出するという処理は長らく実験的なフェーズが続いていましたがいよいよ現実的なものになってきました。よってBotが人と同じような理解力、対話力を身につけ、仕事を代わりにこなしてくれるスコープが広がってきており、映画のような未来的な世界が目の前に来ている感。それがBotブームを牽引する原動力になっているのではないかと思います。


## これまでのアプリとBotの違い

![スクリーンショット 2016-07-28 18.06.39.png](https://qiita-image-store.s3.amazonaws.com/0/26079/9ec2e8c2-6596-f9ac-02de-e6428747522f.png "スクリーンショット 2016-07-28 18.06.39.png")


これまでのアプリやシステムは、システム側で決められたルール（マニュアル）に沿って操作をおこなう代物でした。よって当然まず使い方を覚える必要があります。CLIの場合はコマンドの文法、GUIの場合でもよっぽど直感的でない限りはヘルプや操作手順書が同梱されています。

BotをUIとしたアプリではこの考えが完全に逆転し、人間はルールを気にせず自分のリクエストをそのままアプリに投げかけます。そういう意味ではBotをUIとするアプリは使い方を覚える、という考え方や「マニュアル」というものが存在しないというが非常に大きな違いです。

したがってこれまで使い方を説明することが高いハードルとなっていたシステムではBotは効果的な解決策になる可能性があります。


## BotのUI開発プラットフォームの選択肢

![スクリーンショット 2016-07-28 18.07.27.png](https://qiita-image-store.s3.amazonaws.com/0/26079/fd3070d6-63df-2023-06d3-2788a93a7bc7.png "スクリーンショット 2016-07-28 18.07.27.png")

Botをサポートしているコミュニケーションプラットフォームがいくつか存在します。

- iOS (Siri API)
- Facebook Messenger
- Slack
- Skype
- LINE

iOSを除き、あくまでもこれはUIの部分です。ボットの挙動をプログラムするのは他のPaaSなどで実装することになるでしょう。

例えばLINEの場合はボットがメッセージを受信した場合それを知らせるCallback URLを設定します。そのCallback URLが示す場所でボットのプログラムを動作させることになります。

一例として、冒頭のデモは下図のようなアーキテクチャーになっています。
![スクリーンショット 2016-07-28 18.23.21.png](https://qiita-image-store.s3.amazonaws.com/0/26079/178e4b36-0116-22b2-0e54-333169a3568b.png "スクリーンショット 2016-07-28 18.23.21.png")



LINEをUIとしながら、ボットのプログラムはnode.js上のWebアプリで実装しています。このアプリはLINEからCallbackを受け取って処理し、最終的にLINEにメッセージを返す仕様なのでUIは実装されておらず、ユーザーにはLINEしか見えません。

そしてこの構成で自然言語処理を担っているapi.aiは日本語処理にも対応しているのですが、どうも現在のところ英語と比較してその理解度に差があるという感覚です。したがって一度Goole Translateでメッセージの翻訳を行い、それをapi.aiで処理する形にしています。


## Botを使ったイノベーティブなアイデア：「医者のサブスクリプション」

多くの人にとってお医者さんや病院というは具合が悪くなったときにお世話になるシステムです。当然、医者に行くときにはすでに体には不具合が生じており、場合によっては不具合は生じているけど中々時間がなくて医者に行けない、という状況もあるでしょう。

健康診断という仕組みも多くの会社員は一年の一度通う程度。もしその一年の間にガンが発生していたら、次の健康診断まで進行してしまいます。

「身内に医者がいればいいのにな」というのは誰しも思ったことがあるのではないでしょうか？　理想的には毎日健康状態をチェックするような医療システムがあれば、すべてではないにしても病気を未然に防ぎ、ガンの進行を遅らせることができるかもしれません。

そんなとき、Botがもし常にあなたの健康をチェックし、何か予兆をとらえたときにあなたに教えてくれたら？　単にメールでアラートを送ってくれるだけでも十分意義があると思います。それに加えて、仕事で忙しくで病院には行けない中でも、電車の中でスマホから気になるところを質問し、即座に回答が得られたら？

実際にそういった試みがおこなわれているようです。
[Facebook Messenger用の症状チェッカーBotをリリースしました](http://info.medley.jp/entry/2016/06/02/153948)

医者がボットとしてあなたのそばにいてくれたら医療のあり方は「医者に行く」から「医者を購読する（サブスクリプション）」という形に変わっていくかもしれません。

## 実装上、最も重要なテクノロジー「機械学習」

やはりこの仕組みで最も重要なのはAI的な要素であり、それを支える機械学習のテクノロジーだと思います。

機械学習といっても構造化データを取り扱うクラスタリングやディシジョンツリーにはじまり、ニューラルネットワークといった最近人気の分野も存在します。

今回の仕組みでまず不可欠なのは自然言語処理。

自然言語処理は太古の昔から研究されているわりに中々結果がでなかった極めて難度の高いIT課題ですが、ここ数年の進歩が目覚しく、研究者ではない一般的なエンジニアでも利用して新たな価値を生むことができるレベルとなりつつあります。

それを実証しているのが各社からのAPIの提供です。APIが提供されることにより、AIの中の知識をゴリゴリに学ばずとも、その恩恵を受けることができるようになるため、これは極めて重要なマイルストーンだと思います。


## 自然言語処理の選択肢

いくつかのサービスがAPIを提供しています。それぞれ意図しているユースケースや機能が異なりますので簡単にまとめてみました。すべて無償で利用できる枠やEditionが存在しますので手元ですぐにテストしてみることができます。

**[api.ai](https://api.ai)**

今回のデモアプリでも利用しているサービスで、会話を入力として与えることでIntent（意図）を抽出してくれます。

意図を表すいくつかの例文を与えることで学習し、例文と完全一致する文章でなくても意図をくみ取ってくれる、というのが最も重要な機能となっています。その他、複数のやりとりで徐々にユーザーから必要な情報を収集するコンテキストを保存する機能も備えています。

日本語にも対応していますが、私がいろいろ試した中では英語の方が圧倒的に少ない例文から的確に意図を学習してくれる、という印象です。

**[wit.ai](https://wit.ai)**

機能的にはapi.aiと近しいですが、Storyという機能でユーザーとの会話のキャッチボールをシミュレーションするようなインターフェースが特徴的です。単発の受け答えではなく、より対話的なコミュニケーション能力に重きを置いてそうです。

2015年1月にFacebookにより買収されたようです。Facebook Messengerなどへの機能強化が目的と推察できますが、現在のところwit.aiの単独サービスも継続しています。

**[Goole Cloud Natural Language API](https://cloud.google.com/natural-language/)**

2016年7月にアナウンスされたばかりのベータ版。

感情分析、エンティティ抽出、文法的分解という3つが機能の主軸となっています。

**[Yahooテキスト解析API](http://developer.yahoo.co.jp/webapi/jlp/)**

私が知る限りかなり前から提供されているサービスで、Yahoo Japanさんが提供しているだけあって日本語に特化したルビ振りなどといった機能が特徴的。

ユーザーとしては機械学習的な機能を利用できるわけではなく、あくまでも今ある辞書、解析モデルで文章を分析するサービスなのでAI的に意図を抽出する、というような用途ではありません。

## まとめ

IoTとAIとBot。これらのテクノロジーを撚り合せることでアプリだけど使い方は覚える必要がない。常にユーザーの側にいてくれる。どんどん賢くなる。APIという形でAIが利用できるようになったことで、我々エンジニアそういったシステムが作り出すことができる時代が来ていると感じます。