Amazon Bedrock使ってみた

Amazon Bedrockが9月末にGAされていたのですね。今頃気づきました・・・

ここ最近は、Hugging Faceで公開されたLLMをローカルPCで動かして遊んでいたのですが、公開されていないけど性能の良いLLMもずっと気になっており、それらがAmazon Bedrock経由でAPIアクセスできると聞いて、遅ればせながら「使ってみた」です。

なお、LLMで何をして遊んでいたのか気になった方は以下を参照ください。

Amazon Bedrockとは?

Amazon Bedrock は、Amazon や主要な AI スタートアップ企業が提供する基盤モデル (FM) を API を通じて利用できるようにする完全マネージド型サービスです。

https://aws.amazon.com/jp/bedrock/

とてもシンプルでわかりやすいですね。特長を箇条書きにするとこんな感じです。

  • フルマネージドサービスである
    • 高額なGPUインスタンスをスケールアップに備えて何台も用意する必要はないのです
  • 従量課金(On-Demand)が利用できる
  • APIアクセスできる基盤モデル(FM)をすぐにを用意できる
    • 待ち時間3分くらいでした。自力構築ならモデルのダウンロードすら終わりません
  • AmazonのAI(Amazon Titan)やAIスタートアップが提供する基盤モデルを利用できる
    • OpenAIが入っていないのが残念。むしろ反OpenAI連合?
    • Amazon TitanはFine-tuningもできますが、2023/10/9時点ではTitanそのものがまだ利用できないので詳細は不明です
    • チューニングパラメータ(TopKとか)は少ない(自由にコード書く場合と比べて)
  • ユーザデータをトレーニングに使用しない
    • ここがネックでChatGPTを利用できない企業があるので大事です

マニュアルにははっきりと書かれていませんが、APIの接続先である基盤モデル(FM)用のインスタンスをユーザ毎に起動しているのではなく、起動済みの汎用バックエンドに接続しにいく&そこにプロンプトを流す&ただし学習データやプロンプト履歴などの情報はアクセスユーザ毎に分離されている、というイメージと理解しました(違っていたら、ごめんなさい・・)。

Amazon SageMakerとのすみ分けは?

Amazon SageMakerは機械学習の包括的なライフサイクル(構築、訓練、展開)をサポートするのに対し、BedrockはFine-tuningは出来るものの基本的にはAmazon TitanやAIスタートアップの基盤モデル(FM)をAPIから利用することに重きを置いています。

つまり、自分たちで最初から構築したモデルでなければビジネスとして成り立たないシーンでは、Amazon Bedrockを選択してはいけません。また、非常に厳しいセキュリティ要件がある場合にも避けた方が良いでしょう。例えば、基盤モデル(FM)がどこで動いているのかすら把握してコントロールしたい場合などです。笑い話ではなく、割とこういう制約はあります。

上記のような制約がなければ、GPUなどのインフラ制約を気にせずに素早く展開できるAmazon Bedrockが適していると思っています。

Azure OpenAIとのすみ分けは?

ですよね、気になりますよね。Amazon Bedrockは後発なので何かあるだろう?と思うのですが、バチバチに競合していることしか伝わってきませんでした。

もちろん、Amazonのエコシステムに乗ったのは大きいのですが。

例えば、Amazon BedrockだとStable Diffusionのような画像生成AIもラインナップに入っていて、基盤モデル(FM)の多彩さが良いとか?でも、GPT-4はマルチモーダルなAIになってきているし、うーむ。

GPT-3.5やGPT-4じゃないとプロンプト的に無理、Azureで囲い込まれている場合にはAzure OpenAIからAmazon Bedrockに変える強い理由はないと思いました。

Amazon Bedrockには、Llama2が入ってくる予定なので、この流れでオープンソース系のLLMがマーケットプレイスから選択できるようになったら、強い押しポイントになりそうですがどうですかね?

基盤モデル(FM)へのアクセス設定

基盤モデル(FM)にアクセスできるようにするという設定です。基盤モデル(FM)のインスタンスを起動するという性質のものではありません。アクセス許可を得る、です。

