3
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?

LambdaでBedrockのClaude 3.7 Sonnetを呼び出してみた

Posted at

Supershipの名畑です。ツイステッドワンダーランドの第7章は、私がやってきた歴代ゲームの中でも最高レベルに熱いストーリーでした。

はじめに

これまでで最もインテリジェントなモデルである Anthropic の Claude 3.7 Sonnet ハイブリッド推論モデルを Amazon Bedrock でご利用いただけるようになりました。Claude 3.7 Sonnet では AI 機能の大幅な進化を実現し、迅速な応答とユーザーに可視化されるステップバイステップの拡張思考の両方を提供します。この新しいモデルでは、コーディングが大幅に改善され、指示実行、数学、物理などのさまざまなタスクのパフォーマンスが向上しています。

参考:Anthropic の Claude 3.7 Sonnet が Amazon Bedrock で利用可能に - AWS

ということで、リリースからすでに一月経っており目新しいものではないですが、備忘も兼ねてAWSのLambda + Bedrock + Claude 3.7 Sonnetの実装を残します。

過去記事「LambdaでBedrockのClaude 3を呼び出してみた」のアップデート版です。

Claudeとは

Claudeは、Anthropicが開発した高性能で知的なAIモデル群です。Claudeは強力で拡張性が高いだけでなく、利用可能な中で最も信頼性の高いAIでもあります。重要なプロトコルに従い、ミスが少なく、ジェイルブレイクに対する耐性があるため、エンタープライズのお客様は大規模な環境で最も安全なAI駆動アプリケーションを構築できます。

参考:Claudeの紹介 - Anthropic

Bedrockとは

Amazon Bedrock は、単一の API を通じて AI21 Labs、Anthropic、Cohere、Luma、Meta、Mistral AI、poolside (近日リリース予定)、Stability AI、および Amazon などの先駆的な AI 企業からの高性能な基盤モデル (FM) の幅広い選択肢を提供するフルマネージドサービスであり、セキュリティ、プライバシー、責任ある AI を備えた生成 AI アプリケーションを構築するために必要な一連の幅広い機能を提供します。

参考:基盤モデルによる生成 AI アプリケーションの構築 - Amazon Bedrock - AWS

モデルのアクセスリクエスト

Bedrock上でAnthropicのモデルを使用するには許可をもらう必要があります。その手順を進めます。

Claude 3.7 Sonnet は、米国東部 (バージニア北部)、米国東部 (オハイオ)、米国西部 (オレゴン) の各リージョンの Amazon Bedrock でご利用いただけます。

参考:Anthropic の Claude 3.7 Sonnet が Amazon Bedrock で利用可能に - AWS

とのことですので、まずリージョンua-east-1 米国東部 (バージニア北部) としました。

その上でBedrockのサイドメニューからモデルアクセスのページを開きます。

Anthropicのモデルの使用が初だと「ユースケースの詳細を送信」が求められ、遷移先の画面で会社名などの項目の入力が求められます。しかし今回は過去記事ですでに完了しているため、省きます。

claude_3_7_1.png

Claude 3.7 Sonnet の「リクエスト可能」を押し、次に吹き出しから「モデルアクセスをリクエスト」を押します。

claude_3_7_2.png

すると遷移先のページで Claude 3.7 Sonnet にチェックが入った状態となりますので、このままページ最下部にある「次へ」を押します。

claude_3_7_3.png

送信」を押します。

claude_3_7_4.png

claude_3_7_5.png

進行中」になりますので、しばらく待ちます。

claude_3_7_6.png

アクセスが付与されました」となりますので、これで使用可能です。

IAMでロールの作成

LambdaからBedrockを呼び出せるようにするためにIAMでロールを作成します。

AWS Identity and Access Management (IAM) は、AWS リソースへのアクセスを安全に管理するためのウェブサービスです。IAM を使用すると、ユーザーがアクセスできる AWS のリソースを制御するアクセス許可を管理できます。IAM を使用して、誰を認証 (サインイン) し、誰にリソースの使用を認可する (アクセス許可を付与する) かを制御します。IAM は、AWS アカウントの認証と認可を制御するために必要なインフラストラクチャを提供します。

