Amazon ConnectとAmazon Bedrock Agentsで作る電話応答・予約システム

1. はじめに
クリニック予約や宅配便の再配達受付などで電話をかけると、自動音声が流れて案内に従って予約したことがありますよね。
例えば、「1番は新規予約・・・2番は予約の変更・・・」と案内され、番号を押して予約を進めるIVRや、「診察日やご予約時間は・・・?」「配達希望日時は・・?」と順番に回答して予約が進むシステムなどがあります。
シンプルで便利なところはありますが、ちょっと融通を利かせたいときに困ることも多いです。質問の順番から外れたものや、あいまいな回答にはうまく対応できず、会話が途切れてしまうこともよくあります。その結果、不満を感じたりして予約をあきらめてしまうことも少なくないと思います。
もし人間のように自然な会話でやり取りできる相手なら、あいまいな希望や想定外の質問にも柔軟に対応してもらえ、スムーズでストレスの少ない予約体験ができるのでしょう。
この記事では、自然な会話ができるAIエージェントを活用した電話予約システムの作り方を紹介します。
Amazon ConnectとAmazon Bedrock Agentsを活用した電話予約システムに関するお問い合わせはこちら
2. AIエージェントを活用した電話予約システムの特徴
- 状況に応じた動的な回答生成
希望日時がすでに埋まっている場合には代替日時を提案したり、ユーザーが途中で内容変更しても会話の文脈を保持しながら予約を継続できるなど、人間のオペレーターと同等の柔軟性を備えています。
- 自然言語理解による意図の把握
ユーザーの発話を解析し、たとえば「時間がいつでもいい」などのあいまいな表現でも理解可能、文脈に基づいた質問や提案も生成できます。
- 会話文脈の維持とマルチターンの対話
過去の発話や予約状況を文脈として保持して会話を自然に続けられます。
- データベースやAPIの利活用判断
ユーザーのリクエストや会話内容を判断し、必要に応じて予約データやサービス情報をリアルタイムで参照しながら回答できます。
Amazon ConnectとAmazon Bedrock Agentsを活用した電話予約システムに関するお問い合わせはこちら
3. 構成
ここからは、実際の活用例として、家事代行サービスの電話予約システムを紹介します。
今回、以下の会話ログのように、地域や希望の時間帯をあいまいに伝えても、AIがスタッフの空き状況やスケジュールを確認し、自然にお客さまに案内して予約を完了させるシンプルな電話予約システムを作っていきます。

システムの構成は以下です。

Amazon ConnectとAmazon Lexが通話を受け付け、Bedrock Agentがユーザーの発話を解析します。
予約状況やスタッフ情報はDynamoDBで管理されており、Agentが会話内容に応じLambdaから情報を取得・更新しながらインタラクティブに回答します。
Amazon ConnectとAmazon Bedrock Agentsを活用した電話予約システムに関するお問い合わせはこちら
4. 実装方法
では、具体的にどうやってAI電話エージェントを構築するのか見ていきましょう。
4-1. データの準備
まずデータベースとして、DynamoDBにスタッフ情報と予約履歴のテーブルを用意します。
スタッフ情報には、名前や地域などのダミー情報を登録しておきます。
スタッフのダミーデータ(例):
+--------+--------+---------------+
| city | staff_id | name |
+--------+--------+---------------+
| 東京 | hs002 | 佐藤 美咲 |
| 東京 | hs003 | 鈴木 恵子 |
| 大阪 | hs007 | 渡辺 京子 |
| 大阪 | hs006 | 伊藤 智子 |
| 名古屋 | hs012 | 吉田 明美 |
| 名古屋 | hs009 | 小林 和子 |
| 大阪 | hs005 | 山田 真理子 |
| 名古屋 | hs010 | 松本 雅美 |
| 大阪 | hs008 | 中村 裕子 |
| 東京 | hs004 | 高橋 由美 |
| 名古屋 | hs011 | 森田 千恵 |
| 東京 | hs001 | 田中 花子 |
+--------+--------+---------------+
4-2. APIの作成
次にLambdaを使ってAPIを作成し、Bedrock Agentが時間の取得やスタッフ情報の参照、予約の登録のための処理を実装します。
Bedrock Agent参照用の処理(例):
# -------------------
# 時間取得
# -------------------
def get_current_time(event, context):
now = datetime.utcnow().isoformat()
return {
"statusCode": 200,
"body": json.dumps({"current_time": now})
}
# -------------------
# スタッフ情報
# -------------------
def get_staff(event, context):
staff_id = event['pathParameters']['staff_id']
response = staff_table.get_item(Key={'staff_id': staff_id})
item = response.get('Item', {})
return {
"statusCode": 200,
"body": json.dumps(item, default=decimal_default)
}
# -------------------
# 予約情報
# -------------------
def get_reservation(event, context):
reservation_id = event['pathParameters']['reservation_id']
response = reservation_table.get_item(Key={'reservation_id': reservation_id})
item = response.get('Item', {})
return {
"statusCode": 200,
"body": json.dumps(item, default=decimal_default)
}
def create_reservation(event, context):
body = json.loads(event['body'])
reservation_table.put_item(Item=body)
return {
"statusCode": 201,
"body": json.dumps({"message": "Reservation created"})
}
・・・
・・・
また、必要に応じてセッションを活用して会話の文脈管理や情報取得・更新を行います。
セッション管理用処理(例):
def handler(event, context):
・・・
・・・
elif api_path == "/create- reservation":
booking = create_ reservation (customer_id, post_params)
response_body = {"message": "Booking created", "body": booking}
# 会話文脈として予約IDを保持
additional_prompt_attributes["lastBookingId"] = booking["booking_id"]
・・・
session_attributes.update({"customerId": customer_id})
prompt_session_attributes.update(additional_prompt_attributes)
api_response = {
"messageVersion": "1.0",
"response": {
"actionGroup": event.get("actionGroup"),
"apiPath": api_path,
"httpMethod": event.get("httpMethod"),
"httpStatusCode": http_status,
"responseBody": {"application/json": {"body": response_body}},
},
"sessionAttributes": session_attributes,
"promptSessionAttributes": prompt_session_attributes,
}
4-3. AIエージェントの設定
Amazon BedrockからAIエージェントを設定します。
ここではモデルAmazon Nova Liteを使用します。Action groupは先ほど作成したLambda関数を選択します。

