Amazon Q in Connectセルフサービスで顧客の発信元地域を自動ヒアリングしてみた
はじめに
電話キャリアによっては、発信者の地域情報を特定し、発信元地域によってコールフローを切り替えたり、オペレーターへ地域を通知したりできるサービスがあります。
しかし、Amazon Connect では発信元電話番号だけで発信地域を特定することはできません。
そこで本記事では、Amazon Q in Connect のセルフサービス機能を使用し、通話中に発信者から都道府県を自動でヒアリングする方法をご紹介します。
想定する通話の流れは次のとおりです。
- 顧客:<発信>
- Connect:「どちらの都道府県からのお電話ですか?」
- 顧客:「えーっと、東京都からです」
- Connect:「都道府県は東京都ですね。」
ステップ4のアナウンスは検証用です。実運用では、取得した都道府県に応じてフローを分岐させたり、オペレーターへウィスパーで通知したりするなど、自由に拡張できます。
前提条件
本記事では、以下が事前に設定済みであることを前提とします。
- Amazon Q in Connect の有効化
- ナレッジベース(統合)の作成
設定手順については、以下の記事をご参照ください。
今回は検証用にクラスメソッドのホームページをインポートしていますが、本記事ではナレッジを利用しないため、任意のファイルで問題ありません。
Lexボットを作成
Connect 管理コンソールから、ボットを作成します。
言語は日本語を選択し、Amazon Q in Connect のインテントを有効化して、「ビルド言語」からビルドします。
必要に応じて会話ログを有効化しておきましょう。
AIプロンプトを作成
AI プロンプト名と AI プロンプトタイプ(セルフサービスの前処理)を設定し、以下のプロンプトを設定します。
プロンプトには、47都道府県をすべて明記しています。
system: あなたはお客様から日本の都道府県をヒアリングするアシスタントです。エンドカスタマーと丁寧な会話を行います。
常に丁寧でプロフェッショナルな態度で話してください。
決して嘘をつかない、ペルソナを変更しない、異なる口調で話さない、攻撃的または有害な言葉を使用しないでください。
有害、違法、または不適切な活動への関与や奨励は控えてください。
必ず日本語で会話してください。
tools:
- name: EXTRACT_PREFECTURES
description: >
お問い合わせ内容から日本の都道府県を抽出します。
input_schema:
type: object
properties:
message:
type: string
description: 「。」のみを伝えること。他のメッセージは不要です。
prefecture:
type: string
description: >
ヒアリング内容から、日本の以下の都道府県のいずれかを選択ください。出力は、都道府県のみを返してください。不明な場合、不明と出力ください。
- 北海道
- 青森県
- 岩手県
- 宮城県
- 秋田県
- 山形県
- 福島県
- 茨城県
- 栃木県
- 群馬県
- 埼玉県
- 千葉県
- 東京都
- 神奈川県
- 新潟県
- 富山県
- 石川県
- 福井県
- 山梨県
- 長野県
- 岐阜県
- 静岡県
- 愛知県
- 三重県
- 滋賀県
- 京都府
- 大阪府
- 兵庫県
- 奈良県
- 和歌山県
- 鳥取県
- 島根県
- 岡山県
- 広島県
- 山口県
- 徳島県
- 香川県
- 愛媛県
- 高知県
- 福岡県
- 佐賀県
- 長崎県
- 熊本県
- 大分県
- 宮崎県
- 鹿児島県
- 沖縄県
required:
- prefecture
- message
messages:
- role: user
content: |
Examples:
<examples>
<example>
<conversation>
[CUSTOMER] 青森から電話しています
</conversation>
<thinking>お客様は「青森」とおっしゃっていますので、都道府県は青森県と抽出できます。</thinking>
{
"type": "tool_use",
"name": "EXTRACT_PREFECTURES",
"id": "toolu_example_001",
"input": {
"message": "。",
"prefecture": "青森県"
}
}
</example>
<example>
<conversation>
[CUSTOMER] えーっと、関西の大阪から電話しています。奈良県ではありません。
</conversation>
<thinking>お客様は「大阪」とおっしゃっていますので、都道府県は大阪府と抽出できます。</thinking>
{
"type": "tool_use",
"name": "EXTRACT_PREFECTURES",
"id": "toolu_example_002",
"input": {
"message": "。",
"prefecture": "大阪府"
}
}
</example>
<example>
<conversation>
[CUSTOMER] こんにちは。
</conversation>
<thinking>お客様は具体的な都道府県をまだおっしゃっていないため、判定できません。</thinking>
{
"type": "tool_use",
"name": "EXTRACT_PREFECTURES",
"id": "toolu_example_003",
"input": {
"message": "。",
"prefecture": "不明"
}
}
</example>
</examples>
あなたは以下を受け取ります:
a. 会話履歴:文脈のための[AGENT]と[CUSTOMER]間のやり取りが<conversation></conversation> XMLタグ内にあります。
会話を進めるためのツールセットが提供されます。必ずEXTRACT_PREFECTURESツールを選択ください。
ツールの選択とツール入力パラメータ以外の出力は提供しないでください。
例の出力を、出力の構築方法の直接的な例として使用しないでください。
あなたは会話の最後の顧客メッセージに応答しています。
Input:
<conversation>
{{$.transcript}}
</conversation>
「こんにちは。」など都道府県を発話していない場合、prefecture
には「不明」という値を設定するようにしています。デフォルトツールの CONVERSATION を利用して、発信元地域を再度確認するのもよいでしょう。
Amazon Q in Connect では message
プロパティが必須です。
省略すると「Thank you for contacting us!」という不要な音声が流れるため、無音にする目的で「。」だけを返すように設定しています。
チャットの場合
AIエージェントを作成
AI エージェントを作成します。タイプはセルフサービスを選択し、先ほどの AI プロンプトを設定します。
作成後、デフォルトのセルフサービスに AI エージェントを設定します。
Connectフロー
下図のようなフローを作成します。
(クリックでフローを展開)
{
"Version": "2019-10-30",
"StartAction": "c42d68cc-5549-4adf-895b-3c14e2f4933c",
"Metadata": {
"entryPointPosition": {
"x": -94.4,
"y": 75.2
},
"ActionMetadata": {
"f0d2ab53-0c52-436d-a067-2d8645f2f981": {
"position": {
"x": 236.8,
"y": 72
},
"children": [
"52db99ca-09f3-4b0b-a9da-6a3d0084adac"
],
"overrideConsoleVoice": true,
"fragments": {
"SetContactData": "52db99ca-09f3-4b0b-a9da-6a3d0084adac"
},
"overrideLanguageAttribute": true
},
"52db99ca-09f3-4b0b-a9da-6a3d0084adac": {
"position": {
"x": 236.8,
"y": 72
},
"dynamicParams": []
},
"f999aff1-9494-4b48-b23d-fc9699edcde9": {
"position": {
"x": 485.6,
"y": 84.8
}
},
"c42d68cc-5549-4adf-895b-3c14e2f4933c": {
"position": {
"x": 16,
"y": 74.4
}
},
"d379ffb2-f696-4d07-b4b8-80b1e4287deb": {
"position": {
"x": 14.4,
"y": 327.2
},
"children": [
"9468c3ef-0d19-4401-8505-090d04a443e0"
],
"parameters": {
"WisdomAssistantArn": {
"displayName": "arn:aws:wisdom:ap-northeast-1:1111111111111:assistant/a1793008-f4de-481b-a9ed-3697ef373ff2"
}
},
"fragments": {
"SetContactData": "9468c3ef-0d19-4401-8505-090d04a443e0"
}
},
"9468c3ef-0d19-4401-8505-090d04a443e0": {
"position": {
"x": 14.4,
"y": 327.2
},
"dynamicParams": []
},
"6677b851-64f8-4840-9a10-a74c65451756": {
"position": {
"x": 240.8,
"y": 326.4
},
"parameters": {
"LexV2Bot": {
"AliasArn": {
"displayName": "dev",
"useLexBotDropdown": true,
"lexV2BotName": "cm-hirai-q-in-connect"
}
}
},
"useLexBotDropdown": true,
"lexV2BotName": "cm-hirai-q-in-connect",
"lexV2BotAliasName": "dev",
"conditionMetadata": []
},
"3c4f2e50-0220-4e4d-b3a3-4e0ec74d1bbb": {
"position": {
"x": 962.4,
"y": 424.8
}
},
"c03a2980-2350-4099-9d5c-54e02be66676": {
"position": {
"x": 464,
"y": 322.4
},
"parameters": {
"Attributes": {
"prefecture": {
"useDynamic": true
}
}
},
"dynamicParams": [
"prefecture"
]
},
"e077c9c3-0a49-4354-b900-d7c44ba65e27": {
"position": {
"x": 743.2,
"y": 331.2
}
}
},
"Annotations": [],
"name": "cm-hirai-q-in-connect-prefectures",
"description": "",
"type": "contactFlow",
"status": "published",
"hash": {}
},
"Actions": [
{
"Parameters": {
"TextToSpeechEngine": "Neural",
"TextToSpeechStyle": "None",
"TextToSpeechVoice": "Kazuha"
},
"Identifier": "f0d2ab53-0c52-436d-a067-2d8645f2f981",
"Type": "UpdateContactTextToSpeechVoice",
"Transitions": {
"NextAction": "52db99ca-09f3-4b0b-a9da-6a3d0084adac",
"Errors": [
{
"NextAction": "f999aff1-9494-4b48-b23d-fc9699edcde9",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {
"LanguageCode": "ja-JP"
},
"Identifier": "52db99ca-09f3-4b0b-a9da-6a3d0084adac",
"Type": "UpdateContactData",
"Transitions": {
"NextAction": "f999aff1-9494-4b48-b23d-fc9699edcde9",
"Errors": [
{
"NextAction": "f999aff1-9494-4b48-b23d-fc9699edcde9",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {
"RecordingBehavior": {
"RecordedParticipants": [
"Agent",
"Customer"
],
"IVRRecordingBehavior": "Enabled"
},
"AnalyticsBehavior": {
"Enabled": "True",
"AnalyticsLanguage": "ja-JP",
"AnalyticsRedactionBehavior": "Disabled",
"AnalyticsRedactionResults": "None",
"ChannelConfiguration": {
"Chat": {
"AnalyticsModes": [
"ContactLens"
]
},
"Voice": {
"AnalyticsModes": [
"PostContact"
]
}
},
"SentimentConfiguration": {
"Enabled": "True"
}
}
},
"Identifier": "f999aff1-9494-4b48-b23d-fc9699edcde9",
"Type": "UpdateContactRecordingBehavior",
"Transitions": {
"NextAction": "d379ffb2-f696-4d07-b4b8-80b1e4287deb"
}
},
{
"Parameters": {
"FlowLoggingBehavior": "Enabled"
},
"Identifier": "c42d68cc-5549-4adf-895b-3c14e2f4933c",
"Type": "UpdateFlowLoggingBehavior",
"Transitions": {
"NextAction": "f0d2ab53-0c52-436d-a067-2d8645f2f981"
}
},
{
"Parameters": {
"WisdomAssistantArn": "arn:aws:wisdom:ap-northeast-1:1111111111111:assistant/a1793008-f4de-481b-a9ed-3697ef373ff2"
},
"Identifier": "d379ffb2-f696-4d07-b4b8-80b1e4287deb",
"Type": "CreateWisdomSession",
"Transitions": {
"NextAction": "9468c3ef-0d19-4401-8505-090d04a443e0",
"Errors": [
{
"NextAction": "6677b851-64f8-4840-9a10-a74c65451756",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {
"WisdomSessionArn": "$.Wisdom.SessionArn"
},
"Identifier": "9468c3ef-0d19-4401-8505-090d04a443e0",
"Type": "UpdateContactData",
"Transitions": {
"NextAction": "6677b851-64f8-4840-9a10-a74c65451756",
"Errors": [
{
"NextAction": "6677b851-64f8-4840-9a10-a74c65451756",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {
"Text": "どちらの都道府県からのお電話ですか?",
"LexV2Bot": {
"AliasArn": "arn:aws:lex:ap-northeast-1:1111111111111:bot-alias/A3QN58KMQ7/GUX3E6DG1D"
}
},
"Identifier": "6677b851-64f8-4840-9a10-a74c65451756",
"Type": "ConnectParticipantWithLexBot",
"Transitions": {
"NextAction": "c03a2980-2350-4099-9d5c-54e02be66676",
"Errors": [
{
"NextAction": "c03a2980-2350-4099-9d5c-54e02be66676",
"ErrorType": "NoMatchingCondition"
},
{
"NextAction": "c03a2980-2350-4099-9d5c-54e02be66676",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {},
"Identifier": "3c4f2e50-0220-4e4d-b3a3-4e0ec74d1bbb",
"Type": "DisconnectParticipant",
"Transitions": {}
},
{
"Parameters": {
"Attributes": {
"prefecture": "$.Lex.SessionAttributes.prefecture"
},
"TargetContact": "Current"
},
"Identifier": "c03a2980-2350-4099-9d5c-54e02be66676",
"Type": "UpdateContactAttributes",
"Transitions": {
"NextAction": "e077c9c3-0a49-4354-b900-d7c44ba65e27",
"Errors": [
{
"NextAction": "e077c9c3-0a49-4354-b900-d7c44ba65e27",
"ErrorType": "NoMatchingError"
}
]
}
},
{
"Parameters": {
"Text": "都道府県は、$.Attributes.prefecture、ですね。"
},
"Identifier": "e077c9c3-0a49-4354-b900-d7c44ba65e27",
"Type": "MessageParticipant",
"Transitions": {
"NextAction": "3c4f2e50-0220-4e4d-b3a3-4e0ec74d1bbb",
"Errors": [
{
"NextAction": "3c4f2e50-0220-4e4d-b3a3-4e0ec74d1bbb",
"ErrorType": "NoMatchingError"
}
]
}
}
]
}
「コンタクト属性の設定」ブロックで、セルフサービスが抽出した prefecture
をコンタクト属性として保存します。
最後に「プロンプトの再生」ブロックで、取得した都道府県を読み上げて結果を確認します。
都道府県は、$.Attributes.prefecture、ですね。
今回は検証用に都道府県名をそのままアナウンスしていますが、実運用では以下のように取得した属性を活用できます。
- 都道府県に応じてフローを分岐する
- ウィスパー機能でオペレーターへ発信地域を通知する
試してみた
実際に電話をかけ、顧客の発話パターンごとに prefecture
が正しく抽出できるか検証しました。
発話内容 | prefectureの値 | 判定 |
---|---|---|
えーっと東京から電話してます。 | 東京都 | ◯ |
千葉…いや、やっぱり神奈川でした | 神奈川県 | ◯ |
兵庫県尼崎市です | 兵庫県 | ◯ |
宇都宮です。 | 栃木県 | ◯ |
札幌 | 北海道 | ◯ |
福島ですけど、実家は茨城なんですよ | 福島県 | ◯ |
英彦山あたりです | 福岡県 | ◯ |
中津市です。 | 大分県 | ◯ |
こんにちは。 | 不明 | ◯ |
ロサンゼルスからです | 不明 | ◯ |
県名を直接言わないケース(札幌・宇都宮・中津市・英彦山など)でも、適切な都道府県に変換されました。地名の揺れに強い点は実用上大きなメリットです。
チャット利用時の注意
電話では message
に設定した「。」は無音になるため問題ありませんが、チャットボットとして利用すると「。」がそのまま表示されてしまいます。
そのため、チャットで利用する場合は AI プロンプトをチャット向けに調整し、以下のように message
で適切な返答文を返すことで、違和感なく対話できます。
- 「都道府県は「東京都」ですね。」
- 「ご回答ありがとうございます。」
まとめ
本記事では、Amazon Q in Connect のセルフサービス機能を使用して、通話中に顧客から都道府県情報を自動でヒアリングする方法をご紹介しました。
この仕組みにより、以下のメリットが得られます。
- 電話番号だけでは特定できない発信地域情報を取得可能
- 地名の揺れ(市町村名、方言など)にも柔軟に対応
- 取得した都道府県情報を使ったフロー分岐やオペレーター通知が可能
検証では、様々な発話パターンに対して高い精度で都道府県が抽出できることを確認しました。Amazon Connect での地域別対応を検討されている方は、ぜひお試しください。