Alexa Conversations とは（超ざっくり）


# 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` は表示されない。

![IMG_7766.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/3a65116f-7204-16e6-3f8d-a9eeea2eff89.jpeg)


# Alexa Conversations とは

Alexa Conversationsは、Alexaとユーザーが自然な会話を体験できる仕組み。

これまでのスキルのように、ハードコーディングされた会話ではなく、AlexaのAIがサンプルダイアログから会話を推定し、予期しないダイアログを含め学習してく、自然な会話を実現してくれるというもの。

# Alexa Conversations の仕組み

サンプルダイアログをいくつか用意しておくと、Alexa ConversationsのダイアログシミュレーターがAIを駆使して自然なやりとりができるようにスキルを構築してくれるというもの。（合ってるかな？）
会話のやりとり（というかスロット値の取得や、再取得）を Alexa Conversations に任せることで、開発者はスロットを取得するための細かいロジック作成から解放される。

![IMG_7750.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/02424c3c-e018-372f-0fc0-123645e31f83.jpeg)


# Alexa Conversations の機能

`Alexa Conversations` は、スキルに対して次の機能が提供されているので、我々開発者が複雑なコードを書く必要がなく、`Alexa Conversations` がうまいこと会話を繋げて、開発者が必要としている情報（スロット値）を拾い上げてくれる。

ドキュメントが日本語化されているにもかかわらず、理解が追い付かずなかなかピンと来てないところがある・・・:sweat:


#### State management / 状態管理

Alexa音声プロンプトを選択してレンダリングし、ユーザーを次の状態に誘導します。

サンプルダイアログの流れ通りに、うまいこと会話を進めてスロットを拾ってくれるような印象。（まだちゃんとわかってない。）

#### Dialog variations / ダイアログのバリエーション

不足している情報を収集するために、ユーザーにフォローアップの質問をします。

Alexaの質問に対して、ユーザーの回答が不足している場合、その不足している情報を再度質問してくれる。
例えば、身長と体重を聞かれているのに、身長しか答えなかった場合、ちゃんと体重を聞き返してくれる。


#### User-driven corrections / ユーザー駆動の訂正

気が変わったユーザーを処理します。

最初の回答で「ペプシ」って言ったけど、コーラに変更したくなった場合、「やっぱりコーラにして！」みたいな言い換えを拾ってくれる。
特別な定義は不要で、ダイアログを自動的に拡張してこのような発話に対応してくれるらしい。（公式ドキュメントより）

#### Context carry-over / コンテキストの持ち越し

ユーザーが他のオプションを繰り返す必要なしにオプションを更新します。

前の回答を憶えてくれているので、いちいち全てのスロットを言わなくても、うまいこと収集してくれる。



# Alexa Conversations をスキルに適用するべきか

全てのスキルに適用するものではない。適用した方が効果がでる場合と、出ない場合がある。
以下、公式ドキュメントからの抜粋。

#### Alexa Conversations の効果が期待できる場合

- スキルが目的ベースの機能を提供する場合。
- スキルにユーザーとの自由な形式の双方向の対話が含まれており、ユーザーの目的を達成するためにいくつかの複雑なデータポイントを収集する必要がある場合。
- ユーザーにとって柔軟で自然なエクスペリエンスを実現するにあたり、スキルコード内ではすべての潜在的なユーザー対話と状態を管理できない場合。
- すべてのユーザー対話の状態を管理するためのコードを記述する手間を省きたい場合。

#### Alexa Conversations の効果が得られない場合

- 事前に決定されたダイアログパスと、ユーザーが従うべき特定のワークフローがスキルに必要な場合。
- スキルコード内でターンごとの状態管理を完全に制御したい場合。

会話フローがガチガチで会話の揺れがない場合は、効果がでないということですね。


# スキル構築モデル

`Alexa Conversations` の登場で、カスタムスキルを作る時のパターンが３パターンになった。それぞれのモデルは以下。


#### インテントベース モデル

これまでのカスタムスキルのこと。

