はじめに
最近、Amazon Connect 導入において「インバウンドからアウトバウンドへ」 という流れが加速しています。
- インバウンド対応の工数を削減
- アウトバウンドへリソースをシフト
- 結果として 売上増・LTV向上を狙う
日本国内でもアウトバウンドキャンペーンのローンチから一定期間が経過し、本格的な活用フェーズに入るお客様が増えてきました。
しかし、Amazon Connect のアウトバウンドキャンペーンは単に 「電話を自動でかける」だけでは不十分 だと考えています。
技術者として本当に取り組むべきは、
「架電で得られる膨大なデータをどう回収し、
生成AIで価値あるインサイトに変え、
次のアクションまで自動化するか」
という データパイプライン全体の設計 です。
本記事では、Amazon Bedrock を組み合わせた高度なデータ活用アーキテクチャと実装例を解説します。
全体アーキテクチャ
今回の構成では、以下を実現します。
- 架電結果の リアルタイム捕捉
- 通話終了後の 音声解析
- Amazon Bedrock による生成AI分析
- 構造化データとしての蓄積・分析
※ 下記は構成イメージです。(最近、こういった仕組みが多いですね。CRM側で処理するものも多い)
処理フロー概要
① リアルタイム処理
-
EventBridge がアウトバウンドキャンペーンのイベント
(応答/留守電/失敗など)を即座に捕捉 - 結果を DynamoDB に記録
② 音声解析
- 通話終了後、Contact Lens が音声をテキスト化
- 解析結果を Amazon S3 に出力
③ 生成AI解析
- S3 への保存をトリガーに Lambda を起動
- Amazon Bedrock(Claude 3) を呼び出し
- 通話内容から 「ネクストアクション」 を抽出
④ データ活用
- 構造化データを
- CRM 連携
- Athena での分析
- QuickSight 可視化
へ展開
技術的な工夫ポイント
1. EventBridge による低遅延フィードバック
標準のレポート(CTR)の出力を待つのではなく、EventBridge が発行するキャンペーンイベントを直接フックします。
これにより、
- 「話し中 → 10分後に再架電」
- 「留守電 → 翌日同時間帯に再トライ」
といった リアルタイム制御 が可能になります。
2. Bedrock による「非構造化データ」の「構造化」
Contact Lens のテキスト化だけでは、結局 人間が全文を読む必要 があります。
そこで Bedrock を活用し、
- JSON形式での出力をプロンプトで強制
- 後続システム(CRM / MA / BI)が
即座に扱えるデータ に変換
という設計を採用します。
3.実装例:Bedrock による通話分析 Lambda
以下は、Contact Lens の出力をトリガーにBedrock を呼び出して分析結果を DynamoDB に保存する Lambda のサンプルです。
Python(Lambda)
import json
import boto3
import os
from datetime import datetime
# AWSクライアントの初期化
bedrock_runtime = boto3.client('bedrock-runtime')
s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
# 環境変数
BEDROCK_MODEL_ID = "anthropic.claude-3-sonnet-20240229-v1:0"
TABLE_NAME = os.environ.get('TABLE_NAME', 'OutboundAnalysisResults')
def lambda_handler(event, context):
"""
S3に保存された通話テキストをBedrockで解析し、DynamoDBに格納する
"""
try:
# S3イベントからバケット名とキーを取得
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
# Contact Lens の出力を取得
response = s3_client.get_object(Bucket=bucket, Key=key)
cl_data = json.loads(response['Body'].read().decode('utf-8'))
# テキスト抽出(スキーマに応じて調整)
transcript = " ".join([s['Content'] for s in cl_data.get('Transcript', [])])
contact_id = cl_data.get('CustomerMetadata', {}).get('ContactId', 'unknown')
# Bedrock用プロンプト(JSON出力を強制)
prompt = f"""
Human: 以下の通話記録を分析し、指定のJSONフォーマットで回答してください。
<transcript>
{transcript}
</transcript>
JSONフォーマット:
{{
"summary": "100字以内の要約",
"sentiment": "Positive/Negative/Neutral",
"interest_score": 1から5の数値,
"next_action": "資料送付/再架電/不要",
"action_details": "具体的な指示内容"
}}
Assistant: {{
"""
body = json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1000,
"messages": [{"role": "user", "content": prompt}]
})
res = bedrock_runtime.invoke_model(
modelId=BEDROCK_MODEL_ID,
body=body
)
res_body = json.loads(res['body'].read())
analysis_result = json.loads("{" + res_body['content'][0]['text'])
table = dynamodb.Table(TABLE_NAME)
table.put_item(Item={
'ContactId': contact_id,
'Timestamp': datetime.utcnow().isoformat(),
'Analysis': analysis_result
})
return {'statusCode': 200, 'body': 'Analysis Completed'}
except Exception as e:
print(f"Error: {str(e)}")
raise e
4. データ活用:Athena による「勝てる時間帯」の可視化
DynamoDB に蓄積された customer_interest(顧客関心度) をAmazon Athena で分析することで、アウトバウンドキャンペーンの 投資対効果(ROI)を最大化 できます。
本アーキテクチャでは、生成AI(Bedrock)が判定した「会話の質」を数値化しているため、単なる通話実績では見えなかった “本当に価値のある時間帯” を可視化できます。
SQL例:時間帯別の平均顧客関心度
以下は、時間帯ごとの平均関心度と架電件数 を算出するクエリ例です。
-- 時間帯別の平均顧客関心度を算出
SELECT
hour(from_iso8601_timestamp(Timestamp)) AS call_hour,
avg(cast(Analysis.customer_interest AS double)) AS avg_interest,
count(*) AS call_count
FROM
"outbound_db"."analysis_table"
GROUP BY
1
ORDER BY
avg_interest DESC;
このアーキテクチャの強み
単なる 「応答率」 の可視化ではありません。
「何時にかければ、
生成AIが判定した“質の高い会話(関心度4以上)”ができるか」
をデータとして把握できる点こそが、本アーキテクチャ最大の強みです。
まとめ
Amazon Connect のアウトバウンドキャンペーンにおけるデータ活用の鍵は、
- EventBridge による即時性
- Amazon Bedrock による解釈の自動化
この 2つの組み合わせ にあります。
我々のようなAmazon Connectを活用したSIerが、このデータパイプラインを構築することで、
- エージェントは 「記録作業」から解放 され
- 顧客は 「自分に合ったタイミングで、質の高い案内」 を受け取れる
という、
顧客体験・業務効率・成果向上を同時に実現する次世代アウトバウンド基盤 を構築できます。