参考:IAM とは - AWS Identity and Access Management

まず「ロールを作成」のページに行きます。

claude_3_7_7.png

信頼されたエンティティタイプ」として「AWSのサービス」を、「ユースケース」として「Lambda」を選択して次へを押します。

許可ポリシーとしてAmazonBedrockFullAccessを選択して次へを押します。

次にロール名をつけます。私はわかりやすくLambdaToBedrockAccessRoleとしました。

これで「ロールを作成」を押して作成完了です。

Lambda関数の作成

次にLambdaの設定に移ります。

Labmdaは他のリージョン(たとえばアジアパシフィック (東京) ap-northeast-1)でも動きます。

Lambda関数の作成のページを開きます。

今回は下記の設定としました。

  • 関数名:LambdaToBedrockAccess
  • ランタイム:Python3.13
  • アーキテクチャ:arm64
  • デフォルトの実行ロールの変更
    • 「既存のロールを使用する」を選択して先ほど作成したLambdaToBedrockAccessRoleを選択

アーキテクチャについて詳しくは「Lambda 関数の命令セットアーキテクチャの選択と設定 - AWS Lambda」をご覧ください。

Lambda関数の設定

claude_3_7_8.png

基本的にはほぼデフォルト設定で動くのですが、タイムアウトだけはデフォルトの3秒のままだとレスポンスが間に合わないので30秒に伸ばしました。

コード

NEW Anthropic Claude 3.7 Sonnet - Amazon Bedrockを参考にして書きました。

Lambdaに渡されてきたjsonmessageを参照して、それをclaude 3.7 Sonnetに投げるように実装しています。必要最低限のコードだとかなりシンプルです。

import json
import boto3

def lambda_handler(event, context):
    bedrock_runtime = boto3.client(service_name='bedrock-runtime', region_name='us-east-1')

    model_id = 'us.anthropic.claude-3-7-sonnet-20250219-v1:0'  # モデル名の先頭にリージョンを示すus.を書く
    system_prompt = "必ず日本語で答えてください"
    max_tokens = 1000

    user_message = {"role": "user", "content": event.get("message")}
    messages = [user_message]
    
    body = json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": max_tokens,
            "system": system_prompt,
            "messages": messages
        }  
    )  

    response = bedrock_runtime.invoke_model(body=body, modelId=model_id)
    response_body = json.loads(response.get('body').read())

    return {
        'statusCode': 200,
        'body': response_body
    }

テスト

claude_3_7_9.png

テストのページに移動して、以下のjsonを記述してみます。

{
  "message": "東京都23区を教えてください"
}

そしてテストを押すと、数秒で以下のようなレスポンスが返ってきました。

{
  "statusCode": 200,
  "body": {
    "id": "msg_hogehoge",
    "type": "message",
    "role": "assistant",
    "model": "claude-3-7-sonnet-20250219",
    "content": [
      {
        "type": "text",
        "text": "東京都23区は以下の通りです:\n\n1. 千代田区\n2. 中央区\n3. 港区\n4. 新宿区\n5. 文京区\n6. 台東区\n7. 墨田区\n8. 江東区\n9. 品川区\n10. 目黒区\n11. 大田区\n12. 世田谷区\n13. 渋谷区\n14. 中野区\n15. 杉並区\n16. 豊島区\n17. 北区\n18. 荒川区\n19. 板橋区\n20. 練馬区\n21. 足立区\n22. 葛飾区\n23. 江戸川区\n\nこれらの区は東京都の特別区と呼ばれ、それぞれが基礎自治体としての機能を持っています。"
      }
    ],
    "stop_reason": "end_turn",
    "stop_sequence": null,
    "usage": {
      "input_tokens": 29,
      "cache_creation_input_tokens": 0,
      "cache_read_input_tokens": 0,
      "output_tokens": 234
    }
  }
}

東京都23区は以下の通りです:\n\n1. 千代田区\n2. 中央区\n3. 港区\n4. 新宿区\n5. 文京区\n6. 台東区\n7. 墨田区\n8. 江東区\n9. 品川区\n10. 目黒区\n11. 大田区\n12. 世田谷区\n13. 渋谷区\n14. 中野区\n15. 杉並区\n16. 豊島区\n17. 北区\n18. 荒川区\n19. 板橋区\n20. 練馬区\n21. 足立区\n22. 葛飾区\n23. 江戸川区\n\nこれらの区は東京都の特別区と呼ばれ、それぞれが基礎自治体としての機能を持っています。

