せっかくならデキるエンジニアになりたい

SIerになったので、デキる技術者を目指していろいろ試してみたときの備忘録

memorandum

Let's be a good engineer!

Watson Assistantでチャットボットを作ってみた話

なんでWatson?

大学1年生の頃に、何かの授業でIBM Watsonのプロモーションムービーを見せられたんですよね。
こんな感じの。


IBM Watson: How it Works

近未来感がすごすぎて大興奮したのはいいものの、当時は

(´-`).。oO(いつかWatsonの製品が出たら買おう、そうしよう)

で終わっていました。まだ授業でC言語をちょこっと触ってたくらいで、自分でWatsonを使って何か作るっていう発想自体がなかったのです。

しかし数年後(まだ大学生)、Watsonが無料で使えるという記事を見つけました。APIが提供され始めたという記事です。
ものすごーく興味はあったんですが、ちょっと調べてみてからやめました。英語ばっかりだったからです。

でも今ならいける気がします。就職してから一般的なIT知識もそこそこ分かるようになりましたし、英語もGoogle翻訳さんがいます。最近の和訳の精度恐ろしいですよね。最高です。

ということでめくるめくWatsonの!!世界へ!!!
↓↓↓

watson APIとは?

流石にお仕事上APIってよく聞くんですけど、「アプリケーション・プログラミング・インターフェース」の略だそうです(知らなかった…)。
言葉通りに取ると、アプリケーション(Watson)をプログラミングに組み込む(そして利用する)ためのインターフェース(方法?)てことになります。

こんな分かりやすい記事を見つけました。
自然言語や性格分析も!知っておきたい Watson API まとめ

どうやら、IBM Cloudを利用してAPIを使えるっぽいです。AWSとかMicrosoftAzureとかGoogleCloudのIBM版とみました。
どれも使ったことも触ったこともないので、IBM Cloudが初のクラウドコンピューティングデビュー。どきどきします。正直使いこなせる気はしません。頑張ります。

使うAPIは、Conversation(会話)にします。Watsonと会話。うーん近未来。

IBM Cloud

IDを作る

IBM Cloud アカウントを作る
とりあえずライトプランでアカウントを作りました。

ダッシュボード

f:id:moeka-dev:20180317234200p:plain ちゃんとチュートリアル出してくれるところに優しみを感じる…
リソースっていうのは、きっとこれのことですね↓
地域とロケーション
私が今からいろいろ作業するサーバー(物理)は、米国南部のデータセンターにありますよってことだと思います。なんだかいきなりクラウドコンピューティングって実感が湧いてきました。
サーバー(物理)をどこにするかっていうのも選択できるんですね。通信速度とか、コンプライアンスとかによって変えたりするんでしょうか。とりあえずこのままにしておきます。

Conversationチュートリアル

ダッシュボードからWatsonのConversationのチュートリアルを開いてみると、WatsonAssistantの概説チュートリアルに飛ばされました。
f:id:moeka-dev:20180317234207p:plain なんと全部日本語。Cloudは思ったより優しい世界でした。
とりあえず公式チュートリアルに沿ってやっていけば間違いはないはず。

Watson Assistantで会話をさせてみる!

(´-`).。oO(あれ?Conversationでは?)
と一瞬思いましたが、多分ConversationAPIを使えるツールの名前がWatson Assistant…という関係性なんだと思います。名前がいっぱいあって大変です。

Watson Assistanサービスを追加

