【AWS】GitHub CodespacesとAWS SDKでClaude 3.5 Sonnetを実行してみる

## はじめに

この記事では[GitHub Codespaces](https://docs.github.com/ja/codespaces/overview)とAWS SDKを使って、Amazon BedrockのClaude 3.5 Sonnetを試す内容になっています。

主な内容としては実践したときのメモを中心に書きます。（忘れやすいことなど）誤りなどがあれば書き直していく予定です。

今回は「Amazon Bedrock 生成AIアプリ開発入門」を参考にAWSのAIにハンズオンしていきたいと思います。※発売前に献本いただきました。

[Amazon Bedrock 生成AIアプリ開発入門](https://www.sbcr.jp/product/4815626440/)

なお、環境のセットアップについては以下を参考にしてください。
[【GitHub】GitHub CodespacesでAWS CLIをセットアップする](https://qiita.com/ymd65536/items/64ad445946570d7c78e2)

## 実行環境

開発利用する環境はGitHub Codespacesですが、その上で様々なものを扱うのでバージョンを明記しておきます。

- GitHub Codespaces
- Python 3.10.13
- pip 24.0 from /usr/local/python/3.10.13/lib/python3.10/site-packages/pip (python 3.10)

## セットアップ

### パッケージをインストール

まずは、Pythonのパッケージを整えていきます。以下のpipをCodespacesのターミナルで実行します。

[Codespacesのリンク](https://github.com/codespaces)

```bash
pip install boto3==1.34.87
```

### モデルを有効化する

次にデフォルトではモデルのアクセスが有効になっていないため、モデルアクセスを有効化します。

リージョンが`us-east-1`のAWSマネジメントコンソールからAmazon Bedrockを開きます。

![Screenshot 2024-06-20 at 21.59.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/01385cc5-a2cd-324b-3c4f-820d27140cde.png)

カッコイイ画面が開きましたら左側にある三本線、いわゆるハンバーガーメニューを開きましょう。

![Screenshot 2024-06-20 at 22.01.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/bb71c189-7618-6c3b-a779-395235899adc.png)

メニューの中から`Model Access`をクリックします。

![Screenshot 2024-06-20 at 22.01.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/e965508d-ae34-1296-bc3d-6f55bbf9293e.png)

モデルの一覧が表示されますのでその中から`Claude 3 Sonnet`の`Available to request`にカーソルを合わせてクリックします。`Request model access`のリンクが表示されるのでクリックします。

![Screenshot 2024-06-21 at 0.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/3c036a2a-7cf3-e02b-40f3-7f77f98d6005.png)

クリックするとSonnetにチェックが入ります。

![Screenshot 2024-06-21 at 0.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/fe987efe-e6e9-83b6-06b8-194ab5ab7fb1.png)

そのまま下にスクロールして`Next`をクリックします。

![Screenshot 2024-06-20 at 22.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/8b466fcc-7258-8068-8767-a551db27039d.png)

`Submit`をクリックします。

![Screenshot 2024-06-20 at 22.02.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/f92bdae9-4737-e9af-ab40-acc532bc6d59.png)

これで有効化完了です。

## 実際に動かしてみる

### aws sso login

認証方法は設定済みだけどもしばらく時間が経過してしまった場合は以下のコマンドを実行して再度、認証してください。認証済みの場合は実行しなくても良いです。

```bash
aws sso login
```

### リージョンを指定して基盤モデルの情報を取得する

では、コードを書いて実際に動かしてみましょう。今回はboto3だけを使って、Amazon Bedrockの情報を取得します。以下のコードを書いて実行します。

```py:foundation_model_list.py
# us-east-1の基盤モデルを取得するサンプルコード
import boto3

bedrock_client = boto3.client("bedrock",region_name="us-east-1")
bedrock_found_list = bedrock_client.list_foundation_models()
model_summaries = bedrock_found_list['modelSummaries']

for model_summary in model_summaries:
    print(model_summary['modelArn'])

```

pythonで実行します。

```bash
python foundation_model_list.py
```

実行結果

```text
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-tg1-large
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-image-generator-v1:0
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-image-generator-v1
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-premier-v1:0
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-g1-text-02
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-lite-v1:0:4k
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-lite-v1
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1:0:8k
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-express-v1
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v1:2:8k
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v1
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v2:0:8k
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v2:0
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-image-v1:0
arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-image-v1
arn:aws:bedrock:us-east-1::foundation-model/stability.stable-diffusion-xl-v1:0
arn:aws:bedrock:us-east-1::foundation-model/stability.stable-diffusion-xl-v1
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-grande-instruct
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-jumbo-instruct
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-mid
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-mid-v1
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-ultra
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-ultra-v1:0:8k
arn:aws:bedrock:us-east-1::foundation-model/ai21.j2-ultra-v1
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-instant-v1:2:100k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-instant-v1
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:0:18k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:0:100k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:1:18k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:1:200k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2:1
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-v2
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:28k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0:200k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:48k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0:200k
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0
arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-text-v14:7:4k
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-text-v14
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-r-v1:0
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-r-plus-v1:0
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-light-text-v14:7:4k
arn:aws:bedrock:us-east-1::foundation-model/cohere.command-light-text-v14
arn:aws:bedrock:us-east-1::foundation-model/cohere.embed-english-v3:0:512
arn:aws:bedrock:us-east-1::foundation-model/cohere.embed-english-v3
arn:aws:bedrock:us-east-1::foundation-model/cohere.embed-multilingual-v3:0:512
arn:aws:bedrock:us-east-1::foundation-model/cohere.embed-multilingual-v3
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-13b-chat-v1:0:4k
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-13b-chat-v1
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-70b-chat-v1:0:4k
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-70b-chat-v1
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-13b-v1:0:4k
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-13b-v1
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-70b-v1:0:4k
arn:aws:bedrock:us-east-1::foundation-model/meta.llama2-70b-v1
arn:aws:bedrock:us-east-1::foundation-model/meta.llama3-8b-instruct-v1:0
arn:aws:bedrock:us-east-1::foundation-model/meta.llama3-70b-instruct-v1:0
arn:aws:bedrock:us-east-1::foundation-model/mistral.mistral-7b-instruct-v0:2
arn:aws:bedrock:us-east-1::foundation-model/mistral.mixtral-8x7b-instruct-v0:1
arn:aws:bedrock:us-east-1::foundation-model/mistral.mistral-large-2402-v1:0
arn:aws:bedrock:us-east-1::foundation-model/mistral.mistral-small-2402-v1:0
```

### Bedrockするためのコードを書く

リストが取得できたので上記の内容を使って、Amazon Bedrockにプロンプトを投げてみましょう。以下のコードを実行します。

```py:main.py
import json
import boto3

bedrock_client = boto3.client("bedrock-runtime",region_name="us-east-1")

body = json.dumps(
    {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 1000,
        "system": "あなたの仕事はユーザーの質問に答えることです。",
        "messages": [
            {
                "role": "user",
                "content": "雲の上には何がありますか？"
            }
        ]
    }
)

bedrock_model_id = "anthropic.claude-3-5-sonnet-20240620-v1:0"

header_accept = "application/json"
content_type = "application/json"

res = bedrock_client.invoke_model(
    body=body,
    modelId=bedrock_model_id,
    accept=header_accept,
    contentType=content_type
)

if res.get("body"):
    res_body = json.loads(res.get("body").read())

    if res_body["content"]:
        answer = res_body["content"][0].get("text")
        print(answer)
else:
    print("レスポンスのボディがありません！")
```

pythonで実行します。

```bash
python main.py
```

実行結果

```text
雲の上には主に以下のようなものがあります:

1. より高い層の大気 - 対流圏上部や成層圏など

2. 青空 - 晴れた日には雲の上も青く見えます

3. 太陽、月、星 - 雲の上からはより明るく見えます

4. 飛行機や人工衛星 - 多くの航空機は雲の上空を飛行します

5. より高い雲層 - 巻雲などの高層雲は低層雲の上にあることがあります 

6. オーロラ - 極地方では高高度で見られることがあります

7. 宇宙空間 - 大気圏を超えると宇宙につながります

雲の高さは様々で、地上からわずか数百メートルのものから10km以上の高さにあるものまであります。雲の上の世界は、私たちが地上から見るものとはかなり異なる光景を見せてくれます。
```

## まとめ

今回はGitHub CodespacesとAWS SDKでClaude 3.5 Sonnetを実行してみました。
LangChainと比較すると行数は多くなるもののLangChainに知見がない人でもAWS SDKの知識があれば、生成AIを呼び出せるのでとても良いと思いました。今後の発展に期待です。

## トラブルシューティング

以下、トラブシューティングです。詰まった時の参考にしてください。

### 認証エラー

以下のようなエラーが出てしまう場合は`aws sso login`を実行しましょう。

```text
Error raised by bedrock service: The SSO session associated with this profile has expired or is otherwise invalid. To refresh this SSO session run aws sso login with the corresponding profile.
```

## おわり