プロンプトを以下のように作成し、会話フローやどのタイミングでLambdaのAPIを呼ぶかなどを指示します。
指示が曖昧だと回答がかなりぶれるので、回答の範囲や形式を定めるようにしてください。
プロンプト:会話フローの制御(例)
・・・
1. サービス案内とご要望確認
「ありがとうございます。掃除、料理、洗濯、買い物代行などの家事代行サービスを承っております。いつ頃家政婦にお伺いさせていただきましょうか?」
うまくいかない場合は以下のように聞き直し
「申し訳ございません、よく聞き取れませんでした。ご希望の日時をもう一度教えていただけますでしょうか?」
・・・・
2. 住所確認と家政婦選択
「ご住所を教えていただけますでしょうか?お近くの家政婦をご案内いたします。」
住所を確認後、利用可能な家政婦を検索
「お近くの家政婦で、[選択された日付]に空いている方をお探しいたします。」
選択された日付に空きがある場合:
「[選択された日付]の空いている時間帯は・・・です。
どちらがよろしいでしょうか?」
・・・
3. 家政婦の確認とサービス詳細
日時が選択されたら:
「家政婦の[名前]さんが見つかりました。
[名前]さんを[日付]の[時間]でご予約しますか?それとも他の選択肢をお聞きになりますか?」
うまくいかない場合は以下のように聞き直し
「申し訳ございません、よく聞き取れませんでした。この方でご予約されますか、それとも他の選択肢をお聞きになりますか?」
・・・
サービス詳細を聞く:
「どのような作業をご希望か、詳しく教えていただけますでしょうか?予約に記載させていただきます。」
・・・・
4. 予約確認
「承知いたしました!家政婦[名前]さんとの[曜日][時間]のご予約が確定いたしました。[サービス内容の簡単な説明]でお伺いいたします。 当日にスタッフからご連絡が入ります。」
・・・
プロンプト:API参照ルールや注意事項など(例)
・・・
お客さまの要望に応じて、以下のLambda APIを使って情報を取得・更新・予約管理を行います。
getStaff
指定したスタッフ情報を取得する際に呼び出します。スタッフの名前、所在都市などを確認するのに使用します。
getReservation
指定したreservation_idの予約情報を取得する際に呼び出します。予約状況の確認や変更前の情報取得に使用します。
createReservation新しい予約を作成する際に呼び出します。お客さまに内容を確認した後、正確な予約情報を渡して実行してください。
・・・
## 会話ルール
1. お客さまの要望をヒアリングし、最適なスタッフと日時を提案してください。
2. 予約や情報更新の前には、必ずお客さまに要約して確認してください。
・・・
4-4. Amazon Lexの設定
Amazon LexからBedrockエージェントインテントを有効にして、ボット作成していきます。
IDとエイリアスは3章で作成したAgentを指定してください。

4-5. Amazon Contentコンタクトフローの設定
Amazon Contentコンタクトフローを作成して、4章のAmazon Lexが入力取得するように設定を行います。
フローを公開して、電話番号と紐づければ完了です。

Amazon ConnectとAmazon Bedrock Agentsを活用した電話予約システムに関するお問い合わせはこちら
5. 最後に
AIエージェントを使った電話予約の作り方についてご紹介しました。
自然な会話でスムーズに予約を進められる点や、非定型なリクエストや会話内容にも対応できる点が大きな魅力です。
柔軟さなどさすがに人間には及ばない部分もありますが、従来のIVRなどよりは十分に満足できる予約体験を提供できるでしょう。
一方、もちろん課題もあり、意図しない応答や誤解を避けるためには、フロー制御やフォールバックの設計が重要であり、複雑なプロンプト設計も欠かせないと思います。
また応答品質は状況によって変動するため、常に安定した体験を提供するには工夫が必要です。
今後はAIのさらなる発展、仕組みの改善を重ねることで、人間とほぼ同等の自然で信頼性の高い会話と期待できるでしょう。
皆さんもぜひ試してみてください・・!
Amazon ConnectとAmazon Bedrock Agentsを活用した電話予約システムに関するお問い合わせはこちら
RECOMMEND
その他のコラム
相談無料!プロが中立的にアドバイスいたします
クラウド・AWS・Azureでお困りの方はお気軽にご相談ください。






