Amazon Connect Customer AIエージェントでデータテーブルから問い合わせ種別を取得してフロー分岐してみた
はじめに
Amazon Connect Customer AIエージェントでお客様からの質問に回答した後、会話内容を問い合わせ種別に分類し、後続の問い合わせフローで分岐させたいケースがあります。
問い合わせ種別をAIエージェントのプロンプトやツールの入力スキーマへ直接定義する方法もありますが、問い合わせ種別を変更するたびにAIエージェントの設定変更が必要になります。
今回は、問い合わせ種別と分類用の例をAmazon Connect Customerのデータテーブルで管理し、AIエージェントからフローモジュールツールとして取得する構成を試しました。
また、AIエージェントが選択した問い合わせ種別をお客様へ発話せずに問い合わせフローへ渡し、AIエージェントとの会話を終了するため、カスタムReturn to Controlツールを使用しています。
Return to Controlを含むAIエージェントのツールタイプについては、以下の記事で整理しています。
今回の構成ではAWS Lambdaを使用せず、Amazon Connect Customerの標準機能で以下を実現します。
- 問い合わせ種別と分類例をデータテーブルで管理する
- フローモジュールツールから問い合わせ種別候補を取得する
- AIエージェントが会話内容に近い問い合わせ種別を選択する
- 分類結果をお客様へ発話せず、問い合わせフローへ渡す
- 問い合わせフローで分類結果をコンタクト属性へ設定する
- コンタクト属性に応じて後続処理を分岐する
- AIエージェントのデフォルトプロンプトは変更しない
今回の構成
今回作成する主なリソースは以下です。
| リソース | 名前 | 用途 |
|---|---|---|
| データテーブル | InquiryCategoryMaster |
問い合わせ種別と分類例を管理する |
| フローモジュール | GetInquiryCategories |
データテーブルから問い合わせ種別候補を取得して返す |
| AIエージェント | SelfServiceOrchestrator-GetInquiryCategories |
お客様への回答と問い合わせ種別の分類を行う |
| フローモジュールツール | GetInquiryCategories |
フローモジュールをAIエージェントから呼び出す |
| Return to Controlツール | CompleteInquiryClassification |
分類結果を問い合わせフローへ渡し、AIエージェントとの会話を終了する |
| 問い合わせフロー | cm-hirai-SelfServiceOrchestration-GetInquiryCategories |
分類結果をコンタクト属性へ設定して分岐する |
処理の流れは以下です。
お客様とAIエージェントが会話する
↓
AIエージェントが必要に応じてRetrieveツールを呼び出して回答する
↓
お客様側で質問がなくなったとAIエージェントが判断する
↓
GetInquiryCategoriesツールを呼び出す
↓
フローモジュール内の「データテーブル」ブロックが
InquiryCategoryMasterから問い合わせ種別候補を取得する
↓
フローモジュールの「戻る」ブロックが取得結果をAIエージェントへ返す
↓
AIエージェントが会話内容に近いinquiryTypeNameを選択する
↓
CompleteInquiryClassificationツールを呼び出す
↓
inquiryTypeNameをAmazon Lexセッション属性として問い合わせフローへ渡す
↓
AIエージェントとの会話を終了し、問い合わせフローへ制御を戻す
↓
問い合わせフローでinquiryTypeNameをコンタクト属性へ設定する
↓
inquiryTypeNameに応じて後続処理を分岐する
GetInquiryCategoriesとCompleteInquiryClassificationは、それぞれ異なる役割を持ちます。
GetInquiryCategoriesはデータテーブルから問い合わせ種別候補を取得します。CompleteInquiryClassificationは、AIエージェントが選択したinquiryTypeNameを問い合わせフローへ渡し、AIエージェントとの会話を終了します。
前提
今回は以下を前提とします。
- Amazon Connect Customerインスタンスを作成済み
- Amazon Connect Customer AIエージェントを利用できる状態
- AIエージェントから参照するナレッジベースを作成済み
- セルフサービス用のAmazon Lexボットを作成済み
- 検証リージョンは
ap-northeast-1 - AIエージェントのプロンプトは
SelfServiceOrchestrationVoiceのデフォルト設定を利用する Retrieveツールはデフォルト設定のまま利用する
本記事では、ナレッジベース、Amazon Lexボット、Retrieveツールの作成手順については扱いません。
データテーブルを作成する
InquiryCategoryMasterという名前でデータテーブルを作成しました。
データテーブルには以下の2つの属性を定義します。
| 属性名 | タイプ | プライマリ属性 | 用途 |
|---|---|---|---|
inquiryTypeName |
テキスト | 使用する | 問い合わせ種別名 |
examples |
テキスト | 使用しない | 分類判断に使用する例 |
inquiryTypeNameは各レコードを一意に識別するため、プライマリ属性として使用します。
examplesには、AIエージェントが分類時に参照する例をカンマ区切りのテキストで登録しました。今回は個々の例をフロー内で処理する必要がないため、テキストリストではなく通常のテキストを使用しています。
登録したレコードは以下です。
inquiryTypeName |
examples |
|---|---|
| その他 | 担当部署不明, 上記に該当しない問い合わせ |
| アカウント | ログインできない, パスワード忘れ, メールアドレス変更 |
| 契約 | 解約, プラン変更, 契約内容確認, 名義変更 |
| 技術サポート | ネットにつながらない, エラーが出る, アプリが起動しない |
| 請求 | 支払い遅延, 請求書再発行, 請求金額確認, 支払い方法変更 |