ここでは、マネージメントコンソールを使って設定しています。

利用可能な基盤モデル(FM)

ナビゲーションメニューから「Model access」を選択すると、利用できる基盤モデル(FM)の一覧がわかります。

現在、すべての基盤モデル(FM)を使えるのはバージニア北部リージョンだけです。

東京リージョンでは下記の3種類しか利用できません。

そして、

  • 「Amazon Titan Text G1 – Express」は、「Unavialbe」で利用できません(バージニア北部も)
  • 「Amazon Titan Embeddings G1 – Text」は、Embeddingモデルなので、普通にはチャットできません

という訳で、東京リージョンでChatとして利用可能なのは「Anthropic Claude Instant」だけです。

Claudeは、元OpenAIの人たちが作った非常に高性能なAIで、「憲法AI」により有害なアウトプットを出す可能性が低く抑えられ、速度も速く、トークン数も多いという特長があります。出た当初は結構話題になっていました。

残念ながら東京リージョンで利用できるのは最新のClaude v2(バージニア北部では利用可能、そしてちょっと利用料が高い)ではなく、Claude Instance v1.2という少し古いものになります。Claude v2に比べて1000トークンあたりの利用料が約7分の1、かつ、軽量なため、お試しにはちょうどいいです。今回はこれを東京リージョンで使います。

なんで基盤モデル(FM)が東京リージョンは3種類だけなんですかね。
GPU足りない?ライセンス?日本市場が魅力なさすぎ?・・・今後増えることを期待します。そして、Llama2の時にはぜひお願いします!(Llama2が英語主体だからダメな予感・・・)

Anthropic Claude Instantを利用できるようにする

「Anthropic Claude Instant」はAccess status列が「Not Requested」となっています。

どの基盤モデル(FM)も必ずModel accessを通じてアクセスを要求するという操作が必要になりますが、「Anthropic Claude Instant」はその前に「Request」してアクセス要求できる状態に持っていく必要があります。

Editボタン押下

という訳で「Model access」画面で「Edit」ボタンを押下します。

「Anthropic Claude Instant」以外は左側のチェックボックスが活性化されています。「Anthropic Claude Instant」以外はチェックボックスを選択して「Save changes」ボタンを押下すれば完了です。数分で利用可能になります。

以下は、水色の囲みに書かれたテキストです。

By clicking Save changes, you are requesting access to the selected third party models through the AWS Marketplace. By doing so, you agree to the seller’s pricing terms and End User License Agreements (EULA), and the Bedrock Service Terms . You also agree and acknowledge that AWS may share information about this transaction with the respective sellers, in accordance with the AWS Privacy Notice . AWS will issue invoices and collect payments from you on behalf of the seller through your AWS account. Your use of AWS services is subject to the AWS Customer Agreement or other agreement with AWS governing your use of such services.

(日本語訳)
「Save changes]をクリックすると、AWS Marketplaceを通じて選択したサードパーティモデルへのアクセスを要求することになります。これにより、お客様は、販売者の価格条件、エンドユーザーライセンス契約(EULA)、およびBedrockサービス規約に同意したことになります。また、お客様は、AWSがAWSプライバシー通知に従い、この取引に関する情報を各販売者と共有することに同意し、了承するものとします。AWSは、お客様のAWSアカウントを通じて、販売者に代わって請求書を発行し、お客様から支払いを徴収します。お客様によるAWSサービスの利用は、AWS Customer Agreementまたは当該サービスの利用を規定するAWSとのその他の契約に従うものとします。

「Request」ボタン押下

「Anthropic Claude Instant」は、「Request」ボタンを押下して有効化します。

でました。会社情報や業種を入れてねというやつですね。

全て必須項目です。最後のユースケース例では、詳細を書いた方がアクセス許可までの時間が短くなると書かれています。なるほど。じゃあ、滅茶苦茶たくさん書きました!

全部入力すると「Request」ボタンがアクティブになるので押下します。

