0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon Connect アウトバウンドキャンペーン × Bedrock で実現するデータ駆動型「次世代コンタクトセンター」の構築術

Posted at

はじめに

最近、Amazon Connect 導入において「インバウンドからアウトバウンドへ」 という流れが加速しています。

  • インバウンド対応の工数を削減
  • アウトバウンドへリソースをシフト
  • 結果として 売上増・LTV向上を狙う

日本国内でもアウトバウンドキャンペーンのローンチから一定期間が経過し、本格的な活用フェーズに入るお客様が増えてきました。

しかし、Amazon Connect のアウトバウンドキャンペーンは単に 「電話を自動でかける」だけでは不十分 だと考えています。

技術者として本当に取り組むべきは、

「架電で得られる膨大なデータをどう回収し、
生成AIで価値あるインサイトに変え、
次のアクションまで自動化するか」

という データパイプライン全体の設計 です。

本記事では、Amazon Bedrock を組み合わせた高度なデータ活用アーキテクチャと実装例を解説します。


全体アーキテクチャ

今回の構成では、以下を実現します。

  • 架電結果の リアルタイム捕捉
  • 通話終了後の 音声解析
  • Amazon Bedrock による生成AI分析
  • 構造化データとしての蓄積・分析

※ 下記は構成イメージです。(最近、こういった仕組みが多いですね。CRM側で処理するものも多い)

Qiita_AWS_Outbound.png


処理フロー概要

① リアルタイム処理

  • 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が、このデータパイプラインを構築することで、

  • エージェントは 「記録作業」から解放 され
  • 顧客は 「自分に合ったタイミングで、質の高い案内」 を受け取れる

という、
顧客体験・業務効率・成果向上を同時に実現する次世代アウトバウンド基盤 を構築できます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?