InquiryCategoryMasterに問い合わせ種別と分類例を登録した状態
examplesは完全一致条件ではなく、AIエージェントが会話内容に近いinquiryTypeNameを判断するための参考情報として使用します。
データテーブルの作成方法については、以下のドキュメントも参考になります。
GetInquiryCategoriesフローモジュールを作成する
データテーブルから問い合わせ種別候補を取得するため、GetInquiryCategoriesというフローモジュールを作成します。
フローモジュールは、以下の2つのブロックで構成しています。
データテーブル
↓
戻る

データテーブルの取得結果を返すGetInquiryCategoriesフローモジュール
フローモジュールは、問い合わせフローから呼び出すだけでなく、AIエージェントのツールとして使用できます。フローモジュールをツールとして使用する場合も、「データテーブル」ブロックを利用できます。
フローモジュールの入出力を設定する
今回のフローモジュールは、常にInquiryCategoryMasterの全レコードを取得します。
そのため、フローモジュールの入力は空にして、入力パラメータは定義しません。
出力スキーマは以下のように設定します。
{
"type": "object",
"properties": {
"default": {
"type": "array",
"items": {
"type": "object"
}
}
},
"required": [
"default"
]
}
データテーブルの取得結果は、primaryKeyGroups配下のdefaultに格納されます。
今回のフローモジュールではprimaryKeyGroupsをそのまま返すため、出力スキーマのルートプロパティをdefaultとしています。
「データテーブル」ブロックを設定する
「データテーブル」ブロックでは、InquiryCategoryMasterの全レコードを取得します。
設定値は以下です。
| 設定項目 | 設定値 |
|---|---|
| アクション | データテーブルから読み取る |
| 読み取りアクション | データテーブル値を一覧表示する |
| データテーブル | InquiryCategoryMaster |
| プライマリ値グループ | 指定しない |

InquiryCategoryMasterの全レコードを一覧取得する設定
プライマリ値グループを指定しない場合、データテーブル全体が取得され、結果はdefaultグループから参照できます。
データテーブルブロックについては、以下のドキュメントも参考になります。
「戻る」ブロックを設定する
「戻る」ブロックでは、「データテーブル」ブロックの取得結果を動的に設定します。
設定値は以下です。
| 設定項目 | 設定値 |
|---|---|
| 出力 | 動的に設定 |
| 名前空間 | データテーブルリスト |
| キー | 結果データ |
| 属性 | primaryKeyGroups |

データテーブルリストのprimaryKeyGroupsをフローモジュールの出力に設定した状態
この設定は、JSONPathでは以下の値に相当します。
$.DataTableList.ResultData.primaryKeyGroups
.defaultまで指定せず、primaryKeyGroupsを指定しているのは、フローモジュールの出力スキーマが以下のようなオブジェクトを受け取るためです。
{
"default": [
{
"primaryKeys": [],
"attributes": []
}
]
}
フローモジュールのバージョンを作成する
設定が完了したら、フローモジュールを保存して公開します。
その後、AIエージェントのフローモジュールツールから指定するため、GetInquiryCategoriesフローモジュールのバージョンを作成します。
フローモジュールでは変更内容を追跡するためのバージョンを作成でき、フローやツールから特定のバージョンを参照できます。
以降のツール設定では、ここで作成したフローモジュールのバージョンを選択します。
AIエージェントを作成する
AIエージェント管理画面から、オーケストレーション用のAIエージェントを作成します。
今回のAIエージェント名は以下です。
SelfServiceOrchestrator-GetInquiryCategories

