Watson Assistantを使ってみた

# はじめに
IBM Watson Assistant(旧Conversation)を利用したチャットボットを組込んだアプリを作ることを想定して、アプリケーションからWatson Assistantを実際にアクセスしてみました。実際に動かす時の流れを記載する前に、自分自身、色々と誤解や過度な期待もあったりしたので、ここではWatson Assistantの位置づけを整理します。
~~(思いのほか前置きが長くなってしまったので記事分けます。)~~
※Watson Assistant提供のAPIを使ったコーディングのメモを書こうと思いその前段の記事を書いたつもりでしたが、訳あって後続記事書くのを断念したのでタイトル変えました。

参考: [Watson Assistant (旧Conversation)](https://www.ibm.com/watson/jp-ja/developercloud/conversation.html)

#AIって何だ？

“Watson“というと”IBMのAI”というイメージがあるかと思います。ここで敢えて極端な言い方してますが、少なくともAIに関連付けて語られることが多いと思います。IBMのサイトを見てみると、「IBM Watsonは、お客様のビジネスに活用いただくためのAIです。」てなことが書いてあったりします。ふむふむ。
ただ、そもそもAIって何だ？というが結構曖昧です。昨今は空前のAIブームで何でもかんでもAIと呼びだたがる風潮が感じられます。(個人的にはそのうちブームは去るかと思っていましたが、思いのほか長く続いていますね...)

2018/10/11にガートナーから2018年版のハイプサイクルが発表されており、そこではAIが幻滅期に入ったとされています。
参考: [2018年度版「日本におけるテクノロジのハイプサイクル」：AIやブロックチェーンは幻滅期へ、ガートナーが発表](http://www.atmarkit.co.jp/ait/articles/1810/12/news049.html)

さて、最近の”AI”と呼ばれているものの実体としては画像認識、音声認識、自然言語処理辺りのことを指している気がします。この辺りを機械でやらせていると(+機械学習の要素が含まれていたりすると)と、もうそれは”AI”と呼ばれてしまう感じですね。文脈によってはそれを”AI”って言っちゃう？というのが多々ありますが、まぁ世の中そういう流れになってます。こういう”AI”の安売りと、”AIによって雇用が奪われる”みたいな論調などが相まって、色んな誤解が生じやすくなっているような気がします。

Wikipediaの人工知能の説明の変遷を見るとなかなか興味深いです。

～2017/12/31
https://ja.wikipedia.org/w/index.php?title=%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD&oldid=66676623
>人工知能（じんこうちのう、英: artificial intelligence、AI）とは、人工的にコンピューター上などで人間と同様の知能を実現させようという試み、あるいはそのための一連の基礎技術を指す。 

2017/12/31～
https://ja.wikipedia.org/w/index.php?title=%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD&oldid=66809471
>人工知能（じんこうちのう、英: artificial intelligence、AI）とは、「計算機（コンピュータ）による知的な情報処理システムの設計や実現に関する研究分野」を指す。 

2018/8/15～
https://ja.wikipedia.org/w/index.php?title=%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD&oldid=69594154
>人工知能（じんこうちのう、英: artificial intelligence、AI）とは、「「計算（computation）」という概念と「コンピュータ（computer）」という道具を用いて「知能」を研究する計算機科学（computer science）の一分野」を指す語。「言語の理解や推論、問題解決などの知的行動を人間に代わってコンピューターに行わせる技術」、または、「計算機（コンピュータ）による知的な情報処理システムの設計や実現に関する研究分野」ともされる。

>『日本大百科全書(ニッポニカ)』において、情報工学者・通信工学者の佐藤理史による解説では、次の通り述べられている。
「 誤解を恐れず平易にいいかえるならば、「これまで人間にしかできなかった知的な行為（認識、推論、言語運用、創造など）を、どのような手順（アルゴリズム）とどのようなデータ（事前情報や知識）を準備すれば、それを機械的に実行できるか」を研究する分野である。

少し前までは"AI"というのは特に限定された領域のみではなく人間と遜色ない判断をするもののような捉え方をしていたように思いますが(チューリングテストで判断されるような...)、だんだんその敷居が下がってきている感じです。
顕著な例として、ちょっと前にAI関連のニュースをググってみたら驚愕の記事に出くわしたので引用しておきます。

[東京新聞【神奈川】県庁の業務をＡＩが代行　きょうから試験導入 (2018年9月25日)](http://www.tokyo-np.co.jp/article/kanagawa/list/201809/CK2018092502000115.html)
>　県は２５日から、定型的な業務を人工知能（ＡＩ）に任せるシステムを試験導入する。１２月末までシステムを動かし、県職員の労働時間短縮で削減できる人件費と、システム導入の費用を比べた上で、来年度に正式採用するか決める。

**定型的な業務**をAIに任せるんですって。"定型的"ってIntelligenceとは対極にあるように思うんですけど。それって単に自動化とか機械化ってことではないんでしょうか？こういう記事がまかり通るくらい"AI"っていう言葉が蔓延しています。
技術の進歩を促したり物事を前進させたりするのに、こういう"勢い"みたいなものも大事だったりするんでしょうけど、技術者目線からすると、その実体って一体何？というのはきちんと押さえておきたい所です。

#Watson Assistantって何だ？
Watsonという冠がつくサービスや製品が色々とありますが、Watson Assistantというのは、はチャットボットのような会話をベースにするアプリケーションを簡単に作るための支援機能を提供するサービス、と位置づけられます (以前はWatson Conversationと言っていたものが名前が変わったようです)。
あくまで"支援機能"を提供するのであって、何でも答えてくれるチャットボットそのものがいる訳ではありません。会話で何かを進めていくアプリを作るのに便利な機能が提供されてますよっていうことです。Watson Assistantの詳細な説明は色々あるので、ここでは位置づけを理解するために重要と思われる観点で整理します。

## Watson AssistantのAIっぽいところ
Watson Assistantでは何ができて、どの辺がAIっぽいんでしょうか？

### 意図(インテント)の分類
それは、"自然言語処理"部分です。"会話"を前提にしているので、当然入力となるのは"自然言語"です。「こんにちは」とか「今日の天気調べて」とか「ライトつけて」などなど...。
こういう会話文などの自然言語で入力されたものを解釈して、形態素解析を行ってその意図を分類する、というのがAIっぽい主な機能だと思います。
例えば「ライトつけて」という文が入力されたら、「つける」という意図(インテント)と、その対象(エンティティ)が「ライト」であることを認識します。「ライトつけろ」とか「ライトつけてください」とかゆらぎがあっても同じ意図であるということを判断してくれます。さらに、うまく認識できない表現が出てくるかもしれませんが、いろんなケースをトレーニングさせる機能があるので、多くのケースを学習させることで意図認識の精度を上げることができます。
具体的には、最初に取り扱いたい意図(インテント)を定義して、例文をいくつか入れて、こういう文章がきたらこういう意図だと理解して欲しいというのを設定しておきます。
例えば、"スイッチオン"という意図(インテント)を定義し、例文として、
 -ライトつけて
 -ラジオオン
 -電気つけろ
とかを入れておきます。
後から実際のチャット画面のようなものからトレーニングさせることもできます。ま、AIっぽいと言えると思います。

### 対象物(エンティティ)の分類
ライトとかラジオというのをオン/オフの操作対象である"機器"の一種であるということを定義しておき、「ライトをつけて」という会話文から、操作対象である「ライト」を認識します。ま、意図の分類と同じようなものですね。(基本インテントは「動詞」でエンティティは「名詞」)
ライトとかラジオとかをどういう操作対象とするかはアプリによって違うので、そこは厳密に事前定義をしておくことになるので、そこはAIっぽくはないです。例えば、
"機器"というエンティティを定義して、その実際の値として"ライト"とか"ラジオ"とか"照明"とかを定義しておくわけです。ここでは"ライト"と"照明"は同じ対象物ですよ、というように同義語を定義することもできますが、これも何と何を同じものとして扱いたいかは要件次第なので、厳密に定義しておくものです。
ただ、このエンティティに登録される単語の判定で、Fuzzy Matchingという機能が使えるようで、英語だとスペルミスなどがこれで拾えることがあるようです。日本語だとどこまで拾えるのか疑問ですし学習できる要素があるかもちょっと謎ですが、これはまぁ100歩譲ってAIっぽいと言えるかも。

## Watson AssistantのAIっぽくないところ(人がやってあげなくちゃいけないこと)
AIっていうと、何でもかんでも勝手によろしくやってくれそうなイメージ/先入観があったりしますが、そうではありません。

### 意図(インテント)/対象物(エンティティ)の定義
上でも示していますが、作りたいアプリでは、どういう動作をハンドリングしたいか、その時の対象物は何を扱いたいか、というのは要件次第ですので、それらは事前に定義しておかなければなりません。
何かをつける操作を行わせたいアプリを作るのであれば、「つける」というインテントを定義しておかなければなりませんし、対象として「ライト」と「ラジオ」を扱うのであればそれらのエンティティを定義しておくことになります。

### 会話(Dialog)の定義
ここもちょっと事前イメージとはギャップが出てくるところかもしれませんが、こういうインテントの入力があったらこういう操作をしてこういう応答を返します、というのは人が事前に定義しておいてあげる必要があります。応答文の候補をいくつか定義しておいて、それをランダムに返すとかはできます。こういうフローをブラウザのGUIで作るツールが提供されていたりしますが、やることはif文の羅列のイメージです。
例えばコードっぽく書くとこういうことを定義していくことになります。

```
  if (<Intent> == "つける") {
    <Entity>のスイッチをオンにするアクションを実行
    "<Entity>をオンにしました" という応答を返す
  } else if (<Intent> == "けす") {
    <Entity>のスイッチをオフにするアクションを実行
    "<Entity>をオフにしました" という応答を返す
  } else if (<Intent> == "調べる") {
    <Entity>をググるアクションを実行
    ググった結果を応答として返す
  } else {
    "理解できませんでした、表現を変えていってみてね！"を返す
  }
```

どういう会話/アクションをどういうフローで実施するか、というのを人が設計して定義しておく必要があるんですね。これをGUIでできるインターフェースが提供されてますが、プログラミング言語を知ってる人からするとコード書くほうが分かりやすいと思ってしまうかもしれませんね。
でもこれらの定義はJSONで作ってREST APIで更新するっていうやり方ができるので、会話ロジックを変更する際にプログラムを修正する必要が無いということになります。
まぁでもこれはAIっぽくはないですね。
AといわれたらBを返すみたいなことを定義していくものなで、この部分だけとってみると、それって大昔に「人工無能」と言われていたものと大して変わらないなぁなんて。(実際の所はコンテキスト情報を持ちまわったり、スロットと呼ばれる必要な情報をストックしていくような仕組みがあったり、そういう便利機能は備わっていますけど、それらもAIと呼べるほどの革新的なものではなさそうです。)

## 結局...
「WatsonはAIだ」という前提から入ってしまうと、なんでもかんでもやってくれそうに誤解しがちなので、このツール使えばAIっぽいものを簡単に作れますよ、という位置づけだと捉えておく方がよいように思います。あくまでも出来上がるものがAIっぽいものなんだと。
出来たモノがAIっぽく見えるかどうかは、まだ作る人に依存している部分が多いけど、今後はツール側のAIっぽい領域が増えて賢くなっていくんだと思います。
まぁ自然言語が扱えるというのが1つの大きなエポックメイキングなことなんだと思います。


# API使うにあたっての参考情報
この辺が参考になるでしょう。
[Watson Assistant - Getting started tutorial](https://console.bluemix.net/docs/services/conversation/getting-started.html#gettingstarted)
[IBM Cloud API Docs - Watson Assistant v1](https://console.bluemix.net/apidocs/assistant?language=java)
[GitHub  watson-developer-cloud/java-sdk](https://github.com/watson-developer-cloud/java-sdk/tree/master/assistant)
[JavaDoc](https://watson-developer-cloud.github.io/java-sdk/docs/master/com/ibm/watson/developer_cloud/assistant/v1/model/Context.html)
[Watson API Explorer](https://watson-api-explorer.ng.bluemix.net/apis/assistant-v1)
[sample](http://conversation-simple.ng.bluemix.net/)