2017年1月10日火曜日

Wit.ai を試してみた

概要

wit.ai は自作の人工知能、ボットを作成することができるサービスです
テキストの入力、音声認識の入力をサポートしています
今回は Getting Started を試して簡単なボットを作成してみました

環境

  • Nodejs 5.9.1
  • npm 3.7.3
  • Mac OS X 10.11.6
  • Wit.ai (2016/08/23 時点)

アカウントの登録

アカウントの登録には Facebook または GitHub のアカウントが必要になります
自分はトップページから「Log in with GitHub」でアカウントを作成しました
アカウント作成後にメールアドレスの登録と簡単なアンケート (どんなアプリを wit.ai で作る予定) を聞かれるので適当に入力してアカウントを登録します

アカウントを登録すると「My First App」というアプリが作成されています
アプリは公開状態で作成されるので Settings から「Make Private」から非公開にしておきましょう
try_wit_ai_make_private.png

Stories の作成

では、ボットを作成していきます
wit.ai ではまず Stories でボットと会話するストーリーを作成します

基本的には公式の Getting Started 通り作成していけば OK です
アニメーション gif で紹介しているのでわかりやすいと思います

最終的には 1 つの質問 ( User says )に対して複数のボットの回答が用意できれば OK です

  • 「ローマの天気は?」と聞いた時に getForcast という関数を呼び出して、その返り値の forecast という変数を使って天気の情報を返却するストーリ

try_wit_ai_story_1.png

  • 場所の情報がない場合にボットが「Where?」と追加で質問して、それに対して場所の情報を返答すると天気の情報返却するストーリ

try_wit_ai_story_2.png

ストーリ的には 2 つありますが、wit.ai の Stories 的には 1 つです

簡単にポイントを説明します

まずは初めに User says でユーザが質問できるようにします
今回は Getting Started 通りに天気を質問するストーリを作成します
このとき、質問内の単語に entity を設定する必要があります
今回は intent (独自定義) と wit/location を使って entity を設定しています
独自定義の場合は別途学習される手順が必要になります (後述)

質問に対してボット側は getForecast という関数をコールするように定義します
getForecast は forecast と missingLocation に分岐しています
一番初めの User says で場所情報まで指定がある場合は forecast に行きます
ない場合には missingLocation に行きます

forecast の場合は forecast 変数に設定された文字列をそのまま埋め込んで「The weather will be {forecast}」と返事をさせます
missingLocation の場合はボットが更に質問するようにして、それに対して場所情報を返答すると再度 getForecast メソッドをコールして天気の情報を返すようになっています

Understanding の作成

途中「User says」を追加したところで intent という entity が登場します
wit.ai ではデフォルトでいろいろな entity (ここで言う entity はボットに学習させる単語の「意味」的なこと) が用意されています
例えば wit/age_of_person は年齢を表す単語、数値に適用する entity になります
今回は weather という単語に対して intent という entity を設定してあげます

Understanding というタブがあるのでクリックします
登録する単語に「weather」を入力し Add a new entityに「intent」を入力します
入力できたら Validate をクリックすれば単語の学習が完了します
try_wit_ai_add_word.png

完了するとすぐ下にボットに学習させた Understanding の一覧が表示されます
try_wit_ai_add_word_ret.png

上図では wit/location も登録されています
これは Stories で User says 作成時に使用した entity になります
wit.ai が用意している既存の entity を使用した場合は勝手に Understanding に登録されるようです

簡単な動作確認

ここまで設定すれば wit.ai 上で簡単な動作確認ができます
右下に「Press to chat with your bot」というバーボタンがあるのでクリックします
すると小さなウィンドウが開くのでそこに「what’s the weather in Tokyo?」と打ち込むと関数の簡単な動作確認ができます
try_wit_ai_test_story

分岐や関数のロジックをまだ実装していないので返り値は自分で選択する感じになります
これはストーリ的に問題なく作成できているかとか entity の割当が問題なくできているかなどの確認に使う感じになります

次で Stories で定義した関数や分岐処理を実装していきます

クライアントアプリの作成

では、実際のロジックを作成していきます
と言ってもサンプルがあるのでそのまま使う感じになります

  • cd data/repo
  • git clone https://github.com/wit-ai/node-wit
  • npm install --save node-wit
  • node --use_strict --harmony_destructuring node-wit/examples/quickstart.js xxxxxxxxxxxxxxxxxx

でとりあえずサンプルを実行することができます
xxxxxxxxxxxxxxxxxx の部分は自分のアプリに設定されている Server Access Token を指定してください
Server Access Token は Settings から確認することができます

処理はサンプルのスクリプトを見れば書いていますがポイントは actions というオブジェクトを生成する処理にあります

const actions = {
  send(request, response) {
    const {sessionId, context, entities} = request;
    const {text, quickreplies} = response;
    return new Promise(function(resolve, reject) {
      console.log('sending...', JSON.stringify(response));
      return resolve();
    });
  },
  getForecast({context, entities}) {
    return new Promise(function(resolve, reject) {
      var location = firstEntityValue(entities, 'location')
      if (location) {
        context.forecast = 'rainy in ' + location; // we should call a weather API here
        delete context.missingLocation;
      } else {
        context.missingLocation = true;
        delete context.forecast;
      }
      return resolve(context);
    });
  },
};

ここで getForecast の関数を定義しています
firstEntityValue で Use says に含まれる entity に「location」entity が含まれているか確認して含まれていれば、そのまま場所情報を含めて forecast 変数に設定し、なければ missingLocation を true にします

missingLocation が true の場合は先ほど Stories で作成した Where? の流れにいきます
そして再度場所情報を質問して、また location が含まれるか確認してあれば forecast に値を設定します

この部分が今回作成したボットの核となる部分になります
例えばここで本当に天気の API 等を呼び出して天気情報を取得し返却する等の処理を本当は実装する必要があります

動作確認

では、動作確認してみましょう
先ほどの node コマンドをコマンドライン上で実行します
すると以下のようにボットと会話できると思います

> what's the weather?
sending... {"text":"Where?"}
> in Tokyo
sending... {"text":"The weather will be sunny in Tokyo"}
> what's the weather in Paris?
sending... {"text":"The weather will be sunny in Paris"}

今回は本当に単純なボットなので、全然関係ない話をしても全部「Where?」で返してくると思います
今回のロジックだと場所情報が含まれていない限り全部「Where?」になります

最後に

wit.ai を使って自作ボットを作成してみました
Hubot みたいにボットではあるのですが、自分でデータを学習されることが可能でその学習させたデータによっていろいろなボットの動きを制御できるので、Hubot などに比べてより複雑な処理ができるようになると思います

まだ Getting Started を触っただけなので具体的な用途が見えてきません
音声認識もできるみたいなのでそれも試したり、別のボットを作成してみると用途が見えてくるかもしれません

参考サイト

0 件のコメント:

コメントを投稿