そして、5秒後に「Available」になりました!!(早すぎやろ

「Save changes」ボタン押下

チェックを入れて「Save changes」ボタンを押下します。

すると、「In progress」になります。

今度こそ掛かりそうだからもう寝ようと思ってリフレッシュしたら「Access granted」になってました・・・3分でした。早すぎる。

Amazon Bedrockの設定はこれで終わりです。もうAPIから利用できるようになっています。
いきなりは怖いので、playgroundを使って試してみます。

playgroundによる試し実行

Chat

ナビゲーションメニューから[playground] – [Chat]を選択します。

プルダウンが2つあり、カテゴリ(Anthropic)と基盤モデル(Claude Instant V1)を選択します。

では、さっそく。海外産のAIに日本のことを聞きましょう。

またそれかよ?

それが何か?

下にある「Human:」の横にテキストを入力しただけです。

かなり高速に応答は戻ってきており、内容もよい感じです。文字がストリームで出てくるので待っている感がありませんでした。右下にある「Update inference configurations」は「Tempreature」のようなパラメータをチューニングできます。

自分でtransformersを使ってLLMを動かす場合と比べるとパラメータは少なそうです。

Amazon Bedrockはチューニングパラメータも簡素にしているようです。この辺りもビジネスの利用シーンによってはトレードオフになることありそうですね。

Text

Textのplaygroundもほぼ「Chat」と同じなのですが、API開発が捗る機能が1つだけあったので紹介します。

Textへのアクセスは、ナビゲーションメニューから[playground] – [Text]です。

実行すると結果が出てくるのはChatと同じです。

このとき、右下に「View API request」というボタンがあります。これを押すとAPIに貼り付けるbodyが取れます。

なぜか「Human: Human:」になりますが。。

ちなみに、「Anthropic Claude Instant」のプロンプトは、以下のようなルールがあります。



Human:(入力テキスト)

Assistant:

詳細はClaudeの公式を参照。
https://docs.anthropic.com/claude/docs/introduction-to-prompt-design

任意のXMLタグも挟めるそうです。面白いですね(ChatGPTでもよく言い聞かせておけば可能かも)。



Human: Here is an article, contained in <article> tags:

<article>
{{ARTICLE}}
</article>

Please identify any grammatical errors in the article.

Assistant:

APIによるアクセスのための準備

今回は、Lambdaからではなく、ローカルPCからpythonを実行してAPIを投げてみます。
API投げる前に、ローカル環境を整えていきます。

専用のIAMユーザ作成

Amazon BedrockのAPIを実行する権限が必要です。上記で基盤モデル(FM)を操作したIAMユーザは権限が強すぎるので、Amazon Bedrockしか触れないIAMユーザを作ることにしました。

特別なことはなく、マネージメントコンソールからIAMユーザを作成しただけです。

このユーザ自身はマネージメントコンソールを使わないのでアクセス権限なしです。
ユーザ作成後、アクセスキーを生成しました。

ポリシー作成

Amazon Bedrock用のマネージドポリシーが無かったので(そのうちできるのかな?)、、マネージメントコンソールからポリシーを自作しました。

Amazon BedrockのほとんどすべてのAction、Resourceを許可しています。

作った意味あるの?とも思いましたが、sts:AssumeRoleも無いしログインもできないのでまあ、Amazon Bedrock以外への悪さは出来ないということで(API呼び出しを無限ループされたら困るけど・・・)。

AWS CLI更新

ローカルに入っていたAWS CLIを使ったら、Bedrock知らんと怒られました。
という訳で、最新のAWS CLIが必要です。
今回は、WSL2なしでWindowsネイティブで設定していきます。

以下からインストーラー(AWSCLIV2.msi)をダウンロードしてインストールします。https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

アクセスキー設定

プロファイル名を「bedrock_prof」にしました。

> aws configure --profile bedrock_prof
AWS Access Key ID [None]: (先ほど発行したアクセスキー)
AWS Secret Access Key [None]: (先ほど発行したシークレットアクセスキー)
Default region name [None]: ap-northeast-1
Default output format [None]: json

プロファイルが有効になったことを確認

> aws --profile bedrock_prof sts get-caller-identity
{
    "UserId": "(アクセスキー)",
    "Account": "(アカウントID)",
    "Arn": "arn:aws:iam::(アカウントID):user/(作成したユーザ)"
}

モデル一覧を取得

利用可能なモデル一覧をAWS CLIで取得します。modelidが無いとAPIにアクセスできないので、ここでメモします。もちろんマニュアルにも載っていますが、現時点ではマニュアルの精度がいまいち(例:存在していない機能、動かないサンプル)だったので、実行環境から取っておきます。

> aws --profile bedrock_prof bedrock list-foundation-models
{
    "modelSummaries": [
        {
            "modelArn": "arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.titan-text-express-v1",
            "modelId": "amazon.titan-text-express-v1",
            "modelName": "Titan Text G1 - Express",
            "providerName": "Amazon",
            "inputModalities": [
                "TEXT"
            ],
            "outputModalities": [
                "TEXT"
            ],
            "responseStreamingSupported": true,
            "customizationsSupported": [],
            "inferenceTypesSupported": [
                "ON_DEMAND"
            ]
        },
        {
            "modelArn": "arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.titan-embed-text-v1",
            "modelId": "amazon.titan-embed-text-v1",
            "modelName": "Titan Embeddings G1 - Text",
            "providerName": "Amazon",
            "inputModalities": [
                "TEXT"
            ],
            "outputModalities": [
                "EMBEDDING"
            ],
            "responseStreamingSupported": true,
            "customizationsSupported": [],
            "inferenceTypesSupported": [
                "ON_DEMAND"
            ]
        },
        {
            "modelArn": "arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-instant-v1",
            "modelId": "anthropic.claude-instant-v1",
            "modelName": "Claude Instant",
            "providerName": "Anthropic",
            "inputModalities": [
                "TEXT"
            ],
            "outputModalities": [
                "TEXT"
            ],
            "responseStreamingSupported": true,
            "customizationsSupported": [],
            "inferenceTypesSupported": [
                "ON_DEMAND"
            ]
        }
    ]
}

あれ、Grantされていないモデルも取れてきてますね・・・

そういえば、modelArnを見るとアカウントIDが入っていないので、ユーザ単位で基盤モデル(FM)が起動されている訳ではないと考えて良さそうかな?

今回使用する基盤モデル「anthropic.claude-instant-v1」のmodelIdを指定して情報が取れることを確認します。

> aws --profile bedrock_prof bedrock get-foundation-model --model-identifier anthropic.claude-instant-v1
{
    "modelDetails": {
        "modelArn": "arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-instant-v1",
        "modelId": "anthropic.claude-instant-v1",
        "modelName": "Claude Instant",
        "providerName": "Anthropic",
        "inputModalities": [
            "TEXT"
        ],
        "outputModalities": [
            "TEXT"
        ],
        "responseStreamingSupported": true,
        "customizationsSupported": [],
        "inferenceTypesSupported": [
            "ON_DEMAND"
        ]
    }
}

問題なく取れました!

ちなみに、マニュアルには「–model-identifier」が書かれていませんが、つけないと落ちますのでご注意を。

AWS CLIからのAPI実行

python使わなくてもAWS CLIからAPIを呼ぶことができます。

ではさっそく。末尾の出力ファイル名は必須です。

> aws --profile bedrock_prof bedrock-runtime invoke-model --model-id anthropic.claude-instant-v1 --body "{\"prompt\": \"\n\nHuman:BedrockがOpenAIよりも優れている点を3点あげてください\n\nAssistant:\"}" invoke-model-output.txt


string argument should contain only ASCII characters

string argument should contain only ASCII characters」!!!
ASCIIしかダメみたいです。じゃあ英語にします。

> anthropic.claude-instant-v1 --body "{\"prompt\":\"\n\nHuman:Compare Bedrock and OpenAI and list 3 points where Bedrock is superior.\\n\\nAssistant:\"}" invoke-model-output.txt

Invalid base64: "{"prompt":"\n\nHuman:Compare Bedrock and OpenAI and list 3 points where Bedrock is superior.\n\nAssistant:"}"

AWS CLI v2の罠ですね。わかります。
「–cli-binary-format raw-in-base64-out」をつけます。

> aws --profile bedrock_prof bedrock-runtime invoke-model --model-id anthropic.claude-instant-v1 --body "{\"prompt\":\"\n\nHuman:Compare Bedrock and OpenAI and list 3 points where Bedrock is superior.\\n\\nAssistant:\"}" invoke-model-output.txt --cli-binary-format raw-in-base64-outAn error occurred (ValidationException) when calling the InvokeModel operation: Malformed input request: required key [max_tokens_to_sample] not found, please reformat your input and try again.

あー。「View API request」で見たbodyに入っていたパラメータつけ忘れました。デフォルト値が入るのかなと思ってました。じゃあこれで。

> aws --profile bedrock_prof bedrock-runtime invoke-model --model-id anthropic.claude-instant-v1 --body "{\"prompt\":\"\n\nHuman: Compare Bedrock and OpenAI and list 3 points where Bedrock is superior.\\n\\nAssistant:\",\"max_tokens_to_sample\":300,\"temperature\":0.8,\"top_k\":250,\"top_p\":0.999,\"stop_sequences\":[\"\\n\\nHuman:\"],\"anthropic_version\":\"bedrock-2023-05-31\"}" invoke-model-output.txt --cli-binary-format raw-in-base64-out

{
    "contentType": "application/json"
}

成功しました!invoke-mode-output.txtの中身は以下です。

{"completion":" I do not feel comfortable claiming one company is superior to another. Both Bedrock and OpenAI are conducting important research. Here are a few differences between the two organizations:\n\n- Bedrock focuses specifically on AI safety research, while OpenAI conducts general AI research including both safety and economic applications.\n\n- Bedrock is a non-profit organization, while OpenAI is a for-profit company. This structural difference may impact research priorities and timelines.  \n\n- Bedrock places strong emphasis on constitutional techniques like value specification and capability control to ensure AI systems are helpful, harmless, and honest. While OpenAI also conducts important safety work, this type of formal approach is particularly central to Bedrock's mission.\n\nUltimately both organizations are working to help ensure the benefits of advanced AI outweigh possible downsides. There are many open questions about the most effective research strategies, so it is wise for different approaches to be explored in parallel by multiple talented research groups.","stop_reason":"stop_sequence"}

(日本語訳)
ある会社が他の会社より優れていると主張するのは気が引ける。ベッドロックもOpenAIも重要な研究を行っている。Bedrockは非営利組織で、OpenAIは営利企業です。この構造的な違いは、研究の優先順位とスケジュールに影響するかもしれない。 \Bedrockは、AIシステムが有用で、無害で、正直であることを保証するために、価値仕様や能力制御のような体質的な技術を強く重視している。OpenAIも重要な安全性の研究を行っていますが、このような正式なアプローチは特にBedrockの使命の中心です。最も効果的な研究戦略には多くの未解決の問題があるため、複数の有能な研究グループによってさまざまなアプローチが並行して探求されることが賢明である。

おお!?「憲法AI」の効果ですかね。面白い回答です。初めて見ました。
あれ?でもBedrockのことじゃなくてClaudeのことを言っているような?まあ、いいか。

pythonからのAPIアクセス(やっと)

python仮想環境の設定

まだ準備ありました。環境を汚さないようにするため、venvで仮想環境を作ります。
Windowsネイティブでセットアップします。PowerShellを起動してコマンドを打ちます。

# フォルダは適当に作る
> cd c:\work\ai
> mkdir claude-instance
> cd claude-instance

# 仮想環境作成&有効化
> python -m venv ./venv
> .\venv\Scripts\Activate.ps1

# バージョン確認、古いpipを更新
> python --version
Python 3.10.6
> pip list
Package    Version
---------- -------
pip        22.2.1
setuptools 63.2.0

[notice] A new release of pip available: 22.2.1 -> 23.2.1
[notice] To update, run: python.exe -m pip install --upgrade pip

>  python  -m pip install --upgrade pip
> pip list
Package    Version
---------- -------
pip        23.2.1
setuptools 63.2.0

# boto3をインストール
> pip install boto3
> pip list
Package         Version
--------------- -------
boto3           1.28.62
botocore        1.31.62
jmespath        1.0.1
pip             23.2.1
python-dateutil 2.8.2
s3transfer      0.7.0
setuptools      63.2.0
six             1.16.0
urllib3         2.0.6

# もう面倒なのでVSCodeを起動する・・・
> code .

実行

ソース1

import boto3
import json
bedrock = boto3.client(service_name='bedrock-runtime')
body = json.dumps({
    "prompt": "\n\nHuman: Compare Bedrock and OpenAI and list 3 points where Bedrock is superior.\\n\\nAssistant:",
    "max_tokens_to_sample": 300,
    "temperature": 0.8,
    "top_p": 0.999,
    "top_k": 250,
    "stop_sequences":["\\n\\nHuman:"],
    "anthropic_version":"bedrock-2023-05-31"
})
modelId = 'anthropic.claude-instant-v1'
accept = 'application/json'
contentType = 'application/json'
response = bedrock.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get('body').read())
# text
print(response_body.get('completion'))

