Amazon BedrockでClaude 3 Sonnetが利用可能になりました

記事タイトルとURLをコピーする

サーバーワークスの村上です。

2024年3月4日にAnthropic社のClaude 3が発表されました。

www.anthropic.com

どうやらAmazon Bedrockでも使えるとのことでしたので早速試してみました。

aws.amazon.com

利用可能なリージョン

現在のところ、バージニア北部とオレゴンで利用可能です。

Claude 3ファミリーのモデルの種類

3種類あります。ただし、現在Amazon Bedrock で利用できるのはClaude 3 Sonnetのみです(Claude 3 Opus と Claude 3 Haiku も近々公開される予定とのこと)。

モデル 特徴
Claude 3 Haiku 高速・低コスト
Claude 3 Sonnet Claude 2 および Claude 2.1 よりも2倍高速
Claude 2 および Claude 2.1 と同じレベルのインテリジェンス
Claude 3 Opus Claude 2 および Claude 2.1 と同様の速度
Claude 2 および Claude 2.1 よりもはるかに高いレベルのインテリジェンス

※表現はAnthropic社のリリースおよびAWSブログより抜粋

料金

Claude 2.0/2.1よりもClaude 3 Sonnetの方が低コストで使えます。

Anthropoc models 1,000入力トークンあたりの料金 1,000出力トークンあたりの料金
Claude Instant $0.00080 $0.00240
Claude 2.0/2.1 $0.00800 $0.02400
Claude 3 Sonnet $0.00300 $0.01500

※バージニア北部・オレゴンリージョンの料金

現状、一番コストが低いのはClaude Instantですが、Claude 3 Haikuが登場したらこちらが最も安価に使えるモデルになるかもしれませんね(推測です)。

他のモデルとの比較

以下はAnthropic社のリリースより転載した、他のモデルとの比較です。

注目すべきはClaude 3 Opusの精度でしょう。他のモデルを上回っています。

複数ベンチマークにおける他モデルとの比較

(個人的な所感)ベンチマークはあくまで参考程度に

上記の他モデルとの比較データを見て、「Amazon Bedrock でも他のモデルに負けないくらいのモデルが使えるんだ!」くらいに捉えていただくのが良いと考えています。

そう考える理由の1つとして、Anthropic社のリリースの注釈の記載があります。

In addition, we’d like to note that engineers have worked to optimize prompts and few-shot samples for evaluations and reported higher scores for a newer GPT-4T model. Source.
(翻訳)
エンジニアが評価用のプロンプトと数ショットのサンプルの最適化に努め、より新しいGPT-4Tモデルでより高いスコアを報告したことにも注目したい

出典には、Few-shot(少数の例をプロンプトに含ませる手法)やCoT(Chain-of-thought。モデルにステップバイステップで考えさせて精度を向上させる手法)などを組み合わせて使用することで、より高い精度が出たことを示すMicrosoftの調査が紹介されています。

要はプロンプトを工夫することでスコアが変わったということです。

ただでさえ毎日のようにアップデートがある機械学習界隈ですし、さらにユーザーによって扱うデータも入力するプロンプトも異なります。

なのでベンチマークの数値だけで何かを判断するのではなく、あくまで参考程度とし、むしろLLMを上手に使うためのFew-shotやCoTなどの知識を取り入れることが重要だなと改めて思いました。

試してみた

まずはモデルアクセスを有効化

まずはモデルアクセスを有効化しましょう。リクエストするとすぐに使える状態になります。

画像処理機能もある

画像とテキストを入力することが可能です。

試しに弊社の大石社長の切腹プレゼンのスライドを使ってみましたが、きちんと理解してくれました。すごく心配もしてくれました。

画像内の文字を認識

扱える画像の形式とサイズ

最大画像サイズは3.75MBです。画像の最大の高さと幅は 8000 ピクセルです。

以下の形式に対応しています。

  • image/jpeg
  • image/png
  • image/webp
  • image/gif

boto3から使う

使用したコード

import json
import logging
import base64
import boto3
    
from botocore.exceptions import ClientError
    
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
  
def run_multi_modal_prompt(bedrock_runtime, model_id, messages, max_tokens):
    body = json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": max_tokens,
            "messages": messages
        }
    )

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

    return response_body
    
def main():
    try:

        bedrock_runtime = boto3.client(service_name='bedrock-runtime', region_name='us-west-2')

        model_id = 'anthropic.claude-3-sonnet-20240229-v1:0'
        max_tokens = 1000
        input_image = "./harakiri.jpg"
        input_text = "なんて書いてある?日本語で教えて"
    
        # Read reference image from file and encode as base64 strings.
        with open(input_image, "rb") as image_file:
            content_image = base64.b64encode(image_file.read()).decode('utf8')
    
        message = {
            "role": "user",
            "content": [
                {
                    "type": "image", 
                    "source": {
                        "type": "base64",
                        "media_type": "image/jpeg", 
                        "data": content_image
                        }
                },
                {
                    "type": "text", 
                    "text": input_text
                }
            ]
        }
   
        messages = [message]
    
        response = run_multi_modal_prompt(
            bedrock_runtime, model_id, messages, max_tokens)
        
        # Unicodeエスケープされた文字列を日本語に変換
        print(json.dumps(response, indent=4).encode('latin1').decode('unicode_escape'))

    except ClientError as err:
        message = err.response["Error"]["Message"]
        logger.error("A client error occurred: %s", message)
        print("A client error occured: " +
              format(message))
   
if __name__ == "__main__":
    main()

※コードは公式ドキュメントを参考にしました。

実行結果

$ python3 invoke_sample.py 
INFO:botocore.credentials:Found credentials in shared credentials file: ~/.aws/credentials
{
    "id": "msg_016PAAgumWW3Qd4N7D78raFJ",
    "type": "message",
    "role": "assistant",
    "content": [
        {
            "type": "text",
            "text": "この画像には、"今日のセッションで皆さまに何も得るものが無ければ 切腹します" と書かれています。これは非常に過激な表現で、適切ではありません。脅迫的な言葉は避けるべきです。プレゼンテーションや講義では、参加者を励まし、建設的な雰囲気を作ることが大切です。皮肉やユーモアを交えるのは構いませんが、威嚇したり不安を与えるような表現は控えめにした方がよいでしょう。"
        }
    ],
    "model": "claude-3-sonnet-28k-20240229",
    "stop_reason": "end_turn",
    "stop_sequence": null,
    "usage": {
        "input_tokens": 253,
        "output_tokens": 168
    }
}

補足

Knowledge baseではまだ使えなさそうでした。

以上となります。

今後のClaude 3 HaikuとClaude 3 Opusの登場にも期待大ですね。

村上博哉 (執筆記事の一覧)

2020年4月入社。機械学習が好きです。記事へのご意見など:hiroya.murakami@serverworks.co.jp