Google Cloud Platform

Cloud Machine Learning API を使った会話アプリの作成 - Part 1

消費者にとってチャットボットのような会話アプリは、機械学習の最もわかりやすい活用例の 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

Part 2 は数週間後に公開します。

アーキテクチャ

BZjIQ5KHla2JWeFIyjeCnT3VUoGTBgyx2HNEoF85YSS29BXaV2vE4JXLbSZF-UEz0mywAD_kIrFIHBjR-GcpJfA2eD12Awt1MGbgjtWd2_kO-KfqMVJ3-kmPW3ebvz7j6uYqKiT2hpe9.PNG

API.AI の使用

API.AI は、自然で豊かな会話エクスペリエンスを実現するプラットフォームです。今回紹介するツアー ガイド アプリでは、すべての主要な会話の流れを処理します(API.AI は iOS SDK を通じて優れたドキュメントとサンプル アプリを提供しています。他のプラットフォーム用の SDK も提供されており、このツアー ガイド アプリを拡張すれば Android に対応させることも容易です)。

エージェントの作成
最初のステップは “ツアー ガイド エージェント” の作成です。

インテントの作成

y4Y24znOCapWiju2mg0MUXUbg4fIpC29xbnPTZIoWbTPhWuchJAS0ZyZFLO9MPNA_Z_yNg_UcDAD3-G_8m0uOK6oUhpQji8ATjX5B2CIIGUx6t4tl1Fa9hfUv-i3fZFhFeO8BKsd4fuw.PNG

ユーザーと会話を交わすには、ユーザーがエージェントに何を話しているのかをまず理解する必要があります。それを API.AI ではインテントとエンティティを使って理解します。インテントは、ユーザーが話す内容と、提供されるべき会話エクスペリエンスの内容(行われるべき応答)をマッピングします。エンティティは、ユーザーの質問からパラメータ値を抽出するのに使われます。

各インテントは、ユーザー入力と望ましい自動応答の一連の例を含みます。会話を開始するためのインテントにこれらの例を含めるには、ユーザーがどのように会話を切り出すかを予想し、予想したフレーズを “Add user expression” ボックスに入力していきます。

このリストは網羅的である必要はありません。API.AI は機械学習を利用してエージェントを訓練し、それらの例のバリエーションを理解します。皆さんも、より多くのバリエーションを理解させるように API.AI エージェントを後で訓練できます。

たとえば、Default Welcome Intent にアクセスし、ユーザーが会話を始めるときの「how are you(どうしてる?)」「hello(こんにちは)」「hi(やあ)」といった表現を追加します。

次のステップは、応答文を追加することです。

c0PwOrQkWN8_BSYhyuR1K2HbTBqn7STWMZiw9WmEwsUYQtqARuwUNmZnddg0lGiD-NDJ_MioRNYbyp2--QYFwhCDxem0K883mqqwDGYAy2WTVczDdv1LD9S9LBm3d86to2_loXeMkfcq.PNG

次はコンテキストについての作業です。

コンテキスト
コンテキストは、ユーザーのリクエストの現在の文脈を表します。あいまいなフレーズの区別に加え、ユーザーの好みや現在位置、アプリ内の現在のページ、会話のトピックに応じて異なる意味を持つフレーズの区別に役立ちます。例を見てみましょう。

ユーザー : ここはどこ?
ボット : 近くのものを写真に撮ってアップロードしてください。調べるお手伝いをします。
[ ユーザーがゴールデン ゲート ブリッジの写真をアップロードする ]
ボット : ゴールデン ゲート ブリッジの近くです。
ユーザー : チケットはいくら?
ボット : ゴールデン ゲート ブリッジは無料で訪れることができます。
ユーザー : 今日は何時に閉まる?
ボット : ゴールデン ゲート ブリッジは週 7 日、24 時間開いています。
ユーザー : どうやって行けばいい?
[ ボットがゴールデン ゲート ブリッジまでの地図を表示する ]

上の会話でユーザーが「チケットはいくら?」「今日は何時に閉まる?」「どうやって行けばいい?」と尋ねたとき、ボットはコンテキストがゴールデン ゲート ブリッジに関するものであることを理解しています。

次にすることは、インテントとコンテキストを関連づけてまとめることです。下図の各ボックスはインテントとコンテキストです。矢印はボックス間の関係を示しています。

kq5Uy9GiaO3PuiiXEo4cWAKHLmccVJaXUYboW8fmOdNxyysJ4SP93pkOSu4HO0NY19a2XEuNiQSCT1cYToa_2ysLqdqpTXidA3BROuVWJSP3g1mRvsm62uIalZPS5FGPpIyyE1bjyf3e.PNG

出力コンテキスト
コンテキストはユーザー セッション(API 呼び出しで渡すセッション ID)と結びついています。ユーザーの表現があるインテントにマッチすると、そのインテントは出力コンテキストを、この表現によって将来共有されるように設定します。ユーザー リクエストを API.AI エージェントに送るときに、コンテキストを追加することもできます。このサンプル アプリでは、where(どこ)のインテントは、location(場所)のインテントが将来マッチされるように where の出力コンテキストを設定します。

入力コンテキスト
入力コンテキストは、特定のコンテキストが設定されている場合にのみインテントがマッチされるように制限します。私たちのサンプルでは、location の入力コンテキストは where に設定されています。location のインテントは、where のコンテキストの下でのみマッチされます。

こうしたインテントとコンテキストを生成する手順を以下に示します。

まず、where のインテントを作成し、where の出力コンテキストを追加します。これはコンテキスト ツリーのルートであり、入力コンテキストはありません。

b-YfPWw1Au72TvrR13zMZCV_hrxNYpcWm_Fdkh7cQyzI3fr36kvK02vhaselF-QOIXNaDWzW2eoMkuL95vv__XbExUZTa7Q_zglXzJYfNdieLdK10RlldJegUk_gbnwe8Silmbran03k.PNG

続いて location のインテントを作成し、where の入力コンテキストを追加します。また、where の出力コンテキストをリセットし、location の出力コンテキストを追加します。私たちのツアー ガイド アプリでは、location の入力コンテキストは where です。location インテントが検出されたら、以降の会話が where コンテキストを再びトリガーしないように、このコンテキストをリセットする必要があります。これは、where 出力コンテキストのライフスパンを 0 に設定することで行われます。デフォルトでは、コンテキストは 5 リクエストまたは 10 分間のライフスパンを持ちます。

ABcjbuXsz0F6GA51a0Vv_fUnftqx_vo24DfvcB9B2scRbNcHCj5qBYiMnqYNRfMNbI0ARnZ6ZdW1o9xnH0Ii6DqLVhO2YBHd7Ai_SdcHFVvNgQH9Kj0w-uM_udaR2cxKAsI5VdJl9ova.PNG

次に、ticket のインテントを作成し、location の入力コンテキストを追加します。そして location の出力コンテキストを追加し、hoursmap のインテントが location コンテキストを入力コンテキストとして継続的に使えるようにします。

なお、#context.parameter というフォーマットで入力コンテキストからパラメータを渡すことができます。たとえば、インテント inquiry-where-location から inquiry.where.location.ticket に、#inquiry-where-location.location というフォーマットで location の文字列を渡せます。

6tCF296bQy6HEp98j2aD4AotvuE3NtUuWY7M_2wW5o5XJyRTfYzxhMBDSw5S82PdCNjJVfGiCqAoUoFU42VS6y4068xNXFxfOB5QxtZG9bRec1k-crr2caGLYcFnpVwMzgbWJG6jztsu.PNG

最後に、ticket のインテントと同様に、hoursmap のインテントを作成します。

次回の予定

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