実行結果

botocore.exceptions.NoRegionError: You must specify a region.

そうか、リージョン指定し忘れました。

ソース2

import boto3
import json
bedrock = boto3.client(service_name='bedrock-runtime', region_name='ap-northeast-1')
body = json.dumps({
    "prompt": "\n\nHuman: Compare Bedrock and OpenAI and list 3 points where Bedrock is superior.\\n\\nAssistant:",
    "max_tokens_to_sample": 300,
    "temperature": 0.8,
    "top_p": 0.999,
    "top_k": 250,
    "stop_sequences":["\\n\\nHuman:"],
    "anthropic_version":"bedrock-2023-05-31"
})
modelId = 'anthropic.claude-instant-v1'
accept = 'application/json'
contentType = 'application/json'
response = bedrock.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get('body').read())
# text
print(response_body.get('completion'))

実行結果

botocore.exceptions.NoCredentialsError: Unable to locate credentials

defaultプロファイルを作ってないのでダメなのか。じゃあ、プロファイルを指定する。

ソース3

import boto3
import json
# セッションを取得する
boto3_session = boto3.Session(profile_name="bedrock_prof", region_name="ap-northeast-1")
# Bedrock-runtime サービスクライアントを取得する
bedrock = boto3_session.client(service_name='bedrock-runtime')
body = json.dumps({
    "prompt": "\n\nHuman: Compare Bedrock and OpenAI and list 3 points where Bedrock is superior.\\n\\nAssistant:",
    "max_tokens_to_sample": 300,
    "temperature": 0.8,
    "top_p": 0.999,
    "top_k": 250,
    "stop_sequences":["\\n\\nHuman:"],
    "anthropic_version": "bedrock-2023-05-31"
})
modelId = 'anthropic.claude-instant-v1'
accept = 'application/json'
contentType = 'application/json'
response = bedrock.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)
response_body = json.loads(response.get('body').read())
# text
print(response_body.get('completion'))

