MENU

Amazon Bedrock × Lambda でAIチャットボットを構築してみた【実装解説】

Amazon Bedrock × Lambda でAIチャットボットを構築してみた【実装解説】を説明する画像

「AIチャットボットを自分で作ってみたい」と思ったことはありますか?

AWSのAmazon BedrockとLambdaを組み合わせると、ChatGPTのような対話型AIを自分のシステムに組み込むことができます。この記事では、実際に構築した経験をもとに、仕組みから実装のポイントまで解説します。



目次

構成の全体像

今回構築したシステムの構成はシンプルです。

ユーザー
  ↓ テキストを送信
API Gateway
  ↓ リクエストを転送
Lambda関数
  ↓ Bedrockを呼び出す
Amazon Bedrock(Claude)
  ↓ AIの回答を返す
Lambda関数
  ↓ レスポンスを返す
API Gateway
  ↓
ユーザー(回答を受け取る)

ユーザーからのメッセージをAPI Gatewayで受け取り、Lambda関数がBedrockのAPIを呼び出してAIの回答を取得し、ユーザーに返すという流れです。



使用するAWSサービス

サービス役割
Amazon BedrockAIモデルの呼び出し(今回はClaude)
AWS LambdaBedrockを呼び出す処理を実行
Amazon API GatewayHTTPリクエストの受け口
AWS IAMLambdaがBedrockを呼び出すための権限管理

サーバーを自分で用意・管理する必要がないサーバーレス構成なので、運用コストを最小限に抑えられます。


Amazon Bedrockとは?

Amazon Bedrockは、AWSが提供するフルマネージドの生成AIサービスです。

AnthropicのClaude・MetaのLlama・AmazonのNova・Stability AIなど、複数の基盤モデル(Foundation Model)をAPIで利用できます。

自分でAIモデルをトレーニングしたり、GPUサーバーを用意したりする必要がなく、API呼び出しだけで高性能なAIを使えるのが最大のメリットです。



実装のポイント

1. IAMロールの設定

LambdaがBedrockを呼び出すには、適切なIAM権限が必要です。

Lambdaの実行ロールに以下のポリシーをアタッチします。

json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "bedrock:InvokeModel"
      ],
      "Resource": "*"
    }
  ]
}

権限が不足していると「AccessDeniedException」エラーが発生するため、最初に確認しておくことが重要です。

2. Lambda関数の実装(Python)

Bedrockを呼び出すLambda関数の基本的な実装です。

python

import json
import boto3

def lambda_handler(event, context):
    # リクエストボディからメッセージを取得
    body = json.loads(event['body'])
    user_message = body['message']
    
    # Bedrockクライアントの初期化
    bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
    
    # Claudeへのリクエスト
    response = bedrock.invoke_model(
        modelId='anthropic.claude-3-sonnet-20240229-v1:0',
        body=json.dumps({
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 1000,
            "messages": [
                {
                    "role": "user",
                    "content": user_message
                }
            ]
        })
    )
    
    # レスポンスの解析
    result = json.loads(response['body'].read())
    ai_response = result['content'][0]['text']
    
    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*'
        },
        'body': json.dumps({
            'response': ai_response
        }, ensure_ascii=False)
    }

3. API Gatewayの設定

API GatewayでHTTP APIを作成し、LambdaとPOSTメソッドで連携します。

設定のポイント:

  • メソッド:POST
  • 統合タイプ:Lambda関数
  • CORSの設定を忘れずに行う(フロントエンドから呼び出す場合)

4. モデルの有効化

Bedrockで使用するモデルは、AWSコンソールで事前に有効化(アクセスをリクエスト)する必要があります。

手順:

  1. AWSコンソールでBedrockを開く
  2. 左メニューの「モデルアクセス」を選択
  3. 使用するモデル(例:Claude 3 Sonnet)のアクセスをリクエスト
  4. 承認されたら利用可能になる

承認は数分〜数時間かかる場合があります。



実装してみてわかったこと

よかった点

コストが安い サーバーレス構成のため、使った分だけの課金です。開発・テスト段階ではほぼ無料の範囲に収まりました。

スケーラビリティが高い Lambdaは同時リクエストが増えても自動でスケールするため、急なアクセス増加にも対応できます。

構築が速い インフラの管理が不要なため、AIチャットボットの核心部分の実装に集中できました。コアの実装自体は数時間で完成しました。

注意が必要な点

リージョンの制限 Bedrockで利用できるモデルはリージョンによって異なります。Claude 3はus-east-1(バージニア北部)での利用が推奨されています。

レイテンシー AIモデルの回答生成には数秒かかる場合があります。ユーザー体験を考慮してローディング表示を実装することをおすすめします。

コンテキスト管理 基本的な実装では会話の履歴を保持しません。「前の会話を踏まえた返答」が必要な場合は、会話履歴をDynamoDBなどに保存して毎回Bedrockに渡す実装が必要です。


応用できるユースケース

このアーキテクチャは様々な場面に応用できます。

  • カスタマーサポートボット — よくある質問に自動回答
  • 社内ナレッジBot — 社内ドキュメントを学習させてQ&Aに対応
  • コードレビューBot — コードをBedrockに送って改善点を返す
  • 多言語対応チャット — 日本語の質問を英語で回答するなど

Amazon Bedrockには「ナレッジベース」機能もあり、自社のドキュメントや製品情報をAIに学習させたRAG構成も比較的簡単に実装できます。


まとめ

Amazon Bedrock × Lambda × API Gatewayの組み合わせで、サーバーレスなAIチャットボットを構築できます。

ポイントのおさらい:

  • IAMロールでBedrockへのアクセス権限を付与する
  • Lambdaでbedrock-runtimeクライアントを使ってモデルを呼び出す
  • API GatewayでHTTPエンドポイントを作成する
  • 使用するモデルは事前にコンソールで有効化しておく

生成AIをAWSのサービスと組み合わせるパターンは今後ますます増えていきます。まずはシンプルな構成から試してみて、徐々に機能を拡張していくのがおすすめです。


※ 本記事で使用したコードはサンプルです。本番環境での利用には適切なエラーハンドリング・認証・セキュリティ対策を追加してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次