Amazon Web Services ブログ

Amazon Lex の感情分析を用いた会話体験の設計

効果的な会話をするには、感情を理解し、適切に対応することが重要です。コールセンターでは、不満を抱えた顧客と話すときには、たとえば「お手数をお掛けして申し訳ございません」といった簡単な謝辞が役立つこともあります。 感情を理解することは、人間のエージェントに電話を代わってサポートを引き継ぐタイミングを判断するのにも役立ちます。

このような会話の流れをボットで実現するには、ユーザーがあらわにした感情を検出し、適切に対応する必要があります。以前は、Comprehend API を使用してカスタム統合を構築する必要がありました。この記事の執筆時点では、Amazon Lex で感情をネイティブに判断できるようになっています。 本稿では、ユーザーの感情を使用して会話の流れをより適切に管理する方法を説明します。 ボットを構築し、ユーザーの感情に基づいて応答を更新するロジックを追加し、エージェントへの引き継ぎを設定する手順を説明します。

ボットを構築する

次の会話を使用して、ボットをモデル化します:

ユーザー: 荷物はいつ到着しますか? とても遅いのですが。

エージェント: ご不便をおかけして申し訳ございません。 追跡番号をお教えいただけますか?

ユーザー: 21132 です。

エージェント: 確認いたしました。11 月 27 日にご自宅に到着いたします。

ユーザー: 分かりました、ありがとう。

それでは、配達ステータスを追跡し、配達日を変更する目的で、Amazon Lex ボットを構築しましょう。CheckDeliveryStatus インテントは、追跡番号情報を引き出し、配達日を返します。ChangeDeliveryDate インテントは、配達日を新しい日付に更新します。本稿では、追跡番号と配達日でデータベースを管理しています。AWS Lambda 関数を使用して配達日を更新できます。

ボットで感情分析を有効にするには、次の手順を実行します:

  1. Amazon Lex コンソールで、該当のボットをクリックします
  2. [Settings] の中から [General] を選択します
  3. [Sentiment Analysis] では [Yes] を選択します
  4. [Build] をクリックして新規ビルドを作成します

ロジックを追加して応答を変更する

ボットをセットアップしたので、ユーザーの感情に反応するロジックを追加します。CheckDeliveryStatus 内のダイアログのコードフックは、感情スコアを検査します。否定的な感情のスコアが特定のしきい値を超えている場合、追跡番号の入力を求めるときに、「ご不便をおかけして申し訳ございません」などの謝辞を挿入できます。以下の Lambda コードスニペットをご覧ください:  

if (negativeSentimentVal > RESPONSE_THRESHOLD) {
    callback(
        intentHandler.elicitSlot(
            intentRequest.sessionAttributes,
            intentRequest.currentIntent.name,
            intentRequest.slots, "trackingNumber",
            intentHandler.constructMessage("Apologies for the inconvenience.What is your order id?" )
            )
        );
}

以下のイベントが Lambda 関数に渡されます:

{
    "messageVersion": "1.0",
    "invocationSource": "DialogCodeHook",
    "userId": "xxx",
    "sessionAttributes": {},
    "requestAttributes": null,
    "bot": {
        "name": "DeliveryBot",
        "alias": "$LATEST",
        "version": "$LATEST"
    },
    "outputDialogMode": "Text",
    "currentIntent": {
        "name": "CheckDeliveryStatus",
        "slots": {
            "trackingNumber": null
        },
        "slotDetails": {
            "trackingNumber": "trackingNumber"
        },
        "confirmationStatus": "None"
    },
    "inputTranscript": "When is my package arriving? It’s so late.",
    "recentIntentSummaryView": null,
    "sentimentResponse": {
        "sentimentLabel": "NEGATIVE",
        "sentimentScore": "{
            Positive: 0.005262882,
            Negative: 0.6347739,
            Neutral: 0.35993648,
            Mixed: 2.6722797E-5
        }"
    }
}

会話レベルで集計されたスコアを追跡することにより、複数の会話をまとめて分析することもできます。本稿では、各インテントにつき 1 つのエントリでデータベースを管理しています。テーブル内の会話ごとに各インテントの感情スコアの集計を保存し、この情報を使用して特定のインテントのパフォーマンスに関するインサイトを得ることができます。ユーザーまたはボットレベルで、感情を全体的に追跡することもできます。

引き継ぎを設定する

最後に、エージェントへの引き継ぎの設定を確認しましょう。ユーザーの感情が非常に否定的な場合に、このパスをトリガーできます: 「私宛の荷物はどこにありますか? 分からなくてイライラします」

Amazon Connect の問い合わせフローを使用して、引き継ぎを実行します。引き継ぎを開始するしきい値をさらに高く設定することもできます。AgentHandover インテントをボット定義に追加します。 否定的な感情がしきい値を超えている場合、ダイアログのコードフック Lambda で AgentHandover インテントをトリガーします。以下のスクリーンショットには、Amazon Connect の問い合わせフローが表示されています:

以下の Lambda コードスニペットがエージェントへの引き継ぎをトリガーします:

if (negativeSentimentVal > AGENT_HANDOVER_THRESHOLD) {
    callback(
        intentHandler.confirmIntent(
            intentRequest.sessionAttributes,
            "AgentHandover",
            intentRequest.slots,
            intentHandler.constructMessage("Apologies for the inconvenience.Would you like to speak to an agent?" )
            )
    );
}

まとめ

本稿では、ユーザーの感情を理解し、会話の流れを向上させる方法を説明しました。また、感情情報の分析を実行したり、人間のエージェントに通話を引き継いだりすることもできます。これらの手法をボットに組み込む方法の詳細については、ドキュメントを参照してください。


著者について

Anubhav Mishra は AWS のプロダクトマネージャーです。お客様を理解して製品エクスペリエンスを設計することに時間を惜しまず、ビジネスでの課題に取り組んでいます。

 

 

 

Kevin Cho は、Amazon AI のソフトウェア開発エンジニアです。Lex のユーザーエクスペリエンスの簡素化と改善に取り組んでいます。仕事以外では、シアトル周辺で新しい食べ物を見つけたり、友人や家族とバスケットボールをしたりして過ごしています。