適切な回答に思えます。

画像の解析

せっかくなので画像の解析もしてみましょう。画像url指示を渡すこととします。いわゆるマルチモーダルです。

用語「マルチモーダルAI」について説明。テキスト/画像/音声/数値など複数の種類のモダリティー(データ種別)を一度に処理できる統合されたAIモデルを指す。

参考:マルチモーダルAI(Multimodal AI)とは?:AI・機械学習の用語辞典 - @IT

Lambdaに渡されてきたjsonmessage指示image画像urlとして扱うコードとします。

import json
import boto3
import urllib
import base64

def lambda_handler(event, context):
    bedrock_runtime = boto3.client(service_name='bedrock-runtime', region_name='us-east-1')

    model_id = 'us.anthropic.claude-3-7-sonnet-20250219-v1:0'
    system_prompt = "必ず日本語で答えてください"
    max_tokens = 1000

    with urllib.request.urlopen(event.get("image")) as image_file:
        content_image = base64.b64encode(image_file.read()).decode('utf8')

    user_message = {
        "role": "user",
        "content": [
            {"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": content_image}},
            {"type": "text", "text": event.get("message")}
        ]
    }

    messages = [user_message]
    
    body = json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": max_tokens,
            "system": system_prompt,
            "messages": messages
        }  
    )  

    response = bedrock_runtime.invoke_model(body=body, modelId=model_id)
    response_body = json.loads(response.get('body').read())

    return {
        'statusCode': 200,
        'body': response_body
    }

先ほどのコードと多くは同じですが、画像の読み込みと、モデルに渡すmessagesの生成が異なっています。

テストで渡すjsonは以下としました。

{
  "image": "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869934/467c6358-084c-6ce1-d684-cad6dbfe501a.png",
  "message": "これはどんな絵ですか"
}

ちなみにurlの示す画像は過去記事で生成したこちらです。

gen-2-6.png

テストしたところ、レスポンスは以下のようなものでした。

{
  "statusCode": 200,
  "body": {
    "id": "msg_hogehoge",
    "type": "message",
    "role": "assistant",
    "model": "claude-3-7-sonnet-20250219",
    "content": [
      {
        "type": "text",
        "text": "この画像は日本の都会(おそらく渋谷や新宿などの繁華街)の様子です。背景には大きな看板やデジタルサイネージがある典型的な都市の交差点があり、多くの人々が行き交っています。\n\n手前には、カラフルなアニメキャラクターのバッジやピンがたくさん付いたバッグを持った若い女性が写っています。彼女はグレーのトップスを着て、都市の景色を見上げながら微笑んでいます。\n\nこの写真は日本のポップカルチャーとアニメファッションが都市環境と融合している様子を捉えています。バッグに付いているのはアニメキャラクターのバッジやピンで、日本のオタク文化やアニメ・漫画文化を表現しています。"
      }
    ],
    "stop_reason": "end_turn",
    "stop_sequence": null,
    "usage": {
      "input_tokens": 393,
      "cache_creation_input_tokens": 0,
      "cache_read_input_tokens": 0,
      "output_tokens": 253
    }
  }
}

この画像は日本の都会(おそらく渋谷や新宿などの繁華街)の様子です。背景には大きな看板やデジタルサイネージがある典型的な都市の交差点があり、多くの人々が行き交っています。\n\n手前には、カラフルなアニメキャラクターのバッジやピンがたくさん付いたバッグを持った若い女性が写っています。彼女はグレーのトップスを着て、都市の景色を見上げながら微笑んでいます。\n\nこの写真は日本のポップカルチャーとアニメファッションが都市環境と融合している様子を捉えています。バッグに付いているのはアニメキャラクターのバッジやピンで、日本のオタク文化やアニメ・漫画文化を表現しています。

かなり正確な分析です。

最後に

活用が当たり前になってきた生成AIを、より活用していきたい。

宣伝

SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。

3
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
3
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?