【AWS CLI】Amazon Bedrockを利用して複数のモデル を使ってみる

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

こんにちは。AWS CLI が好きな福島です。

はじめに

今回は、AWS CLI からAmazon Bedrock を利用して複数のモデルを使ってみたいと思います。

追記

このブログを記載した後に気づいたのですが、BedrockのplaygroundからCLIコマンドを生成することができました。

利用可能なモデルを確認する

Bedrock では様々なモデルを利用することができますが、 以下のコマンドにより、利用可能なモデルを確認できます。

  • 実行コマンド
aws bedrock list-foundation-models \
--region us-east-1 \
--query "modelSummaries[].
[providerName,
modelId,
inputModalities[0],
outputModalities[0],
responseStreamingSupported,
customizationsSupported[0],
inferenceTypesSupported[0]]" \
--output text | tr '\t' ',' | column -s, -t | sort

※inputModalities や outputModalities は、リスト内の最初の値のみを取得しています。 そのため、リスト内の 2 番目以降の値を取得するためには、inputModalities[1],inputModalities[2]のようにクエリを追加します。

  • 実行結果例

以下は実行結果例ですが、現時点(2023/11)では、リージョンにより使えるモデルが異なることがわかります。

## バージニア北部リージョン(us-east-1)
$ aws bedrock list-foundation-models --region us-east-1 --query "modelSummaries[].[providerName,modelId,inputModalities[0],outputModalities[0],responseStreamingSupported,customizationsSupported[0],inferenceTypesSupported[0]]" --output text | tr '\t' ',' | column -s, -t | sort
AI21 Labs     ai21.j2-grande-instruct           TEXT  TEXT       False  None         ON_DEMAND
AI21 Labs     ai21.j2-jumbo-instruct            TEXT  TEXT       False  None         ON_DEMAND
AI21 Labs     ai21.j2-mid                       TEXT  TEXT       False  None         ON_DEMAND
AI21 Labs     ai21.j2-mid-v1                    TEXT  TEXT       False  None         ON_DEMAND
AI21 Labs     ai21.j2-ultra                     TEXT  TEXT       False  None         ON_DEMAND
AI21 Labs     ai21.j2-ultra-v1                  TEXT  TEXT       False  None         ON_DEMAND
Amazon        amazon.titan-e1t-medium           TEXT  EMBEDDING  None   None         ON_DEMAND
Amazon        amazon.titan-embed-g1-text-02     TEXT  EMBEDDING  None   None         ON_DEMAND
Amazon        amazon.titan-embed-text-v1        TEXT  EMBEDDING  True   None         ON_DEMAND
Amazon        amazon.titan-text-express-v1      TEXT  TEXT       True   FINE_TUNING  ON_DEMAND
Amazon        amazon.titan-text-lite-v1         TEXT  TEXT       True   FINE_TUNING  ON_DEMAND
Amazon        amazon.titan-tg1-large            TEXT  TEXT       True   FINE_TUNING  ON_DEMAND
Anthropic     anthropic.claude-instant-v1       TEXT  TEXT       True   None         ON_DEMAND
Anthropic     anthropic.claude-v1               TEXT  TEXT       True   None         ON_DEMAND
Anthropic     anthropic.claude-v2               TEXT  TEXT       True   None         ON_DEMAND
Cohere        cohere.command-text-v14           TEXT  TEXT       True   None         ON_DEMAND
Stability AI  stability.stable-diffusion-xl     TEXT  IMAGE      None   None         ON_DEMAND
Stability AI  stability.stable-diffusion-xl-v0  TEXT  IMAGE      None   None         ON_DEMAND
$
## 東京リージョン(ap-northeast-1)
$ aws bedrock list-foundation-models --region ap-northeast-1 --query "modelSummaries[].[providerName,modelId,inputModalities[0],outputModalities[0],responseStreamingSupported,customizationsSupported[0],inferenceTypesSupported[0]]" --output text | tr '\t' ',' | column -s, -t | sort
Amazon     amazon.titan-embed-text-v1    TEXT  EMBEDDING  True  None  ON_DEMAND
Amazon     amazon.titan-text-express-v1  TEXT  TEXT       True  None  ON_DEMAND
Anthropic  anthropic.claude-instant-v1   TEXT  TEXT       True  None  ON_DEMAND
$
  • 出力内容の説明
