【AWS】GitHub CodespacesとLangChainでBedrockするための開発（その1）

## はじめに

この記事では[GitHub Codespaces](https://docs.github.com/ja/codespaces/overview)を使って、Amazon Bedrockにハンズオンしていく内容になっています。

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

今回は「Amazon Bedrock 生成AIアプリ開発入門」と公式ドキュメントを参考にAmazon BedrokをLangChainで動かしていきたいと思います。

[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
    - GitHub Codespacesデフォルトのもの利用
- pip 24.0 from /usr/local/python/3.10.13/lib/python3.10/site-packages/pip (python 3.10)
    - GitHub Codespacesデフォルトのもの利用

## セットアップ

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

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

```bash
pip install boto3==1.34.87 langchain==0.2.0 langchain-aws==0.1.4 langchain-community==0.2.0
```

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

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

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-20 at 22.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/dd4bbf38-67bf-c706-8b11-bf76b526bfba.png)

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

![Screenshot 2024-06-20 at 22.02.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/d9c8f1f6-8156-c931-7095-9aaa2c5c73a9.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)

これで有効化完了です。

## 実際に動かしてみる

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

では、コードを書いて実際に動かしてみましょう。
今回はLangChainを使って、Amazon BedrockのAPIを実行します。

```py
from langchain_aws import ChatBedrock
from langchain_core.messages import HumanMessage, SystemMessage

chat = ChatBedrock(
    model_id="anthropic.claude-3-sonet-20240229-v1:0",
    model_kwargs={"max_tokens": 1000},
    region_name="us-west-2"
)

messages = [
    SystemMessage(content="あなたは仕事はユーザーの質問に答えることです。"),
    HumanMessage(content="雲の上には何がありますか？"),
]
try:
    response = chat.invoke(messages)
    print(response.content)
except Exception as e:
    print(str(e))
```

実行結果

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

- 成層圏 - 雲の上にある大気の層で、高度約12km〜50kmまでを占めています。この層は非常に安定しており、気温の低下率が小さくなっています。

- 飛行機 - ジェット旅客機の多くは高度約9km〜12kmで飛行しており、雲の上の成層圏を飛行しています。

- 宇宙 - 高度約100kmより上は熱圏と呼ばれ、さらに高ければ宇宙空間に至ります。国際宇宙ステーションは約400km上空を周回しています。

- オゾン層 - 成層圏の高度約15km〜35kmにオゾンが多く存在する層があり、有害な紫外線を吸収する働きがあります。

- 気球や人工衛星なども雲の上を飛行・周回しています。

つまり、雲の上には大気の別の層や宇宙空間があり、航空機や人工物体が活動している領域なのです。
```

イイ感じに返してくれました。実はこの質問、過去に私が[違うブログ](https://iret.media/83056)で実際に試したものです。

では、古い質問の再来ということで`雲の上には何がありますか？`を`くもの上には何がありますか？`と質問してみましょう。

これは`クラウドのくも`と`スパイダーのくも`、どちらとして認識するかのテストです。
`message`変数を以下のように書き換えます。

```py
messages = [
    SystemMessage(content="あなたは仕事はユーザーの質問に答えることです。"),
    HumanMessage(content="くもの上には何がありますか？"),
]
```

実行結果

```text
くものうえには空があります。空には青空、雲、太陽、月、星などがあります。
空は大気の層で地球を取り囲んでおり、生物が住める環境を作り出しています。
空には鳥や飛行機も飛んでいますね。
```

雲として認識しました。

## まとめ

GitHub CodespacesとLangChainでBedrockしてみました。LangChainは便利です。

この記事の筆者である私は業務においてGoogle Cloudを使っています。
業務ではGeminiをLangChainで呼び出しており、そこで思うのが「呼び出す生成AIのモデルが変わってもなんとなく使えてしまう」のがLangChainの良いところだと思います。

今回は初歩的な内容に留まりましたが、`最近読んだ本を教えてくれるLINE botをGemini Proで作る`ということをやっているので今度はAmazon Bedrockで似たようなことをやっていきたいです。

- [最近読んだ本を教えてくれるLINE botをGemini Proを使って作成してみた - Zenn](https://zenn.dev/ymd65536/articles/recently_read_books_bot)

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

ここから下はトラブルシューティングです。必要に応じて参考にしてください。

### ResourceNotFoundExceptionのエラーが出た

```text
Error raised by bedrock service: An error occurred (ResourceNotFoundException) when calling the InvokeModel operation: Could not resolve the foundation model from the provided model identifier.
```

モデルアクセスを有効化できていないかもしくはモデルIDを間違えているので確認しましょう。
指定したリージョンでモデルが使えるかどうかの確認も必要です。

## 参考資料

- [Amazon Bedrock 生成AIアプリ開発入門](https://www.sbcr.jp/product/4815626440/)
- [langchain_aws.chat_models.bedrock.ChatBedrock](https://api.python.langchain.com/en/latest/chat_models/langchain_aws.chat_models.bedrock.ChatBedrock.html)

## おわり