Googleアシスタントのデベロッパープラットフォームでは、スマートスピーカー、電話、自動車、テレビ、ヘッドフォンなどの10億台を超えるデバイスに向けて、仮想のパーソナルアシスタントであるGoogleアシスタントの機能を拡張するソフトウェアを作成できます。 ユーザーはアシスタントと会話を交わして、食料品の購入や配車の予約などを行うことができるようになります。開発者としてあなたは、アシスタントデベロッパープラットフォームを使用して、ユーザーと独自のサードパーティのフルフィルメントサービスとの間の楽しく効果的な会話体験を簡単に作成および管理することができます。

このコードラボは、Googleアシスタントで開発するための中間レベルの概念をカバーします。また、このコードラボは、レベル1のコードラボで作成されたアクションを基に構築されています。 これを開始する前に、レベル1のコードラボを完了することを強くお勧めします。

このコードラボで作成するアクションは、ユーザーが選択したアシストに基づいて、神秘的な土地、グリフィンバーグでの探求の運勢をユーザーに知らせます。

何をつくりますか?

このコードラボでは、次の機能を使用して、高度な会話型アクションを作成します。

ビルドを開始する前に、"Hey Google, talk to Fate and Fortune" と言うことで、Googleアシスタント対応デバイスにてライブアクション を操作できます。戻ってきたユーザーが通るこのアクションのデフォルトのパスは、次のインタラクションのようになります。

What you'll learn

必要なもの

このコードラボの前提条件は次のとおりです。

このコードラボのフルフィルメントコードを理解するには、必須ではありませんが、JavaScript(ES6)に精通していることが強く推奨されます。

最初のコードラボでは、1つのシーン Start で単純な会話型アクションを作成しました。

このコードラボでは、アクションの会話を拡張します。 次のセクションでは、アクションを構成して以下を実行します:

Fortune シーンの作成

このセクションでは、 Fortune シーンを作成し、会話中にユーザーが Fortune シーンにどのように移行するかを定義します。

Fortune という新しいシーンを作成するには、次の手順に従います:

  1. コードラボレベル1のアクションプロジェクトを開きます。
  2. 上部ナビゲーションの Develop をクリックします。
  3. Scenes の下で、 Start シーンをクリックします。
  4. yes インテント(When yes is matched ボックス)をクリックしてオプションを開きます。
  5. Send prompts の選択を外して、プロンプトを削除します。
  6. Transition セクションで、ドロップダウンメニューをクリックし、テキストボックスをクリックして、 Fortune と入力します。 次に、 Add をクリックします。 これにより、 Fortune と呼ばれる新しいシーンが作成されます。 また、ユーザーが運勢を聞きたいときに、 Start シーンから Fortune シーンへの遷移を追加します。

Fortune シーンの会話ロジックを定義する

このコードラボでは、 Fortune シーンを構成して、ユーザーに "What do you choose to help you on your quest, a dragon, a translator, or a compass?" と尋ねます。 slot filling(スロットフィリング)と呼ばれる機能を使用して、先に進む前にユーザーから必要な情報を収集できます。

アクションは、ドラゴン、トランスレーター、コンパスの3つの支援にフォーチュンを与えます。 ユーザーの入力でこれら3つのオプションを識別するようにアクションを構成するには、新しいtype(タイプ)を作成する必要があります。

シーンのスロットフィリングステージ内でタイプを使用して、ユーザーから必要な情報を定義できます。 NLUエンジンは、ユーザー入力値でスロットの一致を検出すると、スロットを型付きパラメーターとして抽出するため、シーンでそれを使用してロジックを実行できます。

available_options タイプを作成する

このセクションでは、 available_options という新しいタイプを作成します。これは、プロンプトに応答してユーザーが選択できる3つのオプション(ドラゴン、トランスレーター、コンパス)を指定します。 ユーザーが同義のことを言った場合に備えて、これらのオプションのいくつかの同義語も定義します。 後のセクションでは、 available_options タイプをスロットに追加して、ユーザーの選択を取得することを指定します。

available_options タイプを作成するには、次の手順に従います:

  1. 左側のナビゲーションで、 Types をクリックします。
  2. +(プラス記号)をクリックし、 available_options と入力して、 Enter キーを押します。
  3. available_options をクリックしてオプションを開きます。