1 列目: プロバイダー名
2 列目: モデル ID
3 列目: インプットとなるデータ(TEXT | IMAGE | EMBEDDING)
4 列目: アウトプットするデータ(TEXT | IMAGE | EMBEDDING)
5 列目: ストリーミング出力のサポート有無
6 列目: カスタマイズ可能有無
7 列目: モデルがサポートする推論タイプ(ON_DEMAND | PROVISIONED)
  • 補足

現在のモデルは基本的には、インプットとアウトプットが 1 つずつですが、 Stability AI は、インプットデータが TEXT(3 列目) と IMAGE(4 列目) に対応しておりました。 ※ 5 列目はアウトプットとなるデータとなります。

$ aws bedrock list-foundation-models --region us-east-1 --query "modelSummaries[].[providerName,modelId,inputModalities[0],inputModalities[1],inputModalities[2],outputModalities[0],outputModalities[1],outputModalities[2],responseStreamingSupported,customizationsSupported[0],inferenceTypesSupported[0]]" --output text | grep "Stability AI" | tr '\t' ',' | column -s, -t
Stability AI  stability.stable-diffusion-xl     TEXT  IMAGE  None  IMAGE  None  None  None  None  ON_DEMAND
Stability AI  stability.stable-diffusion-xl-v0  TEXT  IMAGE  None  IMAGE  None  None  None  None  ON_DEMAND
$

AI21 Labs のモデルを使ってみる

AI21 Labs のモデルは以下の 6 つが表示されておりますが、 今回はおそらく最も高性能なai21.j2-ultra を利用してみます。

参考: https://aws.amazon.com/jp/bedrock/jurassic/#Model_versions

AI21 Labs     ai21.j2-grande-instruct           TEXT  TEXT       False  None         ON_DEMAND
AI21 Labs     ai21.j2-jumbo-instruct            TEXT  TEXT       False  None         ON_DEMAND
AI21 Labs     ai21.j2-mid                       TEXT  TEXT       False  None         ON_DEMAND
AI21 Labs     ai21.j2-mid-v1                    TEXT  TEXT       False  None         ON_DEMAND
AI21 Labs     ai21.j2-ultra                     TEXT  TEXT       False  None         ON_DEMAND
AI21 Labs     ai21.j2-ultra-v1                  TEXT  TEXT       False  None         ON_DEMAND

ai21.j2-ultra の実行

  • サンプル Body の作成
## sampl-body-ai21.txt
{
  "prompt": "AWSって何ですか?",
  "maxTokens": 200,
  "temperature": 0
}
  • モデルの実行
aws bedrock-runtime invoke-model \
--model-id ai21.j2-ultra \
--body $(cat sampl-body-ai21.txt | base64) \
--region us-east-1 response.txt
  • 実行結果の確認
cat response.txt | jq -r '.completions[].data.text'
  • 実行結果例
$ aws bedrock-runtime invoke-model \
--model-id ai21.j2-ultra \
--body $(cat sampl-body-ai21.txt | base64) \
--region us-east-1 response.txt
{
    "contentType": "application/json"
}
$ cat response.txt | jq -r '.completions[].data.text'
AWS(Amazon Web Services)は、Amazonが提供するクラウドベースのサービスです。クラウドとは、複数のコンピューターやネットワークを利用して、データや処理を分散処理する技術です。AWSは、クラウドベースのサービスを利用して、企業や個人がデータや処理を効率よく処理できるようにすることです。

AWSには、様々なサービスがあります。例えば、Amazon EC2(インターネット上で仮想サーバーを立ち上げるサービス)やAmazon S3(データの保存や処理を行うサービス)などがあります。

AWSは、クラウドベースのサービスを利用して、データや処理を効率よく処理できるようにすることで、企業や個人がより効率的に業務を行うことができるようになっています。
  • レスポンスの詳細

レスポンスのデータ構造を確認します。以下は少しデータを加工したものですが、 大枠として、id, prompt, completions という辞書型キーが存在することが分かります。

* id
識別子が含まれます。(複数回実行しても 1234 のままでしたが...)