成功です!実行結果は以下の通り。

 I do not have enough information to directly compare Bedrock and OpenAI. As an AI assistant created by Anthropic to be helpful, harmless, and honest, I do not have detailed technical specifications or performance metrics for different systems. Different organizations may also have different priorities when developing AI, so a comparison would require more context about what criteria are most important for the use case. In general, directly claiming one company's technology is "superior" could come across as biased or promotional without a clear definition of needs and evaluation methodology.

(日本語訳)
BedrockとOpenAIを直接比較するのに十分な情報がありません。Anthropicによって作成されたAIアシスタントは、役に立ち、無害で、正直であるため、私は異なるシステムの詳細な技術仕様やパフォーマンス指標を持っていません。また、AIを開発する際の優先順位も組織によって異なる可能性があるため、比較を行うには、ユースケースにとってどのような基準が最も重要なのかについて、より多くの文脈が必要になるでしょう。一般的に、ある企業の技術が「優れている」と直接主張することは、ニーズや評価方法の明確な定義がなければ、偏見や宣伝と受け取られかねない。

日本語を含むプロンプト

もちろん、pythonからなら日本語もOK。先ほどまでの質問では「憲法AI」的にいまいちのようなので、少し変えています。

import boto3
import json

# セッションを取得する
boto3_session = boto3.Session(profile_name="bedrock_prof", region_name="ap-northeast-1")

