Dialogflow(api.ai)とCloud Functionsを使ってチャットボットを作ってみた

  • このエントリーをはてなブックマークに追加

最近チャットボットの話題をよく聞きます。本記事では、DialogflowとCloud Functionsを組み合わせる事で簡単にチャットボットを作成する事が出来るので紹介していきたいと思います。

Dialogflowとは?

機械学習をし、人間が何を言おうとしているのかという言葉を解析するプラットフォームです。

例えば、「お腹すいた」という言葉は様々な伝え方があると思います。それは「おなかすいた」、「腹減った」や、「何か食べたい」だったりします。

人間ならばこれらの言葉の意味を理解して「ああ、この人はお腹がすいているんだ」と理解することが出来ますが、機械ではそう簡単にはいきません。

機械学習を利用して、サンプルデータからパターンを見つけ出し、そのパターンから予測する事で、質問の意図を正確にシステムへ伝えられるようにし、質問の意図に合致した回答を導き出すことが必要になります。

今回は、Dialogflowを活用して少しマイナーなカタンやアグリコラといったボードゲームの質問に答えてくれるチャットボットを作ってみたいと思います。趣味全開ですいません。

基本的な概要としては以下の図の様になります。

では早速作っていきましょう

エージェントの作成

まず以下URLからDialogFlowにログインします。

https://console.dialogflow.com/api-client/#/login

「Sign in」ボタンを押下しましたら以下画面に移るので、「Create Agent」を押下

エージェント作成画面に移るので

以下を設定してください。

  • AgentName:エージェント名
  • DESCRIPTION:このエージェントの説明
  • DEFAULT LANGUAGE :使用言語

設定しましたら、右上の「SAVE」を押下でエージェントが作成されます。

Entitiesの登録

Entitiesとは会話の要素です、例えばご飯という要素ならば白米、焼き魚、野菜などがご飯に当たります。その要素をDialogflowに認識させるための作業です。

まず、左側のリストから「Entities」を押下し、表示された画面から右上の「CREATE ENTITY」を押下する事でEntitiesを作成する事が出来ます。

今回はEntityNameにboardgameを指定しました。

boardgameを構成する物にはパンデミックやアグリコラというboardgameの名前を指定します。

作成したら右上の「SAVE」を押下しましょう。

Intentsの登録

Intentsとは会話の流れです。「おはよう」とか「こんにちは」なら挨拶という会話の流れになります。今回は、ボードゲームの質問に答えてくれるチャットボットですので、boardgame_questionというIntentsを作成します。

まず左側のリストから「Intents」を押下し、その後に「CREATE INTENT」を押下します。

Intent nameはボードゲームに対する質問なのでboardgame_question。

User saysはこの会話を始める時に使われそうな質問の一覧です、このリストの数が多ければ多いほどDialogflowは学習して行きます。User saysを登録した時に対応するEntityがあれば、黄色で囲われ、Actionの場所に自動的に登録されます。

Text responseはこの会話の回答です、複数登録するとランダムで回答が変化します。

作成したら右上の「SAVE」を押下しましょう。

これだけでもチャットボットとしては機能します、試してみましょう。

右側にあるTry it nowに質問を投げかければ、もしIntentsに対応する質問であれば、Dialogflowが判断して回答をしてくれます。

成功です。

先ほどのUser saysに登録していなかった質問にも答える事ができました。

WebHookの作成

これでは登録した回答しか答える事は出来ません。

そこで、WebHookを使ってもっと細かく回答出来るようにしましょう。

まずCloud functionsを作成します。

GoogleCloudConsoleからCloud functionsを選択し、関数を作成を押下します。

名前:chatbot-test

トリガー:HTTPトリガー

URL:後で必要になるのでメモしておきましょう

ソースコード:インラインエディタ

index.js

exports.chatbottest = function chatbottest(req, res) {

 let mes;
 if(!req.body.result.parameters.boardgame){
  mes = "パンデミック、アグリコラ、カタンについてお答えできます。";
 }

 else if(req.body.result.parameters.boardgame == "パンデミック"){
  mes = "病原体から世界を救うボードゲームです";
 }

 else if(req.body.result.parameters.boardgame == "アグリコラ"){
  mes = "荒れ果てた土地で豊かな農場を作るゲームです";
 }

 else if(req.body.result.parameters.boardgame == "カタン"){
  mes = "未開拓のカタン島で部族を栄えさせるゲームです";
 }

 else{
  mes = "すいません、知らないボードゲームです";
 }

 res.setHeader('Content-Type', 'application/json');
 res.send(JSON.stringify({"speech": mes, "displayText": mes}));
};

package.json

{
 "name": "sample-http",
 "version": "0.0.1"
}

ステージバケット:dialogflow-test
実行する関数:chatbottest

ソースの内容ですが、Dialogflowから渡されたparametersにboardgameが入力されていたら各ボードゲームの説明をmesに入れてDialogflowに返す、無かったらparametersの入力を促す質問を返すというだけの単純な物です。

ステージバケットが存在しなければ「参照」ボタン押下からバケットの作成が可能です。

以上でCloud Functionsの作成は終了です。

一番下の「作成」を押下してFunctionを作成しましょう。

名前の横に緑色のチェックが付いていればOKです。

Webhookの設定

左側のリストから「Fulfillment」を押下してWebhookをENABLEDにします

URLの欄に先ほどメモしたURLを張り付けて

画面下部にある「SAVE」を押下します。

次にIntentsのWebhook設定です

先ほど設定したboardgame_questionの下部のText responseをすべて削除しましょう。

そしてUse webhookにチェックを付けます。

これで完成です!

ではDialogflowにボードゲームの事を聞いてみましょう

ボードゲーム個別の質問に答える事に成功しました!

PARAMETERのVALUEが変われば回答も対応した回答に変わります。

Cloud Functionsに渡した時点でプログラム側で色々といじれる様になるのでDBと接続して回答をストックするとか、他のAPIと連携してもっと面白い物が作れると思います。

最後に

DialogflowとCloud Functionsを使って簡単にチャットボットを作成する事が出来ました。

もっと詳しく知りたいという方は下記参考リンクをご参照ください。

参考リンク

Dialogflow
https://dialogflow.com/docs/getting-started/basics

Cloud Functions
https://cloud.google.com/functions/docs/

弊社クラウドエースでは、GCP料金を円請求書払いにできる支払い代行サービスや、GCPの技術サポートサービス、開発サービスなどを提供しております。

GCPに関する相談から、こんなチャットボットを作ってみたいという要望まで、クラウドエースに全ておまかせください!!

  • このエントリーをはてなブックマークに追加

Google のクラウドサービスについてもっと詳しく知りたい、直接話が聞いてみたいという方のために、クラウドエースでは無料相談会を実施しております。お申し込みは下記ボタンより承っておりますので、この機会にぜひ弊社をご利用いただければと思います。

無料相談会のお申込みはこちら