Actions Builder を使って Mercari Voice Search を作ってみた

Mercari Advent Calendar 2020の9日目は、メルカリ Search Backendチームの @otter がお送りします。

普段は Go で APIサーバなどの開発をしていますが、その傍ら、Actions on Google を利用したGoogle Assistant アプリの開発、イベント登壇、チューター、公式ドキュメントの翻訳などの活動をしています。(※あくまでも個人的な活動です)

この記事ではActions Builder を使った Google Assistant アプリについて紹介します。このアプリは、社内の Mercari Hack Week というハッカソンイベントで開発しました。

Actions Builder

Actions Builder とは、今年 Google から発表された Google Assistant アプリを作成するための会話構築IDEです。従来の Actions Console と自然言語解析サービスである Dialogflow Console をそれぞれ使って開発するフローとは全く異なり、アクションの開発、テスト、デプロイをすべてActions Console 内に統合し、「シーン(Scene)」を定義していくことで会話型フローを構築できるようになりました。また、NLUトレーニングデータの管理も Actions Builder で行えます。

Actions Builder についてもっと知りたいという方は、ぜひ「Actions Builder 正式発表記念イベント」の資料動画をご覧ください。「Actions Builder 基礎編」では、新しい会話構築フローのポイントとなる概念「シーン」について説明しています。

Mercari Voice Search を作った経緯

Mercari Hack Week については、他の方々の Mercari Advent Calendar でも説明があるように、半年に1度開催している社内ハッカソンです。 今年3月に私が作成したのは、Dialogflow と旧 Actions SDK(現在は Legacy Actions SDK と呼ばれる)を使った Mercari Voice Search でした。

元々、Actions on Google を扱うのが趣味だったというのもありますが、Voice UI がにわかに広がりつつある昨今、声でアイテムを検索できたら面白いのではないかという単純な動機でした。

Dialogflow から Actions Builder への移行

そして 2020年9月の Hack Week では、せっかくなのでリリースされてあまり日がたっていない Actions Builder を使って作り直してみようと移行に取り組みました。

Action の Project の移行はマイグレーションツールで移行できました。(移行手順についてはこちら

ただ、詳細は後述しますが、会話フローの組み立て方が変わっているので、シーンを追加したり、既存 SDK で使っていた prompt の UI Elements が新 SDK で用意されていなかったりと、元のUI を提供できないなどの難しい点もいくつかありました。

Mercari Voice Search の仕組み

ユーザーが Google Home やスマートフォンの Assistant アプリから、Mercari Voice Search を呼び出すと会話型フローが始まり、Actions on Google は Actions Builder で組み立てたシーンからPrompts「どんなアイテムをお探しでしょう?」 を返します。

Prompts とは、アクションがユーザーにレスポンスとして送信するものを定義するものです。テキストや音声のレスポンスのように単純なものもあれば、より複雑で、カード、画像、表などのコンテンツを含むこともあります。

そして、ユーザーが調べたいキーワードを伝えると今度は Actions on Google は、Webhook をトリガーし Fulfillment にリクエストします。

Fulfillment とは、ユーザーの入力を処理したり、対応するアクションを実行するための、アクション開発者が提供するビジネスロジックのエンドポイントです。

さらに Fulfillment は Mercari の Search API を呼び出し、条件に合致するアイテムを取得します。取得したデータは、Actions SDK の UI Elements にセットして Actions on Google に渡すことで、ユーザーには Prompts としてレスポンスが返ります。

Scene の組み立て方

Actions Builder では、複数のシーンを接続し、各シーンに独自のロジックを含むユーザージャーニーを含めることで会話型フローを作成していきます。

Actions Console 上で Scene を組み立てていく

Main invocation はアクションの入り口です。 ここでは、Send prompts で挨拶だけ返し、次のシーン「search_items」への Transition を設定しています。

シーン「search_items」では、まず On enter で Send prompts を返し、ユーザーに探したい条件について問いかけます。 そして、ユーザーの返答を Slot filling で受け取り、Webhook から Fulfillment を呼び出しています。

Slot filling とは、自然な前後の会話を通じてユーザーから一連の入力値(スロット)を収集できる会話ロジックの機能を指します。

Condition scene.slots.status == "FINAL" は、Slot filling が完了しているかどうかをチェックします。 完了している場合は、シーン「again」に Transition します。

シーン「again」ではもう一度アイテムを検索するかどうかをユーザーに尋ねます。 そしてユーザーの返事が Yes インテントに Match すると再度シーン「search_items」に遷移し、No インテントに Match すると End conversation シーンへ遷移します。

インテントとはアクションが理解できるユーザー入力値を定義したものです。 インテントには、デフォルトで定義されている System intent と Yes/No インテントのような開発者が Training Phrases を使って定義した Custom intent があります。 ユーザーが Training Phrases に一致または類似する何かを言うと、対応する Intentに Match します。

Actions Builder を使ってみて

Dialogflow はきっと今後も chat bot など Google Assistant 以外の場所でも使われていくはずなので、使えなくなるということはないでしょう。しかし、Actions on Google の開発をするのであれば、Actions Builder を使うことが今後の主流になると思います。

Actions Builder を使うメリットとして、シーンを使うことでユーザーとの会話型フローの構築をよりイメージしやすくなる、Dialogflow が担っていた部分が Actions Builder に統合されたため複数のサービスを行き来せずに済む、などがあります。その中で、筆者が一番おすすめしたい改善点は CLI が使えるようになったことです。コンソール以外からも操作できるようになったため、アクションの設定が手元でバージョン管理できるようになりました。

また Actions Builder への移行で大変困ったこととして、いくつかの UI Elements が使えなくなってしまったことがあげられます。リスト形式かつ、画像+遷移先の指定ができるものが必要だったのですが、新 SDK ではサポートされておらず、追加される予定もなさそうな気配です。

おそらく、Google Assistant 上でアイテムを表示したり、URL経由でアプリに遷移するのは、推奨される UX ではなく、今後は App Actions(Assistant から 特定の Android アプリの機能を呼び出す DeepLink)を使っていくべきなんだろうなと思いました。

また、今回作成した Mercari Voice Search はサービスとしてリリースされてはいませんが、今後、App Actions を使ってメルカリアプリ自体と連携したり、会話型フローの設計を練って使ってもらえるアクションに改良してみたいなと思います。