Amazon Bedrock AgentCoreとAmazon Nova 2 Sonicでレストラン電話AIホストを構築する
この記事では、Amazon Bedrock AgentCoreとAmazon Nova 2 Sonicを使用して、挨拶から確認まで注文を処理する音声注文システムの構築方法を説明します。システムはModel Context Protocol(MCP)を介してレストランバックエンドに接続し、AWS CDKでデプロイし、ECS Fargate上のSIPゲートウェイで電話呼び出しをブリッジします。
レストランは拠点ごとに月平均150件の電話を取りこぼし、その約60%は注文や予約を試みる顧客からのものです。これらの電話のほとんどはディナーサービスの時間帯にかかってきて、まさにホストが客を席に案内し、サーバーがテーブルを回しているときで、電話は後回しにされます。フロアから誰かを引き抜いて電話に出ても問題は解決せず、むしろ両方の体験を悪化させます。アプリやウェブサイトを追加すればオンライン注文を好む顧客には役立ちますが、電話だけを使いたい人には何の助けにもなりません。
この記事では、電話番号に応答し、挨拶から確認まで注文を処理する音声注文システムの構築方法を紹介します。システムはAmazon Bedrock AgentCoreを使用してエージェントをホスト・実行し、Amazon Nova 2 Sonicでリアルタイム音声を処理し、Model Context Protocol(MCP)を介してレストランのバックエンドに接続します。手順では、AWS Cloud Development Kit(AWS CDK)を使用したフルスタックのデプロイと、Amazon Elastic Container Service(Amazon ECS)およびAWS Fargate上のSession Initiation Protocol(SIP)ゲートウェイを介した電話呼び出しのエージェントへのブリッジについて説明します。また、電話が鳴っている間にエージェントセッションをウォームアップするため、発信者は無音を聞くことがありません。
ソリューション概要 システムは3層で構成されます。テレフォニー層は電話固有の問題を処理します。音声はブラウザではなく電話ネットワークを介して到着し、システムはログインではなく電話番号で発信者を識別します。SIPゲートウェイは署名付きWebSocket接続を介してその音声をエージェント層にストリーミングし、エージェントはAmazon Nova 2 Sonicで会話を実行します。エージェントはMCPツールを介してバックエンド層にアクセスします。バックエンド層はメニュー、カート、注文、および場所を保持します。これらの層を分離することで、注文ロジックはチャネルから独立し、新しいチャネル(モバイルアプリやキオスクなど)はバックエンドを書き換えることなく同じエージェントに接続できます。MCPはエージェントを外部ツールに接続するためのオープンスタンダードであるため、バックエンドはエージェントに影響を与えずに変更できます。エージェントはテキストと音声の両方を入出力としてサポートし、単一の双方向ストリームで文字起こし、ターンテイキング、割り込みを処理します。
デプロイメントでは、テレフォニー側でAmazon Chime SDK Voice ConnectorがSIPトランクと着信を受け付けるフリーダイヤル番号を提供します。Amazon ECS on AWS FargateがSIPゲートウェイをNetwork Load Balancerの背後で実行します。エージェント層では、AgentCore Runtimeが会話ロジックをホストし、各コールは分離のために独自のmicroVMで実行されます。Amazon Nova 2 Sonicは音声間の対話を処理します。AgentCore GatewayはバックエンドAPIをエージェントが発見して名前で呼び出せるMCPツールとして公開します。バックエンド層はAmazon API Gatewayを使用してRESTエンドポイントを前面に置き、AWS Identity and Access Management(IAM)で保護します。AWS Lambdaはメニュー、カート、注文、場所検索のビジネスロジックを実行します。Amazon DynamoDBがデータを保存し、Amazon Location Serviceがジオコーディングとルート計算を処理します。Amazon Elastic Container Registry(Amazon ECR)、AWS CodeBuild、Amazon Simple Storage Service(Amazon S3)がエージェントコンテナイメージをビルドして保存します。
アーキテクチャ図 ソリューションは4つのセクションに分かれています。セクションAでレストランのバックエンドインフラをデプロイします。Amazon DynamoDBが顧客、注文、メニュー、カート、場所データを保持し、Amazon Location Serviceが住所とルーティングを処理し、AWS Lambdaがビジネスロジックを実行し、Amazon API GatewayがIAM認証で外部に公開します。セクションBはAgentCore Gatewayを作成し、IAM権限を設定し、バックエンドエンドポイントをエージェントがアクセス可能なMCPツールとして公開するように構成します。この層がエージェントとバックエンドを切り離します。セクションCはエージェントをプロビジョニングします。Amazon ECRリポジトリを作成し、Amazon S3とAWS CodeBuildを使用してコンテナイメージをビルドしてプッシュし、AgentCore Runtimeをデプロイします。また、各コールをパーソナライズするためのプロンプトレンダラーLambda関数と、プロンプトテンプレートと発信者識別用のシークレットを保持するAWS Systems Manager Parameter Storeエントリをデプロイします。セクションDは電話パスをプロビジョニングします。Amazon Chime SDK Voice Connectorとフリーダイヤル番号、着信の処理方法を決定するSIP Media Application Lambda、共有Amazon Virtual Private Cloud(Amazon VPC)、およびAmazon ECS on AWS Fargate上でNetwork Load Balancerの背後で動作するSIPゲートウェイ(drachtio-server)をセットアップします。ゲートウェイはChime SDK Voice ConnectorとAgentCore Runtime間のコールをブリッジします。
着信コールフロー 発信者がフリーダイヤル番号にダイヤルすると、Amazon Chime SDK Voice Connectorが応答し、SIP Media Application Lambdaを呼び出します。Lambdaはコールのセッション識別子を計算し、AgentCore Runtimeにウォームアップリクエストを送信して電話が鳴っている間にセッションを準備し、Voice ConnectorにコールをECS Fargate上のSIPゲートウェイにブリッジするよう指示し、セッション識別子を渡します。SIPゲートウェイは同じセッション識別子を使用してAgentCore RuntimeへのSigV4署名付きWebSocketを開き、コールはウォームアップされたセッションに接続されます。発信者の音声はエージェントに流れ、エージェントの音声は発信者に戻ります。エージェントはAmazon Nova 2 Sonicで会話を実行し、メニュー、カート、注文、場所データが必要な場合はAgentCore Gatewayを介してバックエンドツールを呼び出します。
前提条件として、AWSアカウント、デプロイリージョンでのAmazon Nova 2 Sonicのモデルアクセス、Amazon Chime SDK PSTN Audioアクセスと電話番号クォータ増加、Node.js 24.x以降、AWS CLI 2.x、git、およびAWS CDKのブートストラップが必要です。完全なソリューションはGitHubのサンプルリポジトリで利用可能です。リポジトリをクローンし、事前チェックスクリプトを実行した後、デプロイスクリプト(例:./scripts/deploy-all.sh --deploymentPrefix qsr-tel)で各スタックを順にデプロイします。スクリプトはサンプルのメニューと場所データをシードし、テスト用の電話番号を出力します。
SIPゲートウェイは、電話コールをエージェントが読み書きできるメディアストリームに変換します。Amazon Chime SDK Voice Connectorが着信を受け付け、SIP Media Application Lambdaを呼び出し、Lambdaがブリッジ指示を返します。SIPゲートウェイはECS Fargate上で動作し、drachtio-serverでSIPシグナリングを処理し、Node.jsブリッジで音声変換を行います。この設計により、エージェントは電話ネットワークの詳細を知る必要がなく、チャネル独立性が維持されます。