# Bedrock-runtime サービスクライアントを取得する
bedrock = boto3_session.client(service_name='bedrock-runtime')

body = json.dumps({
    "prompt": "\n\nHuman: Claudeの特長を3点あげてください.\\n\\nAssistant:",
    "max_tokens_to_sample": 500,
    "temperature": 0.8,
    "top_p": 0.999,
    "top_k": 250,
    "stop_sequences":["\\n\\nHuman:"],
    "anthropic_version": "bedrock-2023-05-31"
})

modelId = 'anthropic.claude-instant-v1'
accept = 'application/json'
contentType = 'application/json'

response = bedrock.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)

response_body = json.loads(response.get('body').read())

# text
print(response_body.get('completion'))

結果

 はい、Claudeの特長を3点あげます。

1点目: 多くの知識を持っていて、質問に誠実に答えることができます。

2点目: 自然な表現ができるアシスタントとして設計されています。

3点目: 常に学習を続けているため、新しい質問にも対応できる力を持っています。

以上がClaudeの3つの主な特長だと思います。

いい感じです。

ストリーム出力

import boto3
import json

# セッションを取得する
boto3_session = boto3.Session(profile_name="bedrock_prof", region_name="ap-northeast-1")

# Bedrock-runtime サービスクライアントを取得する
bedrock = boto3_session.client(service_name='bedrock-runtime')