f:id:moeka-dev:20180317234214p:plain (´-`).。oO(どこに何を追加するんだ…)
こういうサービスって何も考えなくても使えるのがいいところなんですけど、中で何がおきてるのか知りたい派にとってはたまに辛いです。
とりあえず、私のアカウントにComversationAPIを使うための資格情報を追加するってことですよね。

プロジェクトの作成

とりあえず特定の用途に特化はさせずにいろいろ試してみる予定なので、プロジェクト名は適当につけてライトプランで作成します。 f:id:moeka-dev:20180317234221p:plain f:id:moeka-dev:20180317234229p:plain 作成できました!
ちなみにAPIリファレンスは完全に英語でした。はい。

ツールの起動

ツールの起動をクリックします。別タブが開いてしばらく読み込みマークがぐるぐるします。
全然関係ない話なんですが、デフォルトで別タブ開くのってめちゃくちゃ助かりますよね。わかってらっしゃる。
起動が完了してページが表示…

f:id:moeka-dev:20180317234236p:plain あ〜〜〜英語〜〜〜
IBM CloudのJennyさんからのメッセージはまぁいいとして、後ろにもなんだか英語が見えます。

Jennyさんからのメッセージ

とりあえず英語頑張るって決めたのでJennyさんからのメッセージを読みます。

Introducing Watson Assistant, the new name for Watson Conversation

あれ、ちょっと前に
"多分ConversationAPIを使えるツールの名前がWatson Assistant…という関係性なんだと思います。"
って書いたんですが、どうやら違ったようです。昔は「Watson Comversation」って名前だったけど、「Watson Assistant」という名前に変わったんですね。

This new name better reflects our product direction and vision for how conversational assistants are built.

新しい名前の方がよりJennyさんたちが思い描く方向性やビジョンに合っているそうです。なるほど。

・ Digressions
・ Pre-Built Intents
・ Set Context Variables in Dialog Quickly (vs. JSON updates
・ Dialog Folders
・ Search Intents & Entities
・ Enhanced Analytics Dashboard
・ Separated Log Files with Deployment IDs
・ Dialog Tracing in the Try-It Panel

新しく追加された機能の一覧のようです。ここは潔くGoogle翻訳さんに頼ります。

  • ディグレッション
  • あらかじめ作成されたインテント
  • Dialogでのコンテキスト変数の設定(対JSONアップデート)
  • ダイアログフォルダ
  • 検索インテントとエンティティ
  • 拡張分析ダッシュボード
  • デプロイメントIDを使用したログファイルの分離
  • Try-Itパネルのダイアログトレース

なんだかいろいろ便利機能が追加されたんだなということは何となく伝わってきます(適当)

And in addition to all of this, you can now request access to our BETA program to see where things are headed and to test out features before they're generally available!

さらに、Jennyさんたちが作ったベータプログラムにアクセスリクエストが可能で、新機能が世の中に出る前に試せるらしいです。技術はどんどん公開していくスタンスなんですね。好きです。

Introducing

f:id:moeka-dev:20180317234244p:plain イントロデュースのページには、簡単な概要やWatsonAssistantのコンセプト、ツールの使い方などを説明した動画がたくさん貼り付けてあります。文章じゃなく動画っていうのがいいですね。まあ聞き取れないんですけどね!!!。゚(゚´ω`゚)゚。
流し見て雰囲気だけ感じ取ります。

Watson Assistantを使うための簡単なステップも書いていました。

1. Create intents and entities
2. Build your dialog
3. Test your dialog

  1. Watsonが学ぶことができるような例(インテントとエンティティ)を作る。
  2. 1で作ったインテント・エンティティとアプリケーションのコンテキストを使ってダイアログ(会話)を構築し、仮想アシスタントが適切に応答できるようにする。
  3. 作ったダイアログがちゃんと想定通りに反応するかテスト!

ふむふむなるほど。例を作るのがちょっと大変そうな感じがしますね。

ワークスペースを作成する

f:id:moeka-dev:20180317234253p:plain プロジェクトの中に、さらにワークスペースを作るんですね。
これが成果物のコンテナになるらしいです。1ワークスペースが1会話フローって感じの認識ですかね? f:id:moeka-dev:20180317234301p:plain こんな感じのワークスペースを作りました。天気の話ができたらいいなぁという願望を込めました。 f:id:moeka-dev:20180317234308p:plain できた!
タブが4つあって、インテント、エンティティ、ダイアログ、コンテンツカタログというカテゴリーに分かれています。
さっきステップに出てきた単語ばかりなので何と無く用途はわかりますね。コンテンツカタログはこんな感じでした。 f:id:moeka-dev:20180317234315p:plain