タイプは情報のキーと値のペアとして構成されます。キーはタイプの名前で、values(値)はそのキーの同義語です。 キーを定義すると、自動的に値として追加されます。

ユーザーが選択できる3つのオプションを追加するには、次の手順に従います:

  1. Add entries セクションまでスクロールします。
  2. New entry テキストボックスに dragon と入力し、 Enter キーを押します。 このアクションは dragon キーを作成します。
  3. Add values テキストフィールドに hydra と入力し、 Enter キーを押して値(同義語)として追加します。 次に、値の lizard に対してこの手順を繰り返します。
  4. 残りのキーと対応する値を追加します:

  1. Save をクリックします。

アクションは、 available_options が dragon、translator、および compass であることを理解し、いくつかの対応する同義語も認識できます。

スロットフィリングを設定する

次に、 Fortune シーンでスロットフィリングを構成する必要があります。 スロットフィリングロジックを構成するには、次の手順に従います:

  1. 左側のナビゲーションの Scenes で、 Fortune をクリックします。
  2. Fortune シーンで、Slot filling+プラス記号)をクリックします。
  3. 右側の Enter slot name テキストボックスで、スロット名として chosenOptions を追加します。
  4. Select type ドロップダウンで、スロットタイプとして available_options を選択します。
  5. This slot is required を選択します。

  1. Send prompts を選択し、次のメッセージと提案チップを追加します。:
 candidates:
  - first_simple:
      variants:
        - speech: >-
            What do you choose to help you on your quest, a dragon, a
            translator, or a compass?
    suggestions:
      - title: 'Dragon'
      - title: 'Translator'
      - title: 'Compass'
  1. Save をクリックします。

これで、 available_options タイプがスロットに追加されました。これは、続行する前にユーザーから収集する必要がある情報(支援の選択肢)をアクションに通知します。 また、スロット内にプロンプトを設定しました。これは、ユーザーがシーンのスロットフィリングステージに到達したときにプロンプトキューに追加されます。

スロットに chosedOptions という名前を付けた場合、 Customize slot value writeback フィールドは同じ名前($session.params.chosenOptions)で更新されることに注意してください。 このパラメーターには、Actions Builder内およびクライアントライブラリを介してフルフィルメント内でその名前でアクセスできます。

scene.slots.status == "FINAL" コンディションを設定する

スロットを追加すると、condition(コンディション) scene.slots.status == "FINAL" がコンディションリストに自動的に追加されます。

コンディション scene.slots.status == "FINAL" は、スロットフィリングが完了しているかどうかをチェックします。 すべてのスロットが埋まると、コンディションによってWebhookがトリガーされるか、新しいシーンに移行するか、プロンプトキューにプロンプトが追加されます。

このセクションでは、 scene.slots.status == "FINAL" を構成して、スロットが満たされたときにプロンプトキューにプロンプトを追加します。

このプロンプトを FINAL コンディションに追加するには、次の手順に従います:

  1. scene.slots.status == "FINAL" コンディションをクリックして、オプションウィンドウを開きます。
  2. Send prompts を選択して、次のプロンプトを追加します。
candidates:
  - first_simple:
      variants:
        - speech: You picked $session.params.chosenOptions.
  1. Save をクリックします。

シュミレーターでアクションをテストする

この時点で、スロットを埋めるためにユーザーが選択する必要があるオプションを定義しました。 ユーザーからこの情報を取得した後、アクションは、ユーザーが選択した特定のオプションを参照するプロンプトを提供する必要があります。

アクションをテストするには、次の手順に従います:

  1. 上部のナビゲーションバーで、 Test をクリックします。
  2. Input フィールドに Talk to my test app をクリックまたは入力して、 Enter キーを押します。
  3. Input フィールドに Yes と入力し、 Enter キーを押します。 (または、 Yes サジェスチョンチップをクリックすることもできます。)

  1. dragon とタイプするか話かけます。"You picked dragon." というプロンプトが表示されるはずです。

次のセクションでは、ユーザーが選択できる各支援のプロンプトをカスタマイズします。

コンディションを使ってプロンプトをカスタマイズする

このセクションでは、ユーザーが選択できるオプションごとにコンディションを追加し、コンディションごとにカスタムプロンプトを追加します。