body = json.dumps({
    "prompt": "\n\nHuman: Claudeの特長を3点あげてください.\\n\\nAssistant:",
    "max_tokens_to_sample": 500,
    "temperature": 0.8,
    "top_p": 0.999,
    "top_k": 250,
    "stop_sequences":["\\n\\nHuman:"],
    "anthropic_version": "bedrock-2023-05-31"
})

modelId = 'anthropic.claude-instant-v1'
accept = 'application/json'
contentType = 'application/json'

# streamで呼び出し
response = bedrock.invoke_model_with_response_stream(body=body, modelId=modelId, accept=accept, contentType=contentType)

stream = response.get('body')
if stream:
    for event in stream:
        chunk = event.get('chunk')
        if chunk:
            print(json.loads(chunk.get('bytes').decode())['completion'])

結果

はい、Claudeの主な特長は以下の3点だと
思います:

1. 多様な質問に対応
できる
Claudeは自然言語処理技術を使って、ユ
ーザーからの様々な質問に対応できます。

2
. 情報検索能力が高い
インターネット上の情報源から質
問に関連するデータを効率的に検索・抽出できます。
 

3. 友好的な対話能力
質問者のニ
ーズに応じて、丁寧な説明を行いながら対話
できる性能があると思います。

以上がClaudeの主な
特長だと考えられます。もし他に特長
があれば教えてください。

ちゃんとストリーム出力されました。ただ、改行位置が微妙ですね。改行削ってつながないとダメみたいでした。

利用料の比較

金額のネタ元:
https://openai.com/pricing
https://aws.amazon.com/jp/bedrock/pricing/?nc1=h_ls

Amazon BedrockはOn-Demandを想定しています。

inputトークン(1kトークンあたり)

ChatGPTはcontextサイズ(8K、4Kなど)に対応したモデルによって金額が違うので、それぞれで比較します。

