Cloud Machine Learning API を使った会話アプリの作成 - Part 1
Google Cloud Japan Team
消費者にとってチャットボットのような会話アプリは、機械学習の最もわかりやすい活用例の 1 つです。開発者にとっても会話アプリの作成は、ユーザー エクスペリエンスの創造プロセスに機械学習 API がもたらす価値を理解するうえで有益です。
今回と次回の 2 回シリーズでは、「見る」「聞く」「話す」「翻訳する」ことができる Apple iOS 対応の “ツアー ガイド” サンプル アプリの作成方法を紹介します。このアプリの作成には API.AI(会話エクスペリエンスを実現する開発プラットフォーム)と Google Cloud Machine Learning API(Speech、Vision、Translation の各 API)を使います。これらのプラットフォームで複数の言語をサポートするのが簡単なことも、おわかりいただけるでしょう。
今回の Part 1 と次回の Part 2 では次のトピックを取り上げます。
Part 1
- 概要
- アーキテクチャ
- API.AI のインテント
- API.AI のコンテキスト
Part 2
- Cloud Functions による API.AI のウェブフック
- Cloud Vision API
- Cloud Speech API
- Cloud Translation API
- 複数言語のサポート
Part 2 は数週間後に公開します。
アーキテクチャ
API.AI の使用
API.AI は、自然で豊かな会話エクスペリエンスを実現するプラットフォームです。今回紹介するツアー ガイド アプリでは、すべての主要な会話の流れを処理します(API.AI は iOS SDK を通じて優れたドキュメントとサンプル アプリを提供しています。他のプラットフォーム用の SDK も提供されており、このツアー ガイド アプリを拡張すれば Android に対応させることも容易です)。
エージェントの作成
最初のステップは “ツアー ガイド エージェント” の作成です。
インテントの作成
ユーザーと会話を交わすには、ユーザーがエージェントに何を話しているのかをまず理解する必要があります。それを API.AI ではインテントとエンティティを使って理解します。インテントは、ユーザーが話す内容と、提供されるべき会話エクスペリエンスの内容(行われるべき応答)をマッピングします。エンティティは、ユーザーの質問からパラメータ値を抽出するのに使われます。
各インテントは、ユーザー入力と望ましい自動応答の一連の例を含みます。会話を開始するためのインテントにこれらの例を含めるには、ユーザーがどのように会話を切り出すかを予想し、予想したフレーズを “Add user expression” ボックスに入力していきます。
このリストは網羅的である必要はありません。API.AI は機械学習を利用してエージェントを訓練し、それらの例のバリエーションを理解します。皆さんも、より多くのバリエーションを理解させるように API.AI エージェントを後で訓練できます。
たとえば、Default Welcome Intent にアクセスし、ユーザーが会話を始めるときの「how are you(どうしてる?)」「hello(こんにちは)」「hi(やあ)」といった表現を追加します。
次のステップは、応答文を追加することです。
次はコンテキストについての作業です。
コンテキスト
コンテキストは、ユーザーのリクエストの現在の文脈を表します。あいまいなフレーズの区別に加え、ユーザーの好みや現在位置、アプリ内の現在のページ、会話のトピックに応じて異なる意味を持つフレーズの区別に役立ちます。例を見てみましょう。
ユーザー : ここはどこ?
ボット : 近くのものを写真に撮ってアップロードしてください。調べるお手伝いをします。
[ ユーザーがゴールデン ゲート ブリッジの写真をアップロードする ]
ボット : ゴールデン ゲート ブリッジの近くです。
ユーザー : チケットはいくら?
ボット : ゴールデン ゲート ブリッジは無料で訪れることができます。
ユーザー : 今日は何時に閉まる?
ボット : ゴールデン ゲート ブリッジは週 7 日、24 時間開いています。
ユーザー : どうやって行けばいい?
[ ボットがゴールデン ゲート ブリッジまでの地図を表示する ]
上の会話でユーザーが「チケットはいくら?」「今日は何時に閉まる?」「どうやって行けばいい?」と尋ねたとき、ボットはコンテキストがゴールデン ゲート ブリッジに関するものであることを理解しています。
次にすることは、インテントとコンテキストを関連づけてまとめることです。下図の各ボックスはインテントとコンテキストです。矢印はボックス間の関係を示しています。
出力コンテキスト
コンテキストはユーザー セッション(API 呼び出しで渡すセッション ID)と結びついています。ユーザーの表現があるインテントにマッチすると、そのインテントは出力コンテキストを、この表現によって将来共有されるように設定します。ユーザー リクエストを API.AI エージェントに送るときに、コンテキストを追加することもできます。このサンプル アプリでは、where(どこ)のインテントは、location(場所)のインテントが将来マッチされるように where の出力コンテキストを設定します。
入力コンテキスト
入力コンテキストは、特定のコンテキストが設定されている場合にのみインテントがマッチされるように制限します。私たちのサンプルでは、location の入力コンテキストは where に設定されています。location のインテントは、where のコンテキストの下でのみマッチされます。
こうしたインテントとコンテキストを生成する手順を以下に示します。
まず、where
のインテントを作成し、where
の出力コンテキストを追加します。これはコンテキスト ツリーのルートであり、入力コンテキストはありません。
続いて location
のインテントを作成し、where
の入力コンテキストを追加します。また、where
の出力コンテキストをリセットし、location
の出力コンテキストを追加します。私たちのツアー ガイド アプリでは、location
の入力コンテキストは where
です。location
インテントが検出されたら、以降の会話が where
コンテキストを再びトリガーしないように、このコンテキストをリセットする必要があります。これは、where
出力コンテキストのライフスパンを 0 に設定することで行われます。デフォルトでは、コンテキストは 5 リクエストまたは 10 分間のライフスパンを持ちます。
次に、ticket
のインテントを作成し、location
の入力コンテキストを追加します。そして location
の出力コンテキストを追加し、hours
と map
のインテントが location
コンテキストを入力コンテキストとして継続的に使えるようにします。
なお、#context.parameter
というフォーマットで入力コンテキストからパラメータを渡すことができます。たとえば、インテント inquiry-where-location から inquiry.where.location.ticket
に、#inquiry-where-location.location
というフォーマットで location の文字列を渡せます。
最後に、ticket
のインテントと同様に、hours
と map
のインテントを作成します。
次回の予定
Part 2 では、API.AI でウェブフックの統合を利用して、マッチされたインテントから Cloud Functions ウェブ サービスに情報を渡し、結果を取得する方法を紹介します。さらに、中国語のサポートを含めて、Cloud Vision / Speech / Translation API を統合する方法も説明します。
ソース コードは GitHub からダウンロードできます。
* この投稿は米国時間 7 月 27 日、Software Engineer である Chang Luo と Bob Liu によって投稿されたもの(投稿はこちら)の抄訳です。
- By Chang Luo and Bob Liu, Software Engineers