dragon フォーチュンをカスタマイズする

コンディションを更新し、ユーザーが "dragon" を選択したときのプロンプトをカスタマイズするには、次の手順に従います:

  1. 上部ナビゲーションの Develop をクリックします。
  2. 左側のナビゲーションで、 Fortune シーンをクリックします。
  3. scene.slots.status == "FINAL" コンディションをクリックして、オプションウィンドウを開きます。
  4. コンディションステートメントを次のように更新します: scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon"
  5. Send prompts を選択します。
  6. コードエディターで次のフォーチュンのプロンプトを更新します:
candidates:
  - first_simple:
      variants:
        - speech: >-
            The people of Gryffinberg will be awestruck by the beauty and power
            of the ancient dragon. Much to your dismay, the townspeople fall
            into dispute over who will receive the honor of riding the dragon
            first. You return home from your quest without everlasting glory or
            a dragon.
  1. Save をクリックします。

ここで、ユーザーが "dragon" または類似の音を発すると、アクションはその選択に基づいてフォチューンを提供します。 次に、残りの2つの選択を追加します。

translator フォーチュンをカスタマイズする

コンディションを追加し、ユーザーが "translator" を選択したときにプロンプトをカスタマイズするには、次の手順に従います:

  1. Condition の横にある +(プラス記号)をクリックします。
  2. scene.slots.status == "FINAL" && session.params.chosenOptions == "translator"else if テキストボックスに追加します。
  3. Send prompts を選択します。
  4. コードエディターに次のプロンプトを追加します:
candidates:
  - first_simple:
      variants:
        - speech: >-
            With the help of the translator, the rival factions in Gryffinberg
            are finally able to communicate with each other and resolve their
            disputes. You will complete your quest to restore peace in the town.
            The translator will be used on many subsequent journeys across the
            earth. After its work is done, it retires honorably to a premier
            location in the Gryffinberg History Museum.
  1. Save をクリックします。

compass フォーチュンをカスタマイズする

コンディションを追加し、ユーザーが "compass" を選択したときにプロンプトをカスタマイズするには、次の手順に従います:

  1. Condition の横にある +(プラス記号)をクリックします。
  2. scene.slots.status == "FINAL" && session.params.chosenOptions == "compass"else if テキストボックスに追加します。
  3. Send prompts を選択します。
  4. コードエディターに次のプロンプトを追加します:
candidates:
  - first_simple:
      variants:
        - speech: >-
            The compass will help you find the mystical and ancient Library of
            Gryffinberg. Among its infinite stacks of dusty books, you find one
            entitled "Wisdom of the Ages". By the time you've read the
            50,000-page tome, the townspeople have forgotten their problems. You
            will write a second edition of "Wisdom of the Ages", but have
            limited commercial success.
  1. Save をクリックします。

シュミレーターでアクションをテストする

この時点で、アクションはユーザーが選択したオプションに基づいてユーザーにカスタマイズされたフォーチュンを提供するはずです。

アクションをテストするには、次の手順に従います:

  1. 上部のナビゲーションバーで、 Test をクリックします。
  2. Input フィールドに Talk to my test app と入力し、 Enter キーを押します。
  3. Input フィールドに Yes と入力し、 Enter キーを押します。 または、 Yes サジェスチョンチップをクリックします。
  4. Translator とクリック、入力、または話しかけます。

"translator" オプションの適切なフォーチュンを受け取るはずです。

このセクションでは、ユーザーが別のオプションを選択して、選択後に別の運勢を聞くことができるようにアクションを構成します。 この変更は、ゲーム終了時のメッセージ "Do you want to play again?" に似ています。このループを構築するために、前のセクションで作成した yes および no インテントを再利用して、それらを Again という新しいシーンに追加しましょう。

Again シーンの作成

このセクションでは、新しい Again シーンを作成し、別のオプションを選択するかどうかをユーザーに尋ねるプロンプトを追加します。

Again シーンを作成するには、次の手順に従います:

  1. 上部ナビゲーションの Develop をクリックします。
  2. Scenes の下の +(プラス記号)をクリックします。
  3. Again と入力して Enter キーを押します。
  4. 左側のナビゲーションで、 Again シーンをクリックします。
  5. On enter の横にある +(プラス記号)をクリックします。
  6. Send prompts を選択し、次のプロンプトとサジェスチョンチップを追加します:
candidates:
  - first_simple:
      variants:
        - speech: >-
            That is what I see for you. Would you like to choose a different option and
            explore another future?
    suggestions:
      - title: 'Yes'
      - title: 'No'
  1. Save をクリックします。

Fortune から Again シーンへの遷移を追加

ユーザーがフォーチュンを受け取った後、会話は新しい Again シーンに移行する必要があります。

Fortune シーンから Again シーンへの遷移を追加するには、次の手順に従います:

  1. Fortune シーンをクリックします。
  2. 最初のコンディション(scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon")をクリックして、オプションウィンドウを開きます。
  3. 下にスクロールして、 Transition の下の Again を選択します。
  4. Save をクリックします。
  5. 2番目のコンディションをクリックして、オプションウィンドウを開きます。
  6. 下にスクロールして、 Transition の下の Again を選択します。
  7. Save をクリックします。
  8. 3番目のコンディションをクリックして、オプションウィンドウを開きます。
  9. 下にスクロールして、 Transition の下の Again を選択します。
  10. Save をクリックします。

シミュレータでアクションをテストする

この時点で、アクションは、ユーザーがフォーチュンを受け取った後、次のプロンプトを提供するはずです: "That is what I see for you. Would you like to choose a different option and explore another future?"

アクションをテストするには、次の手順に従います:

  1. 上部のナビゲーションバーで、 Test をクリックします。
  2. Input フィールドに Talk to my test app と入力し、 Enter キーを押します。
  3. Input フィールドに Yes と入力し、 Enter キーを押します。または、 Yes サジェスチョンチップをクリックします。
  4. dragon をクリック、入力、または話しかけます。

ドラゴンのオプションと Again のプロンプトのフォーチュンを受け取るはずです。

インテントと Again シーンへの遷移を追加

このセクションでは、 yes および no インテントを Again シーンに追加して、ユーザーが新しいオプションを選択するかどうかをアクションが理解できるようにします。 yes および no インテントに適切な遷移も追加します。 yes のインテントは Fortune シーンに移行し、 no のインテントは End conversation システムシーンに移行します。

Again シーンにインテントとトランジションを追加するには、次の手順に従います:

  1. 上部ナビゲーションの Develop をクリックします。
  2. Again シーンをクリックします。
  3. Custom intent handling の横にある +(プラス記号)をクリックします。
  4. インテントドロップダウンメニューから Yes を選択します。
  5. Transition ドロップダウンメニューから Fortune を選択します。
  6. Save をクリックします。

  1. Custom intent handling の横にある +(プラス記号)をクリックします。
  2. インテントドロップダウンメニューから no を選択します。
  3. Transition プルダウンメニューから End conversation を選択します。
  4. Send prompts を選択し、コードエディターに次のプロンプトを追加します:
candidates:
  - first_simple:
      variants:
        - speech: >-
            It pleases me that you are satisfied with your choice. Best of luck on your quest. Farewell.
  1. Save をクリックします。

シミュレータでアクションをテストする

アクションは、ユーザーが新しいオプションを選択するか、会話を終了するかを理解する必要があります。

yes インテントをテストするには、次の手順に従います:

  1. 上部のナビゲーションバーで、 Test をクリックします。
  2. Input フィールドに Talk to my test app と入力し、 Enter キーを押します。
  3. Input フィールドに Yes と入力し、 Enter キーを押します。 または、 Yes サジェスチョンチップをクリックします。
  4. いずれかのオプションをクリック、入力、または発声します。
  5. Input フィールドに Yes と入力し、 Enter キーを押します。

"What do you choose to help you on your quest, a dragon, a translator, or a compass?" というプロンプトが表示されるはずです。

no インテントをテストするには、次の手順に従います:

  1. いずれかのオプションをクリック、入力、または発声します。
  2. Input フィールドに No と入力し、 Enter キーを押します。

End conversation プロンプトとして以下が表示されるはずです: "It pleases me that you are satisfied with your choice. Best of luck on your quest. Farewell."

これで、ほとんどのユーザーがアクションで取るメインパスが構築されました。 ただし、ユーザーは Fortune シーンのプロンプト "What do you choose to help you on your quest, a dragon, a translator, or a compass?" で提供されない選択肢で応答してくることがあります。

このセクションでは、ユーザーが "magic"、"money"、"horse"、または "phone" をいつ選択するかを理解し、ユーザーに選択時に元の3つの選択肢のいずれかから選択するように再度促すようにアクションを構成します。 このロジックを構成するには、これらの他の選択肢を含む新しい type と、ユーザーがこれらのオプションの1つを言うと一致する新しいインテント other_option を作成する必要があります。 また、 other_option インテント内のトレーニングフレーズにアノテーションを付けて、インテントパラメータを識別および抽出する必要があります。

アシスタントの自然言語処理エンジンは、ユーザー入力値からパラメーターの一致を検出すると、値を型付きパラメーターとして抽出するため、シーンでそれを使用してロジックを実行できます。 このコードラボでは、ユーザーが選択した支援を抽出するようにアクションを構成し、プロンプトでその選択を参照します。

unavailable_options タイプを作成する

アクションがユーザーの入力でそのデータを識別できるように、さまざまな異なるオプションを含む unavailable_options タイプを作成しましょう。

unavailable_options タイプを作成するには、次の手順に従います:

  1. 上部ナビゲーションの Develop をクリックします。
  2. Types の下の +(プラス記号) をクリックします。
  3. unavailable_options と入力して、Enter キーを押します。
  4. オプションを開くには、 unavailable_options をクリックします。
  5. Add entries セクションに次のエントリと対応する値を入力します。

horse

horse, stallion, steed

magic

magic, enchanted, spells

money

money, cash, gold

phone

phone, cell, apps

Key-Valueテーブルは次のようになります:

  1. Save をクリックします。

other_option インテントを作成する

次に、 other_option というインテントを作成し、 unavailable_options タイプのオプションを含むトレーニングフレーズを追加します。このインテントには、ユーザーがunavailable_options タイプに含まれる選択肢を選択したときに一致します。

other_option インテントを作成して構成するには、次の手順に従います:

  1. Intents の下の +(プラス記号) をクリックします。
  2. other_option と入力し、 Enter キーを押します。
  3. other_option をクリックしてウィンドウを開きます。
  4. 次のトレーニングフレーズを追加し、それぞれの後に Enter キーを押します:
  1. Add intent parameters セクションで、パラメータ名を chosenUnavailableOption に更新します。
  2. Save をクリックします。

トレーニングフレーズを入力すると、Actions Builderは spells, phone, magic, cash, horseunavailable_options タイプから認識し、それらの単語を自動的に強調表示(アノテート)します。次の図に示すように、Actions Builderは、 Add intent parameters セクションにインテントパラメーターを自動的に追加します。 インテントパラメータを使用すると、オプションの名前を抽出し、プロンプトでそのオプションを使用できます。

Fortune シーンに other_option インテントを追加する

これで、元から用意されたオプションではないオプションを指定するユーザーを処理できるインテント other_option ができました。 このセクションでは、 other_option インテントを Fortune シーンに追加します。 インテントパラメータを使用して、ユーザーの入力に基づいてプロンプトをカスタマイズします。

other_option インテント を Fortune シーンに追加するには、次の手順に従います:

  1. Fortune シーンをクリックします。
  2. Custom intent handling の横にある +(プラス記号) をクリックします。
  3. インテントドロップダウンメニューから other_option を選択します。
  4. Send prompts を選択して、次のプロンプトを追加します:
candidates:
  - first_simple:
      variants:
        - speech: >-
            I have seen the future and a $intent.params.chosenUnavailableOption.original
            will not aid you on your journey.

$intent.params.chosenUnavailableOption はインテントパラメータオブジェクトを参照し、 $intent.params.chosenUnavailableOption.original はそのオブジェクトの値を参照します。 original プロパティは、ユーザーが指定する生の入力を参照します。

  1. Save をクリックします。

Fortune シーンでユーザーが unavailable_options タイプにリストされているオプションを発すると、 other_option インテントが一致し、プロンプトキューにプロンプ​​トが追加されます。トランジションが指定されていないため、コンディションステージを再評価することにより、シーンの実行ループが続行されます。次に、 chosenOptions スロットがプロンプトをプロンプトキューに追加し、プロンプトキューがユーザーに配信されます。

シミュレータでアクションをテストする

アクションは、ユーザーが unavailable_options タイプにリストされているオプションの1つを選択したときに適切に応答し、ユーザーが選択した支援を指定するはずです。その後、アクションはユーザーに元の選択肢(dragon, translator, compass)のいずれかを選択するように再度要求します。

シミュレータでアクションをテストするには、次の手順に従います:

  1. 上部のナビゲーションバーで、 Test をクリックします。
  2. 入力フィールドに Talk to my test app と入力し、 Enter キーを押します。
  3. Input フィールドに Yes と入力し、 Enter キーを押します。または、Yes サジェスチョンチップをクリックします。
  4. Input フィールドに magic と入力し、 Enter キーを押します。

"a" の冠詞が前に配置されているため、ユーザーが "magic" を選択すると、プロンプトが正しく聞こえないことに気付くでしょう。 次のセクションでこの問題に対処します。

unavailable_options ハンドラーを追加する

unavailable_options タイプから適切な選択の前に "a" を配置するには、フルフィルメントロジックでイベントハンドラーを構成して、ユーザーが選択したオプションの前に "a" が必要かどうかを確認できます。 まず、コンソールでハンドラーを呼び出すようにアクションを構成する必要があります。

unavailable_options ハンドラーを追加するには、次の手順に従います:

  1. 上部ナビゲーションの Develop をクリックします。
  2. Fortune シーンをクリックします。
  3. Custom intent handling で、 When other_option is matched をクリックしてウィンドウを開きます。
  4. Send prompts をクリアします。
  5. Call your webhook を選択します。
  6. イベントハンドラーのテキストボックスに unavailable_options を入力します。

  1. Save をクリックします。

フルフィルメントを更新してデプロイする

unavailable_options イベントハンドラーを呼び出すようにアクションを構成したので、フルフィルメントのハンドラーを更新してデプロイできます。

フルフィルメントを更新するには、次の手順に従います:

  1. 左側のナビゲーションで Webhook をクリックします。
  2. greeting ハンドラの下に次のコードを追加します:
app.handle('unavailable_options', conv => {
  const option = conv.intent.params.chosenUnavailableOption.original;
  const optionKey = conv.intent.params.chosenUnavailableOption.resolved;
  let message = 'I have seen the future and ';
  if(optionsNeedA.has(optionKey)){
    message = message + 'a ';
  }
  message = message + `${option} will not aid you on your journey. `;
  conv.add(message);
});
  1. const app = conversation(); の下に次のコードを追加します:
const optionsNeedA = new Set();
optionsNeedA.add('horse').add('phone');
  1. Save Fulfillment をクリックします。
  2. Deploy Fulfillment をクリックします。デプロイが完了すると、エディターの上に "Your Cloud Function deployment is up to date." というメッセージが表示されます。

コードを理解する

unavailable_options ハンドラーは次のことを行います:

シミュレータでアクションをテストする

アクションは今、 unavailable_options タイプからのユーザーの選択に "a" が必要かどうかに基づいてプロンプトを調整するようになったはずです。

アクションをテストするには、次の手順に従います:

  1. 上部のナビゲーションバーで、 Test をクリックします。
  2. 入力フィールドで "Talk to my test app" をクリックまたは入力して、 Enter キーを押します。
  3. Input フィールドに Yes と入力し、 Enter キーを押します。または、 Yes サジェスチョンチップをクリックします。
  4. 入力フィールドに magic と入力し、 Enter キーを押します。次に、 Input フィールドに horse と入力し、 Enter キーを押します。

アクションは、"horse" の選択の前に "a" を追加し、 "magic" の選択の "a" の冠詞なしでプロンプトを作成するはずです。

おめでとうございます!

これで、Googleアシスタント向けアクションを開発するために必要な中級スキルについて学ぶことができました。

What we've covered

Actions on Google についてもっと知る

Googleアシスタント向けアクションの構築についてさらに学ぶために、以下の資料についても参考にすることができます:

最新のアナウンスを購読するために、Twitter @ActionsOnGoogle をフォローしてください。また、あなたが開発したものを #AoGDevs および #AoGDevsJa にてシェアしてください。