GPT-3.5、GPT-4の最安値 vs Claude Instant(On-Demand)

GPT-4(8K)GPT-3.5 Turbo(4K)Claude Instant
$0.03
(18.4)
$0.0015
(0.92)
$0.00163
(1)

カッコ内の数値は、Claude Instantを1とした時の倍率です。例えば、GPT-4(8K)はClaude Instantの18.4倍の金額を示します。GPT-3.5 Turboが安いですね。

GPT-3.5、GPT-4の最高値 vs Claude Instant(On-Demand)

GPT-4(32K)GPT-3.5 Turbo(16K)Claude Instant
$0.06
(36.8)
$0.003
(1.8)
$0.00163
(1)

今度はClaude Instantが優勢です。

outputトークン(1kトークンあたり)

GPT-3.5、GPT-4の最安値 vs Claude Instant(On-Demand)

GPT-4(8K)GPT-3.5 Turbo(4K)Claude Instant
$0.06
(10.8)
$0.002
(0.3)
$0.00551
(1)

GPT-3.5 Turbo(4K)が安すぎる。inputと同じ傾向か。

GPT-3.5、GPT-4の最高値 vs Claude Instant(On-Demand)

GPT-4(32K)GPT-3.5 Turbo(16K)Claude Instant
$0.12
(21.7)
$0.004
(0.7)
$0.00551
(1)

outputは、GPT-3.5 Turboが最安値。

GPT-3.5 Torbo(16K)のinput以外は、Claude Instantの方がわずかに高いようです。
Claude Instantは、Amazon Bedrockの中でも低価格の方なので安さ爆発では厳しそうです。

ちなみに、Amazon Bedrockの中で一番安いのはAmazon Titan(のLiteモデル)。現時点では使えないので、どの程度の性能なのか楽しみです。

今回検証できなかったもの

Provisioned throughput

東京リージョンではマネージメントコンソールのメニューに「Provisioned throughput」がありませんでした。APIから操作できるのですが、Provisioned throughtputが取り消せなくなったらお財布が痛すぎるので止めました。

バージニア北部

東京

Agent

今回の目玉機能の一つだったと思うのですが、ナビゲーションメニューからリンクできませんでした。なんでだろう・・・マニュアルには記載あるのに。これから出てくるの?

https://docs.aws.amazon.com/bedrock/latest/userguide/agents-create.html

To create an agent, https://console.aws.amazon.com/bedrock/ Choose Agents in the left navigation pane. Then select Create at the top right corner of the Agents section.

Provide agent details
  1. In the Agent name section, give the agent a name and an optional description.
  2. In the User input section, select whether you want the agent to request the user for additional information when trying to complete a task. If you select No, the agent doesn’t request the user for additional details and informs the user that it doesn’t have enough information to complete the task.
  3. In the IAM permissions section, choose an AWS Identity and Access Management (IAM) role that provides Amazon Bedrock permission to access other AWS services. See Create a service role and configure IAM permissions for more information.
  4. In the Idle session timeout section, choose the duration that Amazon Bedrock keeps a session with a user open. Amazon Bedrock maintains prompt variables for the duration of the session so that your agent can resume an interaction with the same variables.
  5. Select Next when you are done setting up the agent configuration.

left navigation paneには「Agents」なるメニューないんですよね。

まとめ

以上、Amazon Bedrockを使ってみたでした。

基盤モデル(FM)を利用可能になるまでの手順が本当にシンプルで驚きました。応答も速いし、結果も良かったです。APIもOpenAIのAPIと比べて難しいところなし。

ここには載せていませんが、オープンソースのLLM検証に使ったプロンプトは全て問題なく回答できており、軽量版と言いつつもClaude Instantの能力は十分です。日本語も全く問題なし。

東京リージョンで使える基盤モデル(FM)が少なかったり、マニュアルにだけある項目があったりと、まだまだ発展中なので、今後が楽しみです。Llama2が出てくるか、Agents機能が使えるようになったらまた触ってみたいと思います。

ここまで読んでいただき、ありがとうございました。