Alexa Conversations 前提
日本語スキルでは使うことができない。Alexa Live 2021(20212021.7.21)で Private Preview
であることが発表されてはいるので、早く Beta
になることを期待するばかり。ただ、日本語スキルとしては作成できないけど、GAしている英語版スキルを作れば普通に使える。
1.(GA)en-US
2.(Beta)en-AU, en-CA, en-IN, en-GB, de-DE
3.(Private Preview) ja-JP
新規でスキルを作成し、 言語を en-US
にすれば以下のように Alexa Conversations
が表示される。おそらくBeta版の言語でも同じように表示されると思うが試してはいない。日本語スキルでは、まだ Alexa Conversations
は表示されない。
Alexa Conversations とは
Alexa Conversationsは、Alexaとユーザーが自然な会話を体験できる仕組み。
これまでのスキルのように、ハードコーディングされた会話ではなく、AlexaのAIがサンプルダイアログから会話を推定し、予期しないダイアログを含め学習してく、自然な会話を実現してくれるというもの。
Alexa Conversations の仕組み
サンプルダイアログをいくつか用意しておくと、Alexa ConversationsのダイアログシミュレーターがAIを駆使して自然なやりとりができるようにスキルを構築してくれるというもの。(合ってるかな?)
会話のやりとり(というかスロット値の取得や、再取得)を Alexa Conversations に任せることで、開発者はスロットを取得するための細かいロジック作成から解放される。
Alexa Conversations の機能
Alexa Conversations
は、スキルに対して次の機能が提供されているので、我々開発者が複雑なコードを書く必要がなく、Alexa Conversations
がうまいこと会話を繋げて、開発者が必要としている情報(スロット値)を拾い上げてくれる。
ドキュメントが日本語化されているにもかかわらず、理解が追い付かずなかなかピンと来てないところがある・・・
State management / 状態管理
Alexa音声プロンプトを選択してレンダリングし、ユーザーを次の状態に誘導します。
サンプルダイアログの流れ通りに、うまいこと会話を進めてスロットを拾ってくれるような印象。(まだちゃんとわかってない。)
Dialog variations / ダイアログのバリエーション
不足している情報を収集するために、ユーザーにフォローアップの質問をします。
Alexaの質問に対して、ユーザーの回答が不足している場合、その不足している情報を再度質問してくれる。
例えば、身長と体重を聞かれているのに、身長しか答えなかった場合、ちゃんと体重を聞き返してくれる。
User-driven corrections / ユーザー駆動の訂正
気が変わったユーザーを処理します。
最初の回答で「ペプシ」って言ったけど、コーラに変更したくなった場合、「やっぱりコーラにして!」みたいな言い換えを拾ってくれる。
特別な定義は不要で、ダイアログを自動的に拡張してこのような発話に対応してくれるらしい。(公式ドキュメントより)
Context carry-over / コンテキストの持ち越し
ユーザーが他のオプションを繰り返す必要なしにオプションを更新します。
前の回答を憶えてくれているので、いちいち全てのスロットを言わなくても、うまいこと収集してくれる。
Alexa Conversations をスキルに適用するべきか
全てのスキルに適用するものではない。適用した方が効果がでる場合と、出ない場合がある。
以下、公式ドキュメントからの抜粋。
Alexa Conversations の効果が期待できる場合
- スキルが目的ベースの機能を提供する場合。
- スキルにユーザーとの自由な形式の双方向の対話が含まれており、ユーザーの目的を達成するためにいくつかの複雑なデータポイントを収集する必要がある場合。
- ユーザーにとって柔軟で自然なエクスペリエンスを実現するにあたり、スキルコード内ではすべての潜在的なユーザー対話と状態を管理できない場合。
- すべてのユーザー対話の状態を管理するためのコードを記述する手間を省きたい場合。
Alexa Conversations の効果が得られない場合
- 事前に決定されたダイアログパスと、ユーザーが従うべき特定のワークフローがスキルに必要な場合。
- スキルコード内でターンごとの状態管理を完全に制御したい場合。
会話フローがガチガチで会話の揺れがない場合は、効果がでないということですね。
スキル構築モデル
Alexa Conversations
の登場で、カスタムスキルを作る時のパターンが3パターンになった。それぞれのモデルは以下。
インテントベース モデル
これまでのカスタムスキルのこと。
Alexa Conversations モデル
すべてAlexa Conversationsの機能だけでスキルを作る。
ハイブリッド モデル
インテントベースとAlexa Conversationsが合わさったもの。カスタムスキルがベースで、複雑なダイアログ管理が必要な部分だけを Alexa Conversations
に任せるハイブリッド型。
Custom Skills ⇒ Alexa Conversations
Alexa Conversations ⇒ Custom Skills と行ったり来たりさせることができる。
スキル構築ツール
これまでと同じように Alexa Developer Console
上で作成するか、ask cli
で ACDL (Alexa Conversations Description Language)を使用するかのどちらかとなる。
Alexa Developer Console
英語スキルを作成すると、左ペインに Alexa Conversations
が表示されていて、このメニューの中で、ダイアログだったり、レスポンスだったりを定義していく。
ACDL (Alexa Conversations Description Language)
ask-cli-x をインストールすると、ask cli で Alexa Conversations のアノテーションなどを作成することが可能となるらしい。(まだ試していない。)
公式ドキュメントには以下のように書いてある
npm install -g ask-cli-x
しかし、ask-cli-x では、以下のように書かれている。ask cliをアップデートすれば入っているということなのか?
npm install -g ask-cli
スキル構築方法
サンプルダイアログを作成しアノテーションを付ける方式のため、これまでの開発とはちょっと違う。
この情報を基に、ダイアログシミュレーターが、アノテーション付きダイアログを一般化してトレーニングデータを生成する。
文字だとわかりにくいけど、チュートリアル(英語版 Build Multi-turn Skills with Alexa Conversations) をやってみるとなんとなくわかるようになる。ハズ。
アノテーションとは
まず、ユーザーとAlexaの間で行われる一般的な会話であるサンプルダイアログを入力する。
それぞれのダイアログはユーザーのターンとAlexaのターンで構成される。ユーザーの発話の後にはAlexaの発話が続く形式。
そして、各発話をクリックして、Alexa Conversations
の要素(Utterance Sets / ユーザー発話セット、Responses / Alexa応答、API Definitions / API定義)を使用してアノテーションを付けていく。と書かれているもののイマイチぴんとこない。たぶん、各発話がどのような振る舞いをするかの設定をアノテーションと言っていると思っているのだけど・・・合ってるかな・・・
Utterance Sets / ユーザー発話セット
ユーザーの発話のバリエーションはここで設定する。カスタムスキルの Sample Utterances
に似てる。
Responses / Alexa応答
Alexaのレスポンスは、基本 APL for Audio
で設定する(必須)。必要であれば APL
も追加できる。Arguments
にスロットを追加することで、APL-Aの "mainTemplate"."parameters"
でスロット値を受け取ることができる。
API Definitions / API定義
API名と引数の定義をする。
Alexa Conversations
によって必要なスロットが全て取得できると、APIがリクエストされる。Alexa Conversations モデルの場合は、以下のようなリクエストがLambdaに送信されるので、Lambda側で対応するハンドラーを作ってリクエストを受け取れるようにする。
カスタムスキルの時とは違い、リクエストタイプは Dialog.API.Invoked
となっていて、それに合わせてAlexa ConversationsのAPI定義で設定したAPI名 getRecommendation
で判別する。
const GetRecommendationAPIHandler = {
canHandle(handlerInput) {
return Alexa.getRequestType(handlerInput.requestEnvelope) === 'Dialog.API.Invoked'
&& handlerInput.requestEnvelope.request.apiRequest.name === 'getRecommendation';
},
handle(handlerInput) {
ビルド
サンプルダイアログを作って、アノテーションを付けたら Build Model
ボタンをクリックしスキルをビルドする。
このビルドには20分ぐらいかかる。なかなかしんどい。
ビルドが完了したら Alexa Conversations
が使えるようになるので、ぜひ使ってみて。