* prompt
質問内容の詳細が含まれています。
* prompt.text
質問内容が含まれています。
* prompt.tokens
質問内容の単語や文字列の一部がモデルによってどう解析されたかが分かります。
* prompt.tokens[*].logprob
トークンが生成される対数確率が入り、これはモデルがそのトークンを選ぶ自信の度合いを示し、
数字が小さいほど(より負の数になるほど)そのトークンの出現が予想外である、または珍しいことを意味するようです。
* prompt.tokens[*].textRange
テキストの何文字目から何文字目の単語または文字列の一部かが分かります。

* completions
生成された回答の詳細が含まれています。
* completions.data.test
生成された回答が含まれています。
* completions.data.tokens
質問内容の単語や文字列の一部がモデルによってどう解析されたかが分かります。
* completions.data.tokens[*].textRange
テキストの何文字目から何文字目の単語または文字列の一部かが分かります。
* completions.data.tokens[*].logprob
トークンが生成される対数確率が入り、これはモデルがそのトークンを選ぶ自信の度合いを示し、
数字が小さいほど(より負の数になるほど)そのトークンの出現が予想外である、または珍しいことを意味するようです。
* completions.finishReason
生成された回答が終了した理由が含まれます。
{
  "id": 1234,
  "prompt": {
    "text": "AWSって何ですか?",
    "tokens": [
      {
        "generatedToken": {
          "token": "▁AWS",
          "logprob": -10.475105285644531,
          "raw_logprob": -10.475105285644531
        },
        "topTokens": null,
        "textRange": {
          "start": 0,
          "end": 3
        }
      },
      : 中略
      {
        "generatedToken": {
          "token": "?",
          "logprob": -5.520342826843262,
          "raw_logprob": -5.520342826843262
        },
        "topTokens": null,
        "textRange": {
          "start": 9,
          "end": 10
        }
      }
    ]
  },
  "completions": [
    {
      "data": {
        "text": "\nAWS(Amazon Web Services)は、Amazonが提供するクラウドベースのサービスです。クラウドとは、複数のコンピューターやネットワークを利用して、データや処理を分散処理する技術です。AWSは、クラウドベースのサービスを利用して、企業や個人がデータや処理を効率よく処理できるようにすることです。\n\nAWSには、様々なサービスがあります。例えば、Amazon EC2(インターネット上で仮想サーバーを立ち上げるサービス)やAmazon S3(データの保存や処理を行うサービス)などがあります。\n\nAWSは、クラウドベースのサービスを利用して、データや処理を効率よく処理できるようにすることで、企業や個人がより効率的に業務を行うことができるようになっています。",
        "tokens": [
          {
            "generatedToken": {
              "token": "<|newline|>",
              "logprob": 0,
              "raw_logprob": -4.95898348162882e-05
            },
            "topTokens": null,
            "textRange": {
              "start": 0,
              "end": 1
            }
          },
      : 中略
          {
            "generatedToken": {
              "token": "<|endoftext|>",
              "logprob": 0,
              "raw_logprob": -0.087738037109375
            },
            "topTokens": null,
            "textRange": {
              "start": 337,
              "end": 337
            }
          }
        ]
      },
      "finishReason": {
        "reason": "endoftext"
      }
    }
  ]
}

Amazon のモデルを使ってみる

Amazon のモデルには、テキスト生成するものと、EMBEDDING 生成するものがあります。 テキスト 生成のモデルは現在プレビュー中となり、私は利用できないため、EMBEDDING 生成の amazon.titan-embed-text-v1 を使ってみます。

https://aws.amazon.com/jp/bedrock/titan/#Model_versions

Amazon        amazon.titan-e1t-medium           TEXT  EMBEDDING  None   None         ON_DEMAND
Amazon        amazon.titan-embed-g1-text-02     TEXT  EMBEDDING  None   None         ON_DEMAND
Amazon        amazon.titan-embed-text-v1        TEXT  EMBEDDING  True   None         ON_DEMAND
Amazon        amazon.titan-text-express-v1      TEXT  TEXT       True   FINE_TUNING  ON_DEMAND
Amazon        amazon.titan-text-lite-v1         TEXT  TEXT       True   FINE_TUNING  ON_DEMAND
Amazon        amazon.titan-tg1-large            TEXT  TEXT       True   FINE_TUNING  ON_DEMAND