問い合わせ種別の取得と分類に使用するAIエージェント
今回、AIエージェントのプロンプトはSelfServiceOrchestrationVoiceのデフォルトプロンプトから変更していません。
Retrieveツールについてもデフォルト設定のまま利用し、問い合わせ分類に関する動作は、これから追加する2つのツールに設定します。
| ツール名 | ツールタイプ | 役割 |
|---|---|---|
GetInquiryCategories |
フローモジュール | データテーブルから問い合わせ種別候補を取得する |
CompleteInquiryClassification |
Return to Control | 分類結果を問い合わせフローへ渡し、会話を終了する |
GetInquiryCategoriesツールを追加する
AIエージェントにフローモジュールツールを追加し、作成したGetInquiryCategoriesフローモジュールを指定します。
設定値は以下です。
| 設定項目 | 設定値 |
|---|---|
| ツール名 | GetInquiryCategories |
| ツールタイプ | フローモジュール |
| フローモジュール | GetInquiryCategories |
| バージョン | 作成したフローモジュールのバージョン |
| 指示 | お客様側で質問がなくなった、または追加の質問がないと判断できる場合に呼び出してください。 |

GetInquiryCategoriesフローモジュールをAIエージェントのツールとして追加した状態
フローモジュール側の入力は空であるため、GetInquiryCategoriesツールを呼び出す際の入力値はありません。
ツールを実行すると、フローモジュールの「戻る」ブロックで設定したデータテーブルの取得結果がAIエージェントへ返されます。実際の取得結果については、後述の動作確認で確認します。
CompleteInquiryClassificationツールを追加する
次に、ツールタイプがReturn to Controlのカスタムツールを追加します。
設定値は以下です。
| 設定項目 | 設定値 |
|---|---|
| ツール名 | CompleteInquiryClassification |
| ツールタイプ | Return to Control |

問い合わせ種別を問い合わせフローへ渡すCompleteInquiryClassificationツール
入力スキーマは以下です。
{
"type": "object",
"properties": {
"inquiryTypeName": {
"type": "string",
"description": "GetInquiryCategoriesの取得結果に含まれる問い合わせ種別名。取得結果に含まれる値をそのまま使用する。"
}
},
"required": [
"inquiryTypeName"
]
}
ツールの指示文は以下です。
GetInquiryCategories の取得結果から inquiryTypeName を1つ選択した後に呼び出してください。
inquiryTypeName には、取得結果に含まれる値をそのまま設定してください。
お客様に分類名や分類理由を伝えずに、このツールを呼び出して会話を終了してください。
たとえば、請求に関する問い合わせと判断された場合は、内部的に以下の値でCompleteInquiryClassificationが呼び出されます。
{
"inquiryTypeName": "請求"
}
Return to Controlツールが呼び出されると、AIエージェントとの会話が終了して問い合わせフローへ制御が戻ります。ツール名と入力パラメータはAmazon Lexセッション属性へ格納され、問い合わせフローから参照できます。
カスタムReturn to Controlツールの作成方法については、以下のドキュメントも参考になります。
Return to Controlツールの具体的な作成手順については、以下の記事も参照してください。
2つのツールを追加したら、AIエージェントを保存してバージョンを作成します。問い合わせフローからは、ここで作成したAIエージェントのバージョンを利用します。
問い合わせフローを設定する
今回作成した問い合わせフローは以下です。

AIエージェントとの会話終了後に問い合わせ種別をコンタクト属性へ設定して分岐する問い合わせフロー
この記事では、AIエージェントとの会話が終了した後の設定を中心に説明します。
Return to Controlツール名を確認する
「顧客の入力を取得する」ブロックのデフォルト出力の後に、「コンタクト属性を確認する」ブロックを配置します。
設定値は以下です。
| 設定項目 | 設定値 |
|---|---|
| 確認する属性 | Lex |
| キー | セッション属性 |
| セッション属性キー | Tool |
| 条件 | CompleteInquiryClassificationと等しい |

Lexセッション属性のToolがCompleteInquiryClassificationであることを確認する設定
確認している値は以下です。
$.Lex.SessionAttributes.Tool
CompleteInquiryClassificationが呼び出された場合、この値にはReturn to Controlツール名であるCompleteInquiryClassificationが格納されます。
ここでは、フローモジュールツール名のGetInquiryCategoriesではなく、問い合わせフローへ制御を戻したReturn to Controlツール名を確認します。
inquiryTypeNameをコンタクト属性へ設定する
ToolがCompleteInquiryClassificationだった場合、「コンタクト属性の設定」ブロックへ進みます。
設定値は以下です。
| 設定項目 | 設定値 |
|---|---|
| 保存先 | 現在のコンタクト |
| 送信先キー | inquiryTypeName |
| 値の名前空間 | Lex |
| キー | セッション属性 |
| セッション属性キー | inquiryTypeName |

Lexセッション属性のinquiryTypeNameをユーザー定義のコンタクト属性へ設定した状態
Return to Controlツールの入力パラメータは、以下のAmazon Lexセッション属性から参照します。
$.Lex.SessionAttributes.inquiryTypeName
これをユーザー定義のコンタクト属性へ設定すると、後続のブロックでは以下から参照できます。
$.Attributes.inquiryTypeName
問い合わせ種別で分岐する
「コンタクト属性を確認する」ブロックを配置し、ユーザー定義のinquiryTypeNameを確認します。
今回設定した条件は以下です。
請求契約技術サポートアカウントその他

