特集
» 2016年04月15日 05時00分 公開

特集: 新たなアプリ「ボット」の時代:Microsoft Bot Frameworkでボットを作成してみよう (3/4)

[かわさきしんじ,Insider.NET編集部]

ユーザー入力の内容の利用

 今度はユーザー入力をそのまま返すだけのボットを作成してみる。これにはaddメソッドに渡すfunctionの引数「session」を利用する。以下にコードを示す。ここではbot.addメソッドの内容だけを表示する。

bot.add('/', function (session) {
  session.send(session.message.text);
});

ユーザーデータの入力をそのまま返送する

 session.messageプロパティには、ユーザーが入力した内容に関する各種の設定が保存される。その中でも、session.message.textプロパティがユーザーが入力したテキスト自体を表しているので、これをそのまま返送するだけだ。

エコーボット エコーボット

 sessionオブジェクトには、この他にも多くのデータが設定される。ユーザーとの会話の中で、そのセッションにのみ有効なデータを保存するには、userDataプロパティを使用できる。ユーザーに名前を聞いて、これを使ってあいさつをするようにしてみよう。

bot.add('/', function (session) {
  if (!session.userData.name) {
    session.beginDialog('/getname');
  } else {
    session.send("hello, " + session.userData.name);
  }
});

bot.add('/getname', [
  function(session) {
    builder.Prompts.text(session, "what's your name ?");
  },
  function(session, results) {
    session.userData.name = results.response;
    session.send('Hello, ' + session.userData.name);
    session.endDialog();
  }
]);

ユーザーの名前を取得する

 まず、「session.userData.name」プロパティの有無でその後の会話が変化する。なければ、新しいルート(またはID)「/getname」で会話が始まる。あれば、そのプロパティを使ってあいさつをしている。前者で使われているbeginDialogメソッドで指定したルート「/getname」を追加しているのが、協調書体で表示されているbot.addメソッド呼び出しだ。

 ここではBot Builderで「ウオーターフォール」と呼ばれる機構を使用している。ウオーターフォールは、一連の流れを持った会話をボットで行うためのものだ。第2引数は関数の配列となっていて、会話の進行に合わせて、「上から順に」それらの関数が実行されていく。直前の関数の結果は、次の関数の第2引数(ここではresults)に渡される。この会話の場合は、次のような流れがあるということだ。

  1. ユーザーに名前を聞く(会話開始)
  2. 名前を覚えて、あいさつをする(会話終了)

 この流れを、関数を使って表したのが上記のウオーターフォールになる。beginDialogメソッド呼び出しで開始した会話は、endDialogメソッドで終了する。また、ウオーターフォールの各関数の中でユーザーに何らかの問い合わせを行うには、Promptsクラスの各種メソッドを使用する必要がある。ここではtextメソッドを使用しているが、これは問い合わせに対して、ユーザーが自由形式で解答するような場合に使用する。

 この他にも、幾つかの選択肢を提示するchoiceメソッド、yes/no形式でユーザーに確認を求めるconfirmメソッドなどがPromptsクラスには用意されている。これらのメソッドを使うことで、例えばフードの注文(何を食べるか→幾つ食べるか→トッピングは何か→ポテトはいかがですか)など、流れのある会話を実現する。

 以下に例を示す。最後の「hello」→「hello, Insider.NET」という会話は「/」ルートでの会話だ(「h」と「H」の違いに注意)。

ウオーターフォールを使用した流れのある会話 ウオーターフォールを使用した流れのある会話

 beginDialogメソッドにより、新しい会話が始まると、それまでの会話(この場合は「/」ルートの会話)はサスペンドされる。endDialogメソッドで新しい会話が終了すると、以前の会話がレジュームされるようになっている。

 上の画像ではボットからの「what's your name ?」という問い合わせでどんなデータが返送されてきたかを、[JSON]ペーンに表示している。これを見ると、「/」→「/getname」という会話の遷移が「callstack」プロパティに表示されているのが分かるはずだ(なお、ユーザー名を取得した直後のあいさつが表示された時点で「/getname」ルートは終了しているため、コールスタックにはこれが表示されない)。

 本稿の最後に、ボットのもう1つの大きな特徴である「コマンド」について見てみよう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。