Dialogflow
Dialogflowとは
自然言語理解プラットフォーム
音声やテキストを認識して固有の処理を走らせたりできる
APIは提供されてるから、好きにしたかったら好きにできる
1エージェント、1GCPプロジェクトなので、その辺は要考慮。
構成要素
エージェント
GCPプロジェクト1つにつき1つ作成可能
複数エージェントが必要な場合は、複数のGCPプロジェクトを作る必要がある
最初に処理を受け付けるところ
こいつが後述のインテントのマッチングをおこなう模様
エージェントはトレーニングする必要があるらしい(どうやって?
インテント作成時にトレーニングフレーズというのを登録する
少なくとも10~20個のトレーニングフレーズを入れろとガイドには書いてある(マジか)
メガエージェント(2020/07/01時点でβ版)を使って、複数のエージェントをまとめることが可能
あまりに大きいエージェントになると、インテントの定義数が制限に近づくことがあり、この機能を使ってエージェントをばらしてしまうことで、1エージェントごとのインテント定義数を減らせる
1まとまりのシナリオごとにエージェント作って、メガエージェントで統合すると良さそう
最大10個のエージェントを設定可
メガエージェントを使おうがエージェントは1個まで。メガエージェントとサブエージェントをそれぞれのGCPプロジェクトい関連付けする
ロールの設定が必要なので、使いたくなったらメガエージェントのロール設定のところ見ながらやる
どんな感じかとりあえず見たい場合は、Prebuildから好きなの指定して入れるといいかも(レスポンス定義はないので、何か返したい場合は自分で設定が必要)
環境ごとにバージョン付けてpublish可能
戻すのはDialogflow Consoleから選ぶだけ
多言語化はルート言語(標準語的なの)とロケール固有の言語(方言)に分かれる
基本はルート言語向けにエージェントを設計して、必要な場合だけロケール固有の言語向けにカスタマイズしろとのこと
Small Talkを有効にするとエージェントの範囲外な質問に対応可能らしい
組み込みSmall Talk:インテントを追加することなく、カジュアルな会話が自動的に処理される
日本語には対応してないっぽくて、左のメニューには出てこない
ビルド済Small Talk:インポートするとカジュアルな会話を処理するインテントが提供される
Prebuild Agentsなので、レスポンスは自分で定義する必要がある
ML Settingsは有効にすると、設定の手間が増える(ちゃんとやれば当然品質が上がるけど)
使えない、使ってはいけない場合もあるので、エージェントの設定のML周りを読んで決める
音声出力とかしたい場合は、設定すれば可能
インテント
1回の会話での意図を分類する
処理ごとのチャネルというイメージが合う
インテントは大シナリオ数分登録することになると思われる
大シナリオにぶら下げるインテントはコンテキスト付きのインテントで登録すると幸せになれる模様
なので、インテントの識別子は具象名を付けると多分幸せになれる
コンテキスト自体はコンテキストスイッチをONにする仕組みがある模様
インテントから紐づけといたアクションを実行する
インテントは別エージェントにコピー/移動できる模様(エンティティとかもまとめてできる、が、使う場面があるのかわからない、ちなみにCopy related entitiesは複合エンティティのこと)
デフォルトインテントとして、一般的な挨拶のインテントと、何にもマッチしなかった場合のフォールバックをデフォルトで設定できる
ネガティブサンプル
似たような表現だけどインテントマッチングさせたくないフレーズをフォールバックインテントに追加できる
インテントの検出は、検出信頼度でポイント化される(Elasticsearchとかにもあるアレ)
インテントは複数一致・同一信頼度で検出される可能性があり、この場合はインテントの優先度を設定しとくと、優先度順にマッチする
優先順位はインテントを設定するところのインテント名の左にある色ついた〇を押すと設定できる
Normalが最適らしい
ignoreにすると無視されるようになるってよ(無効化)
APIで指定して登録する場合は、-1(ignore)~500000まで指定可能なので超絶細かく設定できまーす
ナレッジコネクタはよくわからんけどベータ版なのでスルー
トレーニングフレーズ
エンドユーザー表現に含まれる可能性のあるフレーズのサンプルで、実際のエンドユーザー表現がこのフレーズのいずれかと似ている場合にDialogflowでインテントマッチングされる
組み込み機械学習を使ってる場合、他の類似フレーズと一緒に展開されるから、すべての例を定義する必要はない
アクション
各インテントに対して実行するアクション定義
パラメータ
インテントが一致すると、Dialogflowがエンドユーザー表現から抽出した値をパラメータで提供する(時刻とか国とかのシステムエンティティ、それ以外のカスタムエンティティ)
上述のとおり、パラメータはエンティティタイプを紐づけておく。こうすることでデータの抽出方法が指定され、ロジックの実行とかレスポンスの生成時に使用できる構造化データとなる
インテントを完成させるためのパラメータに必須を付与可能
必須なパラメータがエンドユーザー表現で指定されなかった場合、エージェントからエンドユーザーに尋ねる質問を設定できる
複数の必須パラメータがある場合、エンドユーザー表現に応じてDialogflow側で足らないパラメータを1個ずつ聞いてくれる
追加で質問する順番はパラメータに設定した順序で決まる
キャンセルとか終了フレーズを言うと破棄される
デフォルト値の付与も可能
パラメータ参照するための変数を設定可能
パラメータの値をリストとして取得することも可能
レスポンス
テキスト、音声、視覚的なレスポンスを定義してエンドユーザーに返す
フルフィルメント(Webhookなどで行う自前の処理)を使うと動的レスポンスを作成できる
APIを使ってもレスポンスを返せるので、フロントが自前のやつも可
特殊文字($と#)は${100}とか#{hoge}とかやると、$100、#hogeって返せる
中括弧{}の場合は、{{hoge}}ってやると{hoge}って返せる
空のパラメータがある場合は、そのパターン数分のレスポンスを指定しないといけない
リッチレスポンスメッセージ
テキスト以外のレスポンスを指す
Google AsistantとかFacebookなど向けに作れる(提供されてる)
デフォルトのテキストレスポンスでもテキスト読み上げを有効にしとくと、音声合成したテキストを返せる。
SSMLも使える
テキストレスポンスあたり、テキストエントリは300件まで
画像レスポンス(Google HOMEみたいに画面がないやつだとどーなんだ?)
カード形式のレスポンス(カードのスタイルは対象プラットフォームによって異なる)
クイック返信レスポンスとしてエンドユーザーにテキスト付ボタンを送信可能
アンケートとか、もろもろメニューなどで誘導したい場合に使える
数の制限がプラットフォームとか言語ごとにあるから、使う場合は要検証
音声合成レスポンス
テキストレスポンスから音声号して音声再生させる
Dialogflow Phone Gateway統合でだけ使える
インテントごとに最大20件の音声合成レスポンスを定義可能
音声再生レスポンス
音声ファイルを再生可能
Cloud Storageを使わないといけない
Dialogflow Phone Gateway統合でだけ使える
インテントごとに最大20件の音声合成レスポンスを定義可能
通話転送レスポンス
テレフォニー統合、発信者を転送するために使用できる
Dialogflow Phone Gateway統合でだけ使える
カスタムペイロードレスポンス
プラットフォームのドキュメントに定義された形でなら返せる
好きなようにできるものではない
Googleアシスタントレスポンスタイプ
Googleアシスタントと統合可
その他のレスポンスタイプ
コンテキスト
エンドユーザー表現からコンテキスト(契約とか請求とか学校などの日本語だと省略しがちな主語って言うとわかりやすい?)を抜き出して、コンテキストにマッチしたインテントを探すための機能
インテントのadd output contextを設定すると、そのコンテキストのスイッチがオンになって、以降使われる
上記コンテキストを繋いでいく場合は、インテントのadd input contextに設定すればOK
有効期間は会話5ターン、フォローアップインテント(はい、とかやるやつ)は2ターン、放置は20分
有効期間はコンテキストごとに任意の設定をオーバーライド可能(要るかは不明)
コンテキストのスイッチがONになっていても、コンテキストを持ったインテントにマッチしなかった場合、コンテキストなしのインテントにマッチングされる可能性がある(コンテキストに乗らせ続けるように意図的に軌道修正させるようなことはできない)
コンテキストはインテントの設定時に設定を行えるが、実行時に設定することもできる(フルフィルメントとかWebhook使ってる場合)
イベント
エンドユーザーの発言ではなくて、発生したイベントに基づいてインテントを呼び出すことも可能
タイマーとかスケジューラとかそういうのを連想したけど、今時点(2020/07/01)で違う
Dialogflow Messangerの統合使うと起動されるけど、Web DEMOだと起動されない気がしてる
API叩いて起動させる必要性
エンティティ
会話などの表現データをエンティティタイプで指定して抽出可能
一般的なモノは揃っている模様(日付、時刻、色、メールアドレスとか)
特定業務に特化しているものはカスタムエンティティとして定義する模様
指定方法自体はトレーニングフレーズを自動認識するっぽい
されない場合はトレーニングフレーズの単語を選択すると手動で指定してできる
エンティティは以下の具体的な用語を理解しとく
エンティティタイプ
抽象的なグループのまとまり(天気とか国とかそういうの)
エンティティエントリ
エンティティに対して同等とみなす単語・区のセット(天気エンティティなら、晴・雨・曇/曇り・雪とかそんなん)
システムエンティティで主要なモノは大体揃ってる(日付とかそういうの)
使ってるシステムエンティティはEntityから拡張可能だって
業界独自のものについては、カスタムエンティティを自分で定義する
カスタムエンティティのオプションは以下がある
オプションなし
リストエンティティ
類似語の定義
マップ エンティティ
正規表現エンティティ
IDとかフォーマットが決まってる何か(国番号とか)で使うと良い
複合正規表現(最大長1024文字)は最初に一致したものが対象になるので、定義順序が重要
50個/エージェント
音声認識(文字起こし)の処理に入れるとスペースが入ったり、数字が全角になったり色々あるらしいから、そのパターン数分作っておかないといけないらしいhttps://gyazo.com/91171747236db5d30b0d8f6be0a052e0
自動拡張を許可する
明示的に提供していない値を認識できるようになる
トレーニングフレーズは多く提供しないといけない
エンティティの抽出は保証されない
複数のエンティティで自動拡張を有効にすると、競合したり予期しない分類結果が出る可能性がある
ファジー一致
類義語・単語の順序が関係なくなる模様
厳密な値には使ってはいけない
正規表現エンティティではファジー一致は有効にできない(それはそう)
複合エンティティ
あるエンティティタイプが他のエンティティで参照されているもの
@entity-name:property-name で表わせる
システムエンティティは大概これでできてる
カスタムエンティティでやる場合は、割と難しい気がする
セッションエンティティ
会話中で有効なセッション用のエンティティを作成可能
カスタムエンティティタイプを拡張または置換できる
20分間だけ保存される
エンドユーザー表現から何れかかんれか解析してエンティティのトレーニングフレーズ的なものに追加したりできるぞ、ということらしい(使いどころが難しそう)
フルフィルメントで作れるから、DBから何かするとかかなー
フォローアップインテント
インテントを深堀(つまりコンテキストインテント)したり、破棄したりするための仕組み
はい -> 更に掘る、いいえ -> 1つ前に戻したり、破棄したり
フルフィルメント
インラインエディタはCloud Functionsにデプロイされる
Webhookを使って好きな場所で好きな処理はやれる
Webhookのレスポンスにエンドユーザーに返すメッセージを含む
インテントに必須なパラメータがすべて揃ったら(スロット充填済)、Webhookのリクエストが行われる
スロット充填要のWebhookを設定すると、パラメータを聞き出すための会話ターンごとにWebhook呼び出し可能
相互TLS認証(オプション)
統合
GoogleアシスタントとかSlackなんかと統合できる
3rd partyの統合をした場合は、Googleとその統合先の両方にリクエストとエンドユーザーデータが送信される
テレフォニー統合とIVR統合
Dialogflow組み込み統合
Google提供のオープンソース統合
独立した統合
見た目は自由 + Dialogflowとやり取りするサーバを用意して、APIで連携させる
エージェントの品質とモニタリング
作るときに見る必要性
ベストプラクティスも上記URLにある
AGENT VALIDATIONを有効にして自動検証するようにしておくと、Validationのページで検証結果を表示できる
結果1つ1つから該当のインテントに飛べるようになってるから、潰していく
APIからも検証結果は取得可能
データのロギング
有料エディションだと使える
こういうことにはなってる
https://gyazo.com/775994555c2172f6f058d77ba116cb4a
アナリティクス
エージェントがどの程度うまく機能しているか確認可、以下のデータが提供される
使用状況データ:セッション数とセッションあたりのクエリ数
NLUデータ:最も頻繁に使用されたインテントと終了率
説明は今のところLegacy UIだけ(2020/07/09)
履歴
おおまかな会話の流れを時系列で確認できる機能
GCP上のすべてのログは統合可能
ナレッジコネクタ
β版で英語だけ(2020/07/09)
ナレッジドキュメント(FAQとか)を解析して、自動化レスポンスを見つける機能
実際のFAQじゃなくて、ナレッジドキュメントとして定義されているものだけが対象
トレーニング
実際の会話をインポートしてエージェントのトレーニングが可能
通常はDialogflow Consoleで何か操作して保存したときに自動で走る(自動トレーニングの解除は可能)
ログを記録していると、会話の一覧が出てきて、そこからインテントのトレーニングフレーズに追加したりできる
アクセス制御
Dialogflow コンソールでは、エージェントを作成したユーザーにオーナー / 管理者のロールが提供されます。オーナー / 管理者の変更、1 つのエージェントへの複数のオーナー / 管理者の追加、1 つのエージェントからのオーナー / 管理者の削除を行う場合は、GCP Console を使用する必要があります。
他の GCP リソース(Cloud Functions など)が統合されているときに、プロジェクトに対する完全なアクセス権を特定のアプリケーションに付与しないようにするには、GCP IAM コンソールで Dialogflow API の役割(管理者、クライアント、読み取り)を割り当てる必要があります。
GCP IAM 役割のサブセットには、対応する Dialogflow コンソールの役割があります。Dialogflow コンソールに存在しないロールを付与するには、GCP Console を使用する必要があります。
だそうです
APIベースでの操作
統合オプションを使った方が楽だが、APIベースで直接コードを記述することも可能
例えばTwilio -> 自アプリ -> Dialogflowみたいな感じで使えたりする
文字ベースだと大変ではない(受け取った文字を受け流すだけ)
Dialogflowの見た目が気に入らない場合に使う感じかなー
好きなUI -> Lambda + DynamoDB(会話Sessionの保持で必要そう) -> Dialogflowとか
ベストプラクティス
プラン
Standard Edition
無料
各種制限付き
中小企業規模での会話型インタフェースの構築向きらしい
だが、SLA定義なし
よっぽどないと思うけど、止まり続けていても文句は言えない
サポートはメールとコミュニティサポートが受けれる(無料なので)
Enterprise Edition Essentials
一部制限付き
SLA 99.9%
応答時間が保証されているサポートが受けれる
Enterprise Edition Plus
SLA 99.9%
応答時間が保証されているサポートが受けれる
所感
設定自体は誰でもできる
コードが必要になったら誰でもよくない
トレーニングフレーズは語彙力・語彙数が求められる
会話が意図通りに展開されていくかひたすらやるしかない
色んな人に試してもらうと良い
ログは有効にして上手くいっていない会話のエンドユーザー表現を直接特定のインテントのトレーニングフレーズにぶち込むのが手っ取り早そう
同様にFallbackに放り込むこともできる
システムへの組み込みはタグ埋め込むだけだから手軽
Dialogflow Messangerはなんかcqrsエラーが出たから、何か別途必要っぽい(今のところは使うならサポート使うとかだと思う)
CSPの設定で解決
script-src-elem 'self' www.gstatic.com static.dialogflow.com 'unsafe-inline' ;
Google Asistantは統合すると勝手に喋るところまでやる
API使えば自前のUIとの統合は難しくなさそうだと感じた
チャットのUIはアニメーション込みでデザイン的な人に頑張ってもらう必要があるけど