Amazon BedrockのWorkshopをVisual Studio Codeで動かすまでの手順

# はじめに
Amazon BedrockのGAに伴い、JAWS-UG横浜支部でワークショップのもくもく会を開催しました。
https://jawsug-yokohama.connpass.com/event/297915/

BedrockはGA前から変更された点が多く、Langchainのバージョンを上げないといけない等注意点が多かったので、まずはスタートラインに立てるようにするための記事です。

### 日本語のワークショップURL
https://catalog.us-east-1.prod.workshops.aws/workshops/a4bdb007-5600-4368-81c5-ff5b4154f518/ja-JP/50-qa/52-rag-qa

### ワークショップのGitHubリポジトリ
https://github.com/aws-samples/amazon-bedrock-workshop/tree/main

現時点で、日本語のワークショップは未完成のものが多く、実際はワークショップのGitHubリポジトリを見に行くのが良いです。

この記事は2023/9/30時点のものです。

# 環境
- OS:`Windows10 + WSL2(Ubuntu 20.04.6)`

# 手順
## 1. Pythonのインストール
```
apt install -y python3 python3-pip (git)
```
※Gitがない場合はGitもインストールしておきましょう。

## 2. AWS CLIのインストール (最新じゃないとハマります）
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
```
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```

## 3. Workshopリポジトリのクローン
```
git clone https://github.com/aws-samples/amazon-bedrock-workshop
cd amazon-bedrock-workshop
```


## ~~4. bedrock-python-sdkの更新~~ （不要になりました）
クローンしたフォルダに、以下のスクリプトを`download-dependencies.sh`という名前で作成し、実行します。
```download-dependencies.sh
#!/bin/sh

set -e

echo "(Re)-creating directory"
rm -rf ./dependencies
mkdir ./dependencies
cd ./dependencies
echo "Downloading dependencies"
curl -sS https://d2eo22ngex1n9g.cloudfront.net/Documentation/SDK/bedrock-python-sdk.zip > sdk.zip
echo "Unpacking dependencies"
# (SageMaker Studio system terminals don't have `unzip` utility installed)
if command -v unzip &> /dev/null
then
    unzip sdk.zip && rm sdk.zip && echo "Done"
else
    echo "'unzip' command not found: Trying to unzip via Python"
    python -m zipfile -e sdk.zip . && rm sdk.zip && echo "Done"
fi
```
```
sh download-dependencies.sh
```

## ~~5. boto3のアップグレード~~ （不要になりました）
```
pip install --upgrade boto3
```

## 6. Langchainのインストール（バージョン指定）
バージョンの指定 `0.0.304` が超重要です
```
pip install --quiet langchain==0.0.304
```

## 7. Bedrockのモデルのアクセス設定
- Bedrockは現時点で `バージニア` `オレゴン` `オハイオ` `シンガポール` がサポートされています。
しかし、シンガポールとオハイオは使用できるモデルが制限されています。
<b>バージニア</b>か<b>オレゴン</b>を選びましょう。

- Amazon Bedrockの画面から <b>Model access</b> を選びます。
最初は <b>Access status</b> が `available` になっています。

※この状態で使えるかと思っていましたが、APIアクセスが `AccessDeniedException` で弾かれて少し悩みました。
以下の、モデルのアクセス設定が必要となります。

- <b>Edit</b> から必要なモデルをチェックし、 <b>Save changes</b> をクリックすることでステータスが `In Progress`となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/01935a3c-b37b-f1e7-8395-4d20f905b7b1.png)

- 数分で `Access granted`になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/c2c1db00-9334-d954-bdc5-758d86bb7cde.png)

## 8. VisualStudio Codeへjupyter拡張のインストール
- Visual Studio CodeのExtensionsを開き、`jupyter`で検索すると出てくるのでインストールしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/1356cb11-4da9-c750-4a01-60dfd8bb5fbf.png)

## 9. ワークショップの実施
- Visual Studio Codeで [3.](#3-workshop%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3)でクローンしたリポジトリのフォルダを開きます。
- 00_Intro -> bedrock_boto3_setup.ipynb を開くとJupyter拡張が良い感じに表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/1dfd09e7-00ab-3f42-9f71-2e9cfc82939a.png)
- Create the boto3 clientの部分でコードを修正します。
ローカルから実行する場合はロールではなくプロファイルからCredentialを読み込む場合が多いと思います。
リージョンの指定及び、AWSのプロファイル名をしておきましょう。
<b>※この内容はほぼすべてのワークショップシナリオで必須となります。</b>
```
os.environ["AWS_DEFAULT_REGION"] = "us-east-1"  # E.g. "us-east-1"
os.environ["AWS_PROFILE"] = "xxx"
# os.environ["BEDROCK_ASSUME_ROLE"] = "<YOUR_ROLE_ARN>"  # E.g. "arn:aws:..."


boto3_bedrock = bedrock.get_bedrock_client(
    assumed_role=os.environ.get("BEDROCK_ASSUME_ROLE", None),
    region=os.environ.get("AWS_DEFAULT_REGION", None),
    runtime=False
)
```
- 修正したら実行しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33070/5ca58da4-a405-02d3-c3c9-aae81017de38.png)
成功すると `Create new client ...`が表示されるはずです。

- その下の `Validate the connection` を実行してJSONのレスポンスが戻ってくればOKです。

- `InvokeModel body and output`は <b>titanのモデル以外</b>のものは実行できると思います。
※titanはGAに伴いモデルIDが変わっているようです。

以上

# 初学者へのおすすめシナリオ
以下のものはAWSのリージョンとプロファイルの指定を修正する部分を間違えなければすんなりと動いてくれるので、色々試したりコードを追いかけて理解するのに役立ちました。
- 01_Generation - 01_zero_shot_generation.ipynb
- 05_Image - Bedrock Stable Diffusion XL.ipynb
- 06_CodeGeneration - 00_code_generatation_w_bedrock.ipynb


# 謝礼
KAG小板橋さんのブログが大変参考になりました！ありがとうございます。
https://qiita.com/yoshii0110/items/f82c04dcf1cdd381553e

# 最後に
ワークショップを通して、LLMをアプリケーションに組み込むイメージがグッと上がりました。
AWSのコストで実施できるのも嬉しい部分ですね。

# 更新履歴
2023/10/1 手順4.5.は不要になったので取り消し線を付けておきました。
@hayao_k ご指摘ありがとうございます！