Amazon Connect + Amazon Bedrock AgentCoreでチャットボットを構築する

はじめに

 

おはようございますからこんばんわまで。ギークフィードのaraoです。

Amazon Connect アドベントカレンダー 2025 10日目のブログです。

AWS re:Invent 2025でAmazon Bedrock AgentCoreのアップデートがいっぱいありましたね。
今回は、Amazon ConnectとAmazon Bedrock AgentCoreを組み合わせることで、 Amazon Bedrock Knowledge Basesと連携したチャットボットを構築してみました。
本記事では、Amazon ConnectのCreateParticipant APIを使用してLambdaをチャットの会話に参加させることで、Amazon Lexを利用せずにチャットボットを構築します。

 

最初に結論

 

世の中に記事がなかったので実装してみましたが、今回の実装だと使い勝手があまり良くない点と制約事項が多い点から本番環境での提供は難しいかなというのが正直な印象です。
ブラッシュアップしていないこともあり、Amazon ConnectのチャットとAmazon Bedrock AgentCoreの連携が必須という要件以外は、Streamlitなどを使って別でGUIを提供するほうがいいと所感です。

制約事項

 

制約事項は以下です。

1. Custom Participant切断の制約
チャットの会話にAmazon Lexやエージェントが入るとCustom Participantは切断されます。

2. Custom Participantは1つのみ
1つのコンタクトにおいてCustom Participantは1つまでです。複数の用途のチャットボットを使いたい場合、Amazon Bedrock AgentCore側で実装する必要があります。

3. プロンプト再生ブロックが必須
CreateParticipant APIを利用するLambdaの処理の前に、Amazon Connectの「プロンプトの再生」ブロックを設定する必要があります。そのため、チャットの開始時にプロンプトとLambdaによるプロンプトの2つが投稿されます。

4. 添付ファイル非対応
CreateParticipant APIでは添付ファイルを参照できません。

5. 一次応答が必須
Amazon Connectのコールフロー内Lambdaは最大8秒のタイムアウト値ですが、Amazon Bedrock Knowledge Basesを参照するとほぼ必ず超過するため、一次応答のレスポンスが必須です。

6. レスポンスの整形が必要
LambdaやAmazon Bedrock AgentCoreの実装次第ですが、チャットに書き込むレスポンスを整形しないと、ナレッジベースのデータソースのままの文章(Markdown形式)などがそのまま出力されます。また、長文は分割する必要があります。

7. SNS通知の不安定さ
チャットになんらかのメッセージが書き込まれるとStartContactStreaming APIを利用してAWS SNSからLambdaを実行していますが、たまにユーザーのチャット入力がAWS SNSからLambdaに通知されないときがあります。(深堀り調査はしていません)

 

メリット

 

一方で、今回の実装のメリットは以下と思います。

1. インテント定義が不要
Amazon Lexで必須のインテント定義が不要です。定義やメンテナンスが大変なインテントを無くせるのは良いです。

2. シンプルなコールフロー
やりとりのターン制限がなく、コールフローでループ処理を考えなくてよいのでシンプルなコールフローを利用できます。

3. AgentCoreのメリットを享受
Amazon Bedrock AgentCoreで動作するAIエージェントと連携しているので、observabilityなどAmazon Bedrock AgentCoreのメリットを享受できます。

 

出力イメージ

 

チャット開始時

質問に対する回答


ナレッジベースに関係のないメッセージを送信

 

アーキテクチャ概要

 

処理フロー

 

各処理は以下です。

 

 

①コールフロー内でLambda「Start Bot」を呼び出す。

② 以下のAPIを呼び出して、DynamoDBにセッションを登録する。この時点でチャットボットが初回メッセージを送信する。

  • CreateParticipant API
  • StartContactStreaming API

③ ユーザーがメッセージを入力すると、StartContactStreaming APIで指定されているAWS SNSにイベントを送信する。

④ AWS SNSがLambda「Chat Bot」を実行する。

⑤ Lambda「Chat Bot」がチャットに一次応答の「検索中です…」を送信する

⑥ DynamoDBにセッション情報を参照する

⑦ Lambda「Chat Bot」がLambda「Agent Worker」を非同期で呼び出す。

⑧ Lambda「Agent Worker」がAmazon Bedrock AgentCoreにユーザーのメッセージと共にリクエストを送信する。

⑨ Amazon Bedrock AgentCoreがAmazon Bedrock Knowledge BasesにRetrieve(参照)を行い回答を作成する。

⑩ Lambda「Agent Worker」にレスポンスを返す

⑪ Lambda「Agent Worker」がSendMessage APIで回答を送信する。

 

Amazon Bedrock AgentCore

 

Strands Agentsを利用して記述しています。
プロンプトをファイルにベタ書きしてますが、本番環境ではAmazon Bedrock Prompt Managementで管理するのがいいですね。

main.py

agent.py

config.py

 

Amazon Bedrock Knowledge Bases

 

Amazon S3 Vectorsを利用しています。
Hybrid検索ができないのですが、検証環境であることと今回のデータソースが英語の文章であることから採用しました。
Amazon Bedrock AgentCoreで利用しているStrands AgentsのtoolでRetrieve

 

Lambda

 

各Lambdaごとに処理を記載します。

start-bot/handler.py

チャット開始時にカスタムボットを参加させるLambda関数です

CreateParticipant APIを利用してカスタムボット(CUSTOM_BOT)を参加させる
StartContactStreaming APIを利用してSNSトピックへのメッセージ配信を開始する
CreateParticipantConnection<APIを利用してConnectionTokenを取得する
DynamoDBにセッション情報を保存する(TTL付き)
初回メッセージを送信する

chat-bot/handler.py

SNS経由で受信したメッセージを処理するLambda関数です

SNSイベントの受信してパースを行う
イベントタイプ別の処理(MESSAGE、EVENT、ATTACHMENT)する
一次応答(「検索中です…」)を送信する
AgentWorker Lambdaの非同期呼び出し
チャット終了時のセッションクリーンアップ

agent-worker/handler.py

AgentCore Runtimeを呼び出し、生成された応答を顧客に送信するLambda関数です

AgentCore Runtimeの呼び出し
回答を抽出してSendMessage APIを呼び出して顧客に送信する(1024文字を超える場合は分割して送信)

 

まとめ

 

コードは生成AIで作ってとりあえず動くものと言う感じなんで、本番では諸々修正が必要ですが、実装のベースは出来たと思います。
今回触って何よりおもしろかったのが、Amazon Bedrock AgentCore、Strands AgentsとS3 Vectorsですね。
Amazon Bedrock AgentCoreとStrands Agentsの組み合わせで、この記事に限らず触ってみてますが、こんな簡単でこんなにいい感じに動くんだっていう感動がありますね。
S3 VectorsもOpensearch Serverlessに比べたら圧倒的なコストメリットある点が魅力でした。
Amazon Connectのアドベントカレンダーなのに、締めが他のサービスのこと中心になっちゃいました。

 

参考にしたドキュメント

 

この記事が気に入ったら
いいね ! しよう

Twitter で

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