amazon.titan-embed-text-v1 の実行

  • サンプル Body の作成
{
    "inputText": "AWS"
}
  • モデルの実行
aws bedrock-runtime invoke-model \
--model-id amazon.titan-embed-text-v1 \
--body $(cat sample-body-amazon.txt | base64) \
--region us-east-1 response.txt
  • 実行結果の確認
cat response.txt | jq
  • 実行結果例
$ aws bedrock-runtime invoke-model \
--model-id amazon.titan-embed-text-v1 \
--body $(cat sample-body-amazon.txt | base64) \
--region us-east-1 response.txt
{
    "contentType": "application/json"
}
  us-east-1 ~/Desktop/Terminal/review
$ cat response.txt | jq
{
  "embedding": [
    0.91796875,
    0.28125,
    中略
    0.6484375
  ],
  "inputTextTokenCount":8
}

レスポンスには、embeddingとinputTextTokenCountが含まれています。 embeddingには、次元ごとにベクトル化した値が含まれており、titanの場合、1536次元の埋め込みベクトルに変換されるため、1536個の要素が含まれています。 inputTextTokenCountは、質問内容のトークン数を表します。

Anthropicのモデル を使ってみる

Anthropicのモデルは3つありますが、最新のモデルであるanthropic.claude-v2を利用します。

参考: https://aws.amazon.com/jp/bedrock/claude/#Model_versions

Anthropic     anthropic.claude-instant-v1       TEXT  TEXT       True   None         ON_DEMAND
Anthropic     anthropic.claude-v1               TEXT  TEXT       True   None         ON_DEMAND
Anthropic     anthropic.claude-v2               TEXT  TEXT       True   None         ON_DEMAND

anthropic.claude-v2 の実行

  • サンプルBodyの作成
## sample-body-claude.txt
{
    "prompt": "\n\nHuman: AWSって何ですか?\n\nAssistant:",
    "max_tokens_to_sample": 300,
    "temperature": 0,
    "stop_sequences": []
}

※Claudeの場合、promptの前後に\n\nHuman:\n\nAssistant:を含める必要があります。 含めていないと以下のエラーが出力されます。

An error occurred (ValidationException) when calling the InvokeModel operation: Invalid prompt: prompt must start with "

Human:" turn, prompt must end with "

Assistant:" turn
  • モデルの実行
aws bedrock-runtime invoke-model \
--model-id anthropic.claude-v2 \
--body $(cat sample-body-claude.txt | base64) \
--region us-east-1 response.txt
  • 生成された回答の確認
cat response.txt | jq -r .completion
  • 実行結果例
$ aws bedrock-runtime invoke-model \
--model-id anthropic.claude-v2 \
--body $(cat sample-body-claude.txt | base64) \
--region us-east-1 response.txt
{
    "contentType": "application/json"
}
$ cat response.txt | jq -r .completion
 AWSとはAmazon Web Servicesの略で、アマゾンが提供するクラウドコンピューティングサービスの総称です。

主なサービスとしては、

- EC2(Elastic Compute Cloud):仮想サーバー
- S3(Simple Storage Service):オブジェクトストレージ
- RDS(Relational Database Service):リレーショナルデータベース
- DynamoDB:NoSQLデータベース
- Lambda:サーバーレスコンピューティング
- API Gateway:API管理

などがあります。

AWSを利用することで、サーバー等のインフラを自社で準備する必要がなく、必要な時に必要な分だけクラウド上のリソースを利用できるのが大きなメリットです。パブリッククラウドとして多くの企業に利用されています。
$
  • レスポンスの詳細

completion,stop_reason,stop のキーが含まれています。

* completion
生成された回答
* stop_reason
回答の生成が止まった理由
* stop
停止したキーワード
{
  "completion": " AWSとはAmazon Web Servicesの略で、アマゾンが提供するクラウドコンピューティングサービスの総称です。\n\n主なサービスとしては、\n\n- EC2(Elastic Compute Cloud):仮想サーバー\n- S3(Simple Storage Service):オブジェクトストレージ\n- RDS(Relational Database Service):リレーショナルデータベース\n- DynamoDB:NoSQLデータベース \n- Lambda:サーバーレスコンピューティング\n- API Gateway:API管理\n\nなどがあります。\n\nAWSを利用することで、サーバー等のインフラを自社で準備する必要がなく、必要な時に必要な分だけクラウド上のリソースを利用できるのが大きなメリットです。パブリッククラウドとして多くの企業に利用されています。",
  "stop_reason": "stop_sequence",
  "stop": "\n\nHuman:"
}

