チェックポイント
Create a Dialogflow agent
/ 25
Create Intents
/ 25
Allow Fulfillment to Store Help Ticket Data
/ 25
Tickets are Logged in Datastore
/ 25
Dialogflow で AI チャットボットを実装する
GSP078
概要
Dialogflow は、コンピュータと人間とのインタラクション プラットフォームとして特に注目されています。自然言語処理と機械学習のあらゆるサービスが提供されるため複雑ですが、インターフェースがシンプルであるため、Assistant、Alexa、Cortana 統合アプリケーションの開発をすぐに始めることができます。
このラボでは、Google Assistant チャットボットを作成し、ヘルプデスク チケットを送信します。Google Cloud Platform のチャットボット アプリケーションの図を次に示します。
ここでは、一般的なクラウド開発プロセスの手順に沿って演習を進めます。具体的には以下のことを進めます。
-
ラボを設定して、Dialogflow と GCP 環境を操作する方法を学習する。
-
シンプルな Dialogflow アプリケーションをデプロイする。
-
GCP 内にシンプルなクラウド機能をデプロイし、Dialogflow に接続する。
-
チャットボットのテストを行う。
ラボの内容
このラボを終了すると、次のことを理解できるようになります。
-
インテント、エンティティ、コンテキストなど、Dialogflow の基本コンセプトと構成
-
チャットボットのワークフロー
-
会話の概要
前提条件
これは専門家レベルのラボです。受講する前に、少なくとも機械学習と自然言語処理の基礎を理解しておく必要があります。これらの基礎は、次の Qwiklabs で効率的に習得できます。
- Cloud Natural Language API: Qwik Start
- Google Cloud Speech API: Qwik Start
- Natural Language API によるエンティティ感情分析
- Natural Language API を使用してテキストをカテゴリに分類する
準備ができたら、下にスクロールして Dataflow を開いてください。
設定と要件
[ラボを開始] ボタンをクリックする前に
こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。
この Qwiklabs ハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
必要なもの
このラボを完了するためには、下記が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
- ラボを完了するために十分な時間
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、ラボでは使用しないでください。
注: Chrome OS デバイスを使用している場合は、シークレット ウィンドウを開いてこのラボを実行してください。
ラボを開始して Google Cloud コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。 -
必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。
-
[ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。
重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。 -
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後このタブで Cloud Console が開きます。
Dialogflow のコンセプトと構成
Dialogflow は会話構築ツールです。人間の言語をインテント(会話の意図)とアーギュメント(会話の議題)とに区別して扱うことができます。
エージェントは、NLU(自然言語理解)モジュールと呼ぶのが最も適切です。エージェントをアプリ、プロダクト、またはサービスに組み込み、人のリクエストを利用可能なデータに変換するために使用します。ユーザーからの入力データがエージェント内のいずれかのインテントと一致する場合に変換が行われます。
インテントは、あらかじめ定義済み、またはデベロッパーが定義したエージェント コンポーネントであり、ユーザーのリクエストを処理するものです。ユーザーの発話データとソフトウェアで求められるアクションのマッピングを行います。
インテント インターフェースには次のセクションがあります。
- User says
- Action
- Response
- Contexts
自然言語入力からパラメータ値を抽出するには、エンティティを使用します。ユーザーのリクエストから取得する必要のある重要なデータには、対応するエンティティを用意することになります。
特定のエージェントで使用されるエンティティは、エージェントが機能した結果として返されるパラメータ値によって異なります。言い換えれば、デベロッパーはエージェントで言及される可能性があるすべてのコンセプトに対してエンティティを作成する必要はありません。実用的なデータで必要なものに対してのみ作成するだけで済みます。
エンティティには次の 3 つのタイプがあります。
- System: Dialogflow が定義するもの
- Developer: デベロッパーが定義するもの
- User: リクエストごとに個々のユーザに対して生成するもの
3 つの異なるタイプのシステム エンティティを区別することが重要です。
- System mapping: 参照値を持つもの
- System enum: 参照値を持たないもの
- System composite: エイリアスを使用して他のエンティティを含め、オブジェクト タイプの値を返すもの
コンテキストは、ユーザーのリクエストの現在のコンテキストを表します。曖昧なフレーズや、ユーザーの設定、ユーザーの地理的なロケーション、アプリでの現在のページ、会話のトピックによって意味が異なるフレーズを区別するには、コンテキストが役立ちます。
たとえば、ユーザーが音楽を聴いていて興味を引くバンドを見つけた場合、「もっと聴きたい」と発話するかもしれません。その場合、デベロッパーがリクエストのコンテキストにバンドの名前を含めれば、エージェントがそれを他のインテントで使用できるようになります。
フルフィルメントは、一致したインテントからの情報をウェブサービスに渡し、その結果を取得できる Webhook です。
ここでは次々に新しい情報を提供していますが、心配はいりません。次のセクションで Google Assistant チャットボットの開発を始めれば、全体像が見えてくるはずです。
シンプルな Dialogflow アプリケーションをデプロイしてヘルプデスク チケットを送信
Cloud Datastoreを有効にする
Cloud Datastore は、アプリケーション向けの非常にスケーラブルな NoSQL データベースです。Cloud Datastore はシャーディングとレプリケーションを自動的に処理し、アプリケーション負荷処理を自動的にスケーリングする、可用性と耐久性の高いデータベースを提供します。
-
新しいデータベース インスタンスを作成し、Google Cloud Console の [Datastore] セクションを開きます。
-
コンソールで、[ナビゲーション メニュー] > [Datastore] に移動します。
-
画面は次のようになります。
-
[Datastore モードを選択] をクリックします。
-
ドロップダウンから [ロケーションを選択] を選択して、[nam5(United State)] を選択します
-
[データベースを作成] をクリックします。
Dialogflow エージェントを作成する
-
Console で、ナビゲーション メニュー > [API とサービス] > [ダッシュボード] に移動します。
-
[API とサービスを有効化] をクリックします。
-
Dialogflow を検索します。
-
[Dialogflow API] をクリックし、API が有効でない場合は、[有効にする] をクリックします。
-
新しいタブで Dialogflow.com にアクセスして [Sign up for free] ボタンをクリックします。[Sign in with Google] ボタンをクリックし、このラボにログインしたときの認証情報を選択して [Allow] をクリックします。
-
次にメール設定をオフにし、利用規約を確認します。[Accept] をクリックします。
-
[Create Agent] をクリックします。
-
下のスクリーンショットに表示されているとおりに、エージェント情報を追加します。
- Agent name: Helpdesk
- Default Time zone: America/Denver
- Google Project: プロジェクト ID
準備ができたら、[Create] をクリックします。
完了したタスクをテストする
[進行状況を確認] をクリックして、実行したタスクを確認します。ダイアログフローエージェントを作成ことを成功した場合に、スコアが表示します。
これで準備は完了です。
Default Welcome Intent が自動的に作成されます。それをクリックして開きます。
[Training phrases] セクションに、ユーザーが発話する可能性がある表現をいくつか追加します。「Hi」、「Hello」、「Good morning」などが一般的です。これらを追加すると、次のようなページが表示されます。
[Responses] セクションまで下にスクロールします。ここで、ユーザーに自動的にレスポンスを返す「Text response」を設定します。これで完了です。必要に応じて、「Hi! How can I help?」などを追加します。
右上にある [Save] をクリックします。
作成したものをテストしてみましょう。[Try it now] セクションの右側に「Hi」と入力して Enter キーを押します。デフォルトのレスポンスが表示されます。
さらに進めていきましょう。
インテントを作成する
左側のパネルにある [Intents] をクリックして、[Create Intent] をクリックします。
インテントの名前として「Submit Ticket」と入力します。
[Training phrases] セクションに移動し、[Add Training Phrases] をクリックします。次のものを追加します。(ここと以降のラボでは英語の用語のみを使用してください。)
- Ticket
- Submit ticket
- Problem
- Issue
- I want to submit a ticket
- I have a problem
[Responses] セクションまで下にスクロールし、[Add Response] をクリックします。次の情報を入力します。
- Sure! I can help you with that. Please provide your name for the ticket.
終了したら [Save] をクリックします。
完了したタスクをテストする
[進行状況を確認] をクリックして、実行したタスクを確認します。カスタムインテントを作成ことを成功した場合に、スコアが表示します。
左側のパネルにある [Intents] をクリックして、新しく作成した「Submit Ticket」インテントにカーソルを合わせます。[Add follow-up intent] をクリックして、[custom] を選択します。
新しい「Submit Ticket - custom」インテントをクリックします。詳細を入力し、以下のスクリーンショットのようになるようにしてください。
- Intent Name:Submit Ticket - collect name
- Training Phrases: 「I am bob」
- Training Phrases: 「My name is Lily」
- Responses: 「Thanks $person! Now describe your issue」
Training Phrasesを 追加する際に、「My name is Lily」と入力すると、person
というデフォルトのエンティティが作成されることを確認します。[Text response] セクションでは、変数を表すために person
(デフォルトで表示されない場合は、Lily と bob の場合は、手動で @sys.person
を選択してください。) の前に $
が追加されています。これにより、チャットボットがユーザー名をユーザーにエコーバックします。
終了したら [Save] をクリックします。次に、Dialogflow がどのように変数を格納し、呼び出すかを確認します。
[Try it now] に「issue」と入力して、レスポンスを確認します。
「My name is Lily」と入力して、Responsesを確認します。
Contexts (コンテキスト)で Dialogflow が自動的に「SubmitTicket-followup」のコンテキストを追加したことを確認します。
フルフィルメントにヘルプチケット データの保存を許可する
これでフルフィルメントを有効にして、ヘルプチケット情報をデータベース(この場合は Google Cloud Datastore)に送信できるようになります。リソースが利用可能になるまでに数分かかります。
左側のパネルにある [Fulfillment] をクリックし、[Inline Editor] を [Enabled] に切り替えます。
既存のコンテンツに代えて、次のコードをコピーして index.js
タブに貼り付けます。
'use strict';
const http = require('http');
// Imports the Google Cloud client library
const Datastore = require('@google-cloud/datastore');
// Your Google Cloud Platform project ID
const projectId = 'REPLACE_WITH_YOUR_PROJECT_ID';
// Instantiates a client
const datastore = Datastore({
projectId: projectId
});
// The kind for the new entity
const kind = 'ticket';
exports.dialogflowFirebaseFulfillment = (req, res) => {
console.log('Dialogflow Request body: ' + JSON.stringify(req.body));
// Get the city and date from the request
let ticketDescription = req.body.queryResult['queryText']; // incidence is a required param
//let name = req.body.result.contexts[0].parameters['person.original'];
let username = req.body.queryResult.outputContexts[1].parameters['person.original'];
let phone_number = req.body.queryResult.outputContexts[1].parameters['phone-number.original'];
console.log('description is ' +ticketDescription);
console.log('name is '+ username);
console.log('phone number is '+ phone_number);
function randomIntInc (low, high) {
return Math.floor(Math.random() * (high - low + 1) + low);
}
let ticketnum = randomIntInc(11111,99999);
// The Cloud Datastore key for the new entity
const taskKey = datastore.key(kind);
// Prepares the new entity
const task = {
key: taskKey,
data: {
description: ticketDescription,
username: username,
phoneNumber: phone_number,
ticketNumber: ticketnum
}
};
console.log("incidence is " , task);
// Saves the entity
datastore.save(task)
.then(() => {
console.log(`Saved ${task.key}: ${task.data.description}`);
res.setHeader('Content-Type', 'application/json');
//Response to send to Dialogflow
res.send(JSON.stringify({ 'fulfillmentText': "I have successfully logged your ticket, the ticket number is " + ticketnum + ". Someone from the helpdesk will reach out to you within 24 hours."}));
//res.send(JSON.stringify({ 'fulfillmentText': "I have successfully logged your ticket, the ticket number is " + ticketnum + ". Someone from the helpdesk will reach out to you within 24 hours.", 'fulfillmentMessages': "I have successfully logged your ticket, the ticket number is " + ticketnum + ". Someone from the helpdesk will reach out to you within 24 hours."}));
})
.catch((err) => {
console.error('ERROR:', err);
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify({ 'speech': "Error occurred while saving, try again later", 'displayText': "Error occurred while saving, try again later" }));
});
};
次に index.js
ファイルを編集します。
- 6 行目で、
REPLACE_WITH_YOUR_PROJECT_ID
を実際の GCP プロジェクト ID(一重引用符)に置き換えます。プロジェクト ID は、ラボ開始時の認証情報とともに Qwiklabs ページに表示されています。
次のような結果が表示されます(ただし、プロジェクト名は置き換えられます)。
次に [package.json] タブをクリックし、この依存関係を追加します。
"@google-cloud/datastore": "^1.1.0"
依存関係リストの前のアイテムの後に必ずコンマを追加してください。
次のような結果が表示されます。
[Deploy] ボタンをクリックします。デプロイが正常に完了したというメッセージが表示されるまで待ちます(少し時間がかかります)。
完了したタスクをテストする
[進行状況を確認] をクリックして、実行したタスクを確認します。フルフィルメントにヘルプチケットデータを蓄えることを成功した場合に、スコアが表示します。
次に左側のパネルにある [Intents] に戻ります。[Submit Ticket] の横にある下向き矢印をクリックして、そのフォローアップ インテントを表示します。
Submit Ticket - collect name にカーソルを合わせ、[Add follow up intents] をクリックしてから [custom] を選択します。
新しく作成したインテント Submit Ticket - collect name - custom の順にクリックし、開いて編集します。
インテントの名前として Submit Ticket - collect description と入力します。
次に示すようなユーザー表現を [Training phrases] に入力します。トレーニング フレーズ:
- Everything is hosed
- My laptop won't start
- Nothing works
- My phone screen is broken
次のスクリーンショットを参考にしてください。
画面の一番下までスクロールして、[Fulfillment] 矢印をクリックしてセクションを切り替えます。[Enable webhook call for this intent] をクリックします。
終わったら [Save] をクリックします。
この時点で、Dialogflow が設定されています。次の会話を入力して、[Try it now] パネルでテストします。
- 「Hi」
- 「I would like to submit a ticket」
- 「My name is John」
- 「My phone screen is broken」
次のようなResponsesがデフォルトで表示されます。
チケットで Datastore にログインしていることを検証する
サポート チケットで Datastore にログインしていることを確認します。
GCP Console のナビゲーション メニューから Datastore にアクセスします。
次のようなエントリが表示されます。
これにより、チャットボットが機能していて、チケットをロギングしていることが確認されます。
完了したタスクをテストする
[進行状況を確認] をクリックして、実行したタスクを確認します。チケットがデータストアに正常に記録されると、評価スコアが表示されます。
チャットボットをテストする
Dialogflow によって、チャットボットでさまざまな統合が可能になります。チャットボットのサンプルウェブ ユーザー インターフェースを見てみましょう。
Dialogflow の左側のパネルにある [Integrations] をクリックします。
スイッチを切り替えて Web Demo 統合を有効にします。
URL リンクをクリックしてウェブデモを開始します。
[Ask something] セクションに入力して、チャット インターフェースの使用を開始します。Chrome ブラウザを使用している場合は、マイクのアイコンをクリックし、チャットボット対して質問することができます。次のようにチャットボットとチャットしてみましょう。
- 「Hi」と入力して Enter キーを押します。チャットボットは以前のように Responses を 返します。
- 次に「Submit ticket」と入力します。
- 「My name is Lily」という名前を入力します。
- 「My phone screen is broken」のチケット詳細を入力します。
チケットが送信されたことを示すダイアログ出力が表示されます。データストアを確認して、チケットがロギングされたかどうかを確認することもできます。ウェブデモは初期段階にあるため、予想どおりに機能しない場合は、コマンドを再実行するかページを更新してみてください。
理解度チェック
今回のラボで学習した内容の理解を深めるため、以下の選択問題を用意しました。正解を目指して頑張ってください。
お疲れさまでした
これでチャットボットの開発が可能になりました。
クエスト終了
このセルフペース ラボは、Qwiklabs のクエストである機械学習 API の一部です。クエストとは、学習パスを構成する一連のラボです。このクエストを完了すると、成果が認められて上のバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクすることができます。このラボを終えてこちらのクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能なその他の Qwiklabs のクエストもご覧ください。
次のラボの受講
Cloud ML Engine: Qwik Start や Natural Language API によるエンティティ感情分析など、他の機械学習 API のラボをお試しください。
次のステップ
Google Cloud Training & Certification
Google Cloud 技術を最大限に活用できるようになります。このクラスでは、必要な技術力とベスト プラクティスを習得し、継続的に学習することができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、仮想環境など、多忙なスケジュールに対応できるオプションが用意されています。認定資格を取得することで、Google Cloud の技術のスキルと知識を証明できます。
マニュアルの最終更新日: 2020 年 4 月 21 日
ラボの最終テスト日: 2020 年 4 月 21 日
Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。