#### 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` が表示されていて、このメニューの中で、ダイアログだったり、レスポンスだったりを定義していく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/0a5c936c-5bb7-6e7b-349e-6b493d57ae8d.png)



#### ACDL (Alexa Conversations Description Language)


[ask-cli-x](https://www.npmjs.com/package/ask-cli-x) をインストールすると、ask cli で Alexa Conversations のアノテーションなどを作成することが可能となるらしい。（まだ試していない。）

公式ドキュメントには以下のように書いてある

> npm install -g ask-cli-x

しかし、[ask-cli-x](https://www.npmjs.com/package/ask-cli-x) では、以下のように書かれている。ask cliをアップデートすれば入っているということなのか？


> npm install -g ask-cli

# スキル構築方法

サンプルダイアログを作成しアノテーションを付ける方式のため、これまでの開発とはちょっと違う。
この情報を基に、ダイアログシミュレーターが、アノテーション付きダイアログを一般化してトレーニングデータを生成する。
文字だとわかりにくいけど、[チュートリアル（英語版　Build Multi-turn Skills with Alexa Conversations）](https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/get-deeper/tutorials-code-samples/build-multi-turn-skills-with-alexa-conversations) をやってみるとなんとなくわかるようになる。ハズ。


# アノテーションとは

まず、ユーザーとAlexaの間で行われる一般的な会話であるサンプルダイアログを入力する。
それぞれのダイアログはユーザーのターンとAlexaのターンで構成される。ユーザーの発話の後にはAlexaの発話が続く形式。

そして、各発話をクリックして、`Alexa Conversations` の要素（Utterance Sets / ユーザー発話セット、Responses / Alexa応答、API Definitions / API定義）を使用してアノテーションを付けていく。と書かれているもののイマイチぴんとこない。たぶん、各発話がどのような振る舞いをするかの設定をアノテーションと言っていると思っているのだけど・・・合ってるかな・・・:sweat:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/377c1a8c-fa89-3336-d828-d86832a45337.png)


#### Utterance Sets / ユーザー発話セット

ユーザーの発話のバリエーションはここで設定する。カスタムスキルの `Sample Utterances` に似てる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/fa436ad8-99ac-6c91-a881-82149ef30cf0.png)


#### Responses / Alexa応答

Alexaのレスポンスは、基本 `APL for Audio` で設定する（必須）。必要であれば `APL` も追加できる。`Arguments` にスロットを追加することで、APL-Aの `"mainTemplate"."parameters"` でスロット値を受け取ることができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/dac43ff0-50c6-8058-5eb0-2f00cb0c835c.png)

#### API Definitions / API定義

API名と引数の定義をする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426739/8faa1418-3e4d-30b8-65f6-d6237cd15b2c.png)

`Alexa Conversations` によって必要なスロットが全て取得できると、APIがリクエストされる。Alexa Conversations モデルの場合は、以下のようなリクエストがLambdaに送信されるので、Lambda側で対応するハンドラーを作ってリクエストを受け取れるようにする。

カスタムスキルの時とは違い、リクエストタイプは `Dialog.API.Invoked` となっていて、それに合わせてAlexa ConversationsのAPI定義で設定したAPI名 `getRecommendation` で判別する。

```javascript:GetRecommendationAPIHandler
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` が使えるようになるので、ぜひ使ってみて。



# 参考

- [Build Multi-turn Skills with Alexa Conversations　※チュートリアル（英語版）](https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/get-deeper/tutorials-code-samples/build-multi-turn-skills-with-alexa-conversations) 
- [skill-sample-nodejs-petmatch　※GitHub（英語版）](https://github.com/alexa-samples/skill-sample-nodejs-petmatch)
- [pizza-reference-skill　※GitHub（英語版）](https://github.com/alexa/alexa-cookbook/tree/master/feature-demos/alexa-conversations/pizza-reference-skill)
- [Alexa Conversations 日本語ドキュメント](https://developer.amazon.com/ja-JP/docs/alexa/conversations/about-alexa-conversations.html)