概要
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」から非公開にしておきましょう
Stories の作成
では、ボットを作成していきます
wit.ai ではまず Stories でボットと会話するストーリーを作成します
基本的には公式の Getting Started 通り作成していけば OK です
アニメーション gif で紹介しているのでわかりやすいと思います
最終的には 1 つの質問 ( User says )に対して複数のボットの回答が用意できれば OK です
- 「ローマの天気は?」と聞いた時に getForcast という関数を呼び出して、その返り値の forecast という変数を使って天気の情報を返却するストーリ
- 場所の情報がない場合にボットが「Where?」と追加で質問して、それに対して場所の情報を返答すると天気の情報返却するストーリ
ストーリ的には 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 をクリックすれば単語の学習が完了します
完了するとすぐ下にボットに学習させた Understanding の一覧が表示されます
上図では wit/location
も登録されています
これは Stories で User says 作成時に使用した entity になります
wit.ai が用意している既存の entity を使用した場合は勝手に Understanding に登録されるようです
簡単な動作確認
ここまで設定すれば wit.ai 上で簡単な動作確認ができます
右下に「Press to chat with your bot」というバーボタンがあるのでクリックします
すると小さなウィンドウが開くのでそこに「what’s the weather in Tokyo?」と打ち込むと関数の簡単な動作確認ができます
分岐や関数のロジックをまだ実装していないので返り値は自分で選択する感じになります
これはストーリ的に問題なく作成できているかとか 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 件のコメント:
コメントを投稿