Cohere を使ってみる

Cohereはモデルが1つしかないため、cohere.command-text-v14を利用してみます。

参考: https://aws.amazon.com/jp/bedrock/cohere-command/#Model_versions

Cohere        cohere.command-text-v14           TEXT  TEXT       True   None         ON_DEMAND

cohere.command-text-v14 の実行

  • サンプルBodyの作成
## sample-body-cohere.txt
{
    "prompt": "AWSって何?",
    "max_tokens": 100,
    "temperature": 0
}
  • モデルの実行
$ aws bedrock-runtime invoke-model \
--model-id cohere.command-text-v14 \
--body $(cat sample-body-cohere.txt | base64) \
--region us-east-1 response.txt
  • 実行結果の確認
$ cat response.txt | jq -r '.generations[].text'
  • 実行結果例
$aws bedrock-runtime invoke-model \
--model-id cohere.command-text-v14 \
--body $(cat sample-body-cohere.txt | base64) \
--region us-east-1 response.txt
{
"contentType": "application/json"
}
$ cat response.txt | jq -r '.generations[].text'
 AWSは、アメリカのコンピュータサービス会社Amazonによって開発された、パソコン・データベースなど、ホスト・ストレージなど、Webサービスなどの情報技術を提供するサービスをいう。


$ 
  • レスポンスの詳細
* generations[].id
生成された回答ごとのIDが含まれます。
generationsと複数形のため、複数の回答を得ることができるのかもしれません。

* generations[].text
生成された回答の詳細が含まれています。

* generations[].finish_reason
生成された回答が終了した理由が含まれます。

* prompt
質問内容の詳細が含まれています。

* id
識別子が含まれます。
{
  "generations": [
    {
      "finish_reason": "MAX_TOKENS",
      "id": "50c42577-4bbd-4a18-83a8-2ef528eb2d75",
      "text": " AWSは、アメリカのコンピュータサービス会社Amazonによって開発された、パソコン・データベースなど、ホスト・ストレージなど、Webサービスなどの情報技術を提供するサービスをいう。\n\n"
    }
  ],
  "id": "eff8937d-dfa9-4ce7-a60f-8eb28a60664d",
  "prompt": "AWSって何ですか?"
}

Stability AI(プレビュー) のモデルを試してみる

Stability AIには2つのモデルがありますが、おそらく最新のstability.stable-diffusion-xlを試してみます。

Stability AI  stability.stable-diffusion-xl     TEXT  IMAGE      None   None         ON_DEMAND
Stability AI  stability.stable-diffusion-xl-v0  TEXT  IMAGE      None   None         ON_DEMAND

stability.stable-diffusion-xl の実行

  • サンプルBodyの作成

りんごを生成するようにお願いしています。

sample-body-stability-ai.txt
{
  "text_prompts": [
    {
      "text":"Please make an image of an apple"
    }
  ],
  "cfg_scale":10,
  "seed":0,
  "steps":50
}
  • モデルの実行
aws bedrock-runtime invoke-model \
--model-id stability.stable-diffusion-xl-v0 \
--body $(cat sample-body-stability-ai.txt | base64) \
--region us-east-1 response.txt
  • 実行結果の確認
cat response.txt| jq | more
  • 実行結果例
$ cat response.txt| jq | more
{
  "result": "success",
  "artifacts": [
    {
      "seed": 0,
      "base64": "iVBORw0KGgoAAAANSUhE 中略 rAAAAAElFTkSuQmCC",
      "finishReason": "SUCCESS"
    }
  ]
}
  • レスポンスから画像を生成

レスポンスに含まれるエンコードされたデータをデコードすることで画像を取得することができます。

cat response.txt| jq -r '.artifacts[].base64' | base64 -d -o apple.png

今回生成された画像は以下の通りです。

終わりに

今回は、AWS CLIからAmazon Bedrockを利用して複数のモデルを使ってみました。 どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。