ユーザー定義のinquiryTypeNameに応じて後続処理を分岐する設定
検証用の問い合わせフローでは、分類結果を確認するため、各分岐で以下のメッセージを再生するようにしています。
inquiryTypeName |
再生するメッセージ |
|---|---|
| 請求 | 請求の話題です。 |
| 契約 | 契約の話題です。 |
| 技術サポート | 技術サポートの話題です。 |
| アカウント | アカウントの話題です。 |
| その他 | その他の話題です。 |
| 一致なし | 一致しない |
実運用では、各メッセージブロックを「作業キューの設定」や「キューへ転送」などの処理に置き換えます。
動作確認
以下は、実際の検証ログから抜粋した内容をもとに記載します。
やりとりの流れ
お客様は以下のように問い合わせました。
請求方法を教えてください
AIエージェントは以下のように応答しました。
請求方法についてのご質問ですね。確認させていただきます。
続けてAIエージェントはRetrieveツールを呼び出し、以下の検索クエリでナレッジベースを検索しました。
{
"assistantId": "d28ddb7e-edee-4655-a8d3-02cf659d80f6",
"retrievalQuery": "請求方法 支払い方法"
}
assistantIdは、今回の検証環境で使用したAIアシスタントを識別するIDです。
検索結果を踏まえ、AIエージェントは以下の回答をお客様へ発話しました。
クラスメソッドメンバーズの請求方法についてですね。日本円建ての請求書払いが基本です。クレジットカード支払いにも対応しており、その場合は割引率が四パーセントになります。請求サイクルは月末締めの翌月末支払いです。ご不明な点はございますか。
お客様は以下のように応答しました。
ありがとうございました。解決できました。
問い合わせ種別の分類
お客様の発話を受けて、AIエージェントは以下のように判断し、GetInquiryCategoriesを呼び出しました。
お客様が解決できたとおっしゃっているので、この会話は終了に向かっています。お客様側で質問がなくなったと判断できるので、GetInquiryCategories を呼び出して問い合わせ種別を取得し、その後 CompleteInquiryClassification で分類を完了する必要があります。
ログを確認すると、GetInquiryCategoriesの取得結果には、InquiryCategoryMasterに登録した5件のレコードが含まれていました。
実際の取得結果は以下です。一部のレコードのみ抜粋しています。
{
"default": [
{
"primaryKeys": [
{
"attributeName": "inquiryTypeName",
"attributeValue": "請求"
}
],
"attributes": [
{
"attributeName": "examples",
"attributeValue": "支払い遅延, 請求書再発行, 請求金額確認, 支払い方法変更",
"useDefault": false
}
]
},
{
"primaryKeys": [
{
"attributeName": "inquiryTypeName",
"attributeValue": "その他"
}
],
"attributes": [
{
"attributeName": "examples",
"attributeValue": "担当部署不明, 上記に該当しない問い合わせ",
"useDefault": false
}
]
}
]
}
この結果から、フローモジュールの出力に含まれるdefault配下の各要素が、primaryKeysとattributesで構成されていることを確認できました。
inquiryTypeNameはprimaryKeys、分類時に参照する例はattributes内のexamplesとして返されていました。
AIエージェントは取得結果を踏まえ、以下のように判断しました。
お客様は請求方法についてのご質問で、その内容は解決したとのことです。GetInquiryCategories の結果から、このお問い合わせは「請求」カテゴリに該当します。
取得結果に含まれる inquiryTypeName は「請求」です。これを CompleteInquiryClassification に渡して会話を終了します。
最終的に、AIエージェントは以下の入力値でCompleteInquiryClassificationを呼び出しました。
{
"inquiryTypeName": "請求"
}
ログ上、CompleteInquiryClassificationの呼び出し以降にお客様への発話は記録されておらず、選択したinquiryTypeNameがお客様へ伝えられていないことを確認できました。
今回の検証ログから、データテーブルの問い合わせ種別候補をもとにAIエージェントが会話内容を分類し、その結果をお客様へ発話せずにReturn to Controlツールへ渡したことを確認できました。
まとめ
Amazon Connect Customer AIエージェントからフローモジュールツールを呼び出し、データテーブルで管理している問い合わせ種別候補を取得できました。
AIエージェントが選択した問い合わせ種別は、カスタムReturn to Controlツールの入力パラメータとして渡すことで、お客様へ発話せずに問い合わせフローから参照できます。
この構成により、問い合わせ種別と分類例をデータテーブルで管理しながら、AIエージェントによる分類結果を後続の問い合わせフローで扱えることを確認できました。