うわ便利〜〜〜〜
これきっと言語を英語とかにしたらもっとあるんだろうなぁ
なんだか便利そうなので、「一般」カテゴリのインテントワークスペースに追加してみました。

Intents

コンテンツカタログにあったものをワークスペースに追加すると、インテントはこんな感じになります。
f:id:moeka-dev:20180317234322p:plain

あ、挨拶がもうすでにある。クリックしてみます。 f:id:moeka-dev:20180317234330p:plain

例がいっぱい並んでいました。

「好ましくないフィードバック」というのもある。 f:id:moeka-dev:20180317234341p:plain

なんか辛辣っすね…(´・ω・)

どうやらインテントというのは、「ユーザーからこんな感じのことを言われたら、それは挨拶だよ!」「これは好ましくないフィードバックだよ!」というのを定義するもののようです。
これがあるから、何か一つのことをしたい時のいろんな表現に対応できるんですね。なるほど。

Entity

を追加するのかなーと思っていたら、チュートリアルにはその項目がなかったので、きっとなくても会話はできるんだと思います。
エンティティは後から触ってみることにします。

Dialog(対話を作成する)

Dialogタブ内で、対話を定義していきます。
とりあえずCreate。 f:id:moeka-dev:20180317234348p:plain こんな画面になりました。なんだこれは。「ようこそ」をクリックしてみます。
f:id:moeka-dev:20180317234355p:plain これみたらなんとなく用途がわかりました。Watsonになんて喋らせたいかを決めるんですね。

Nodeの構成

If bot recognizes:で、会話のトリガーを指定するようです。 f:id:moeka-dev:20180317234402p:plain ここの条件を全部満たせば、後に続くThen respond with:の返答をする、と。
「If」には、intentsやentity、context variables指定でき…context variablesってなんだろう…?  

コンテキスト変数
↑に説明がありました。会話(ノード)をまたいで値を保持する変数ってことですね。Webサービスでいうセッションみたいなイメージ。
せっかくなので、名前を覚えてもらおう!!

コンテキスト変数の設定

Watsonに名前を覚えてもらいたいので、起動させたらまず名前を聞くようにします。 f:id:moeka-dev:20180317234410p:plain 完全にキャラがぶれぶれのやばい奴ですね。

名前を保持するには、「これは名前だ!」というのをWatsonが認識しないといけないので、それをエンティティとして定義しないといけないっぽいのですが、「名前」みたいな一般的な概念は、システムエンティティというのが使えるようです。
有効化〜 f:id:moeka-dev:20180317234417p:plain ない…(´・ω・)

サポートされる言語を調べたらどうやら、現在はsys-personエンティティは英語BETA版でしか扱っていないようです。Jennyが言ってたベータプログラムってここかぁ…そうだよね、名前って難しいもんね。

てわけで自作。 f:id:moeka-dev:20180317234424p:plain うーん適当。Synonmsで同義語を入れられるらしいんですが、そもそも名前だから同義語も何もないですね。そして私の名前しか認識しませんこのWatson。今はこれで許してください。

Dialogに戻って、子ノードを作ります。子ノードってなんじゃ!って方はダイアログのフローをみると大体わかります。

f:id:moeka-dev:20180317234438p:plain こんな感じで作りしました。これできっと覚えてくれるはず…!

そしてそのまま挨拶されるように指定してみる。 f:id:moeka-dev:20180317234447p:plain

テスト!

すぐそこにTry it!っていうのがあって、すぐにテストできるのよいですね。
やってみます。

f:id:moeka-dev:20180317234454p:plain おお!!「もえかだよ〜」って言ったのがジョークだと認識されてるのがちょっと笑えますがうまく行きました( ・∇・)
上の「Manage Context」ってところからコンテキストの現在の状態もみれました。 f:id:moeka-dev:20180317234502p:plain 保存されてる〜〜嬉しい〜〜

まとめ

今回は簡単な会話だけでしたが、IBM Cloud Docsをちょっとみる限り、かなり難しい会話もできそうです! とりあえずJSONを頑張って書こうと思いました笑

次にやりたいこと

  • Slackと連携
  • お天気APIと連携