AWSの生成AI最新機能ハンズオン！BedrockのKnowledge BaseとAgentsに入門しよう

:::note warn
2024/7/30 Cloud9が突如、新規利用に一部制限がかかるようになっています。代替手段は以下の記事をご参照ください。
https://qiita.com/minorun365/items/f5289163795d5d7b21e2
:::

# この記事について

2024年1月31日、以下のオフライン勉強会にてAmazon Bedrockの最新機能ハンズオンを予定しています。

https://studyco.connpass.com/event/305299/

こちらは都内での開催となるため、遠方のかたもハンズオンを実施できるよう、先行してハンズオン手順をこの記事にて公開させていただきます。（当日参加予定の方は、同じ内容をイベント内で実施する予定ですのでご留意のうえ読んでいただければと思います）

:::note warn
本ハンズオンの実施にあたり、多少の課金（数百円以内）が発生することをご了承ください。実施後には忘れず不要なリソースの削除をお願いします。

なお、Bedrockのモデル呼び出し料金は一部マーケットプレイス扱いとなるため、AWSクレジット（クーポン）の適用範囲外となるものがあります。
:::

こちらを実際に試されてみて、もし上手く動かない点やお気づきの点などあればコメント欄やTwitter（[minorun365](https://twitter.com/minorun365)）にてフィードバックくださいますと大変幸いです！


# 0. 環境準備

### 0-1. AWSアカウントを作成し、ルートユーザーでログインする

こちらを参考。

https://aws.amazon.com/jp/register-flow/

既にAWSアカウントをお持ちの方は、AWS Organization機能を使えば子アカウントを簡単に追加作成することができます。

:::note warn
既にお持ちのAWSアカウントををそのまま流用いただいても構いませんが、既存のワークロードに思わぬ影響を与えたり、ハンズオンのトラブルシュートが複雑になる可能性があるため自己責任で判断ください。
:::

最初にルートユーザーのEメールアドレスでログインします。

https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fconsole.aws.amazon.com%2Fconsole%2Fhome%3FhashArgs%3D%2523%26isauthcode%3Dtrue%26state%3DhashArgsFromTB_ap-southeast-2_d1db6b5489026a62&client_id=arn%3Aaws%3Asignin%3A%3A%3Aconsole%2Fcanvas&forceMobileApp=0&code_challenge=QSci_fSjcXbHSTgrAWaqDtVSyAt1l0iCtcbMe-6e8ws&code_challenge_method=SHA-256

![スクリーン ショット 2023-12-24 に 19.19.44 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/cea97ad0-d05b-258d-8e00-eef122e54c8b.png)

ログイン後のAWSマネジメントコンソール（以降マネコンと呼びます）のトップ画面

![スクリーン ショット 2023-12-24 に 19.24.58 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/03d21d0d-b720-5568-f29f-1cb172765254.png)

AWSアカウントを不正利用されることを防ぐため、必ず多要素認証（MFA）の設定をしましょう。
マネコン右上のアカウント名をクリックし、「セキュリティ認証情報」をクリックします。

![スクリーン ショット 2023-12-24 に 19.32.09 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/71011b81-1704-1999-68e8-397db4a084c0.png)

画面右側の「MFAを割り当てる」をクリックします。

![スクリーン ショット 2023-12-24 に 19.33.06 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/cd544e4e-bde6-1659-44d4-1b7754deb90d.png)

お使いのデバイス名が識別できる適当な名前を入力し、「次へ」をクリックします。

![スクリーン ショット 2023-12-24 に 19.34.29 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/ed5756c6-66af-01ff-1856-f057b637a99c.png)

画面の指示に従ってMFAの初期設定をしてください。
お使いのスマホにGoogle Authenticator等のアプリをインストールして紐づけていただくのも良いですし、私のおすすめはChromeの拡張機能です。

https://chromewebstore.google.com/detail/authenticator/bhghoamapcdpbohphigoooaddinpkbai?hl=ja&pli=1

![スクリーン ショット 2023-12-24 に 19.35.22 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/ed7193ff-b79b-5de0-1679-e2867d4c6558.png)

設定が完了すると、これ以降はあなたのMFAデバイスを使ってワンタイムコードを入力しないと、このIAMユーザーでAWSアカウントへログインできなくなります。


### 0-2. 通常作業用のIAMユーザーを作成する

今回ログインに使ったEメールアドレスは「ルートユーザー」といって、このAWSアカウントに対して何でもできちゃう最高特権のユーザーとなります。ちょっと危なっかしいので、代わりに「IAMユーザー」を別途作成して、このルートユーザーは無効化してしまおうと思います。

:::note warn
ちなみにルートユーザーのまま作業続行すると、後続のKnowledge base for Amazon Bedrockの作成に失敗してしまうので注意です。
:::

マネコン上部の検索バーで「IAM」を検索してクリックし、AWS IAMサービスのコンソールに移動します。

![スクリーン ショット 2023-12-24 に 22.26.59 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/3ccc03ed-d456-0224-ce4f-a41b1870325c.png)

IAMコンソール左側の「ユーザー」をクリックし、画面右側の「ユーザーの作成」をクリックします。

![スクリーン ショット 2023-12-24 に 22.27.43 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/cbcc17f9-f71b-ea28-933b-20dac5f87cab.png)

ユーザー作成ウィザードのステップ1では以下を入力します。

- ユーザー名：お好きなあなたのユーザー名（`minorun365` など）
- 「AWS マネジメントコンソールへのユーザーアクセスを提供する」にチェックを入れる
- コンソールパスワード：「カスタムパスワード」を選択しお好きなパスワードを入力
- 「ユーザーは次回のサインイン時に新しいパスワードを作成する必要があります」のチェックを外す

:::note warn
ここで入力したIAMユーザー名とパスワードはすぐ後で利用しますので、メモしておいてください。
:::

![スクリーン ショット 2023-12-24 に 22.29.52 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/fcdd2dc4-379b-0af3-bc24-70b82c9a3976.png)

「次へ」をクリックし、「ポリシーを直接アタッチする」を選択して、許可ポリシーから「AdministratorAccess」を検索してチェックを入れます。

![スクリーン ショット 2023-12-24 に 22.33.04 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/2749372d-9a56-ddbb-b29b-ada4251a82bb.png)

「次へ」をクリックすると確認画面になるので、「ユーザーの作成」をクリックします。

![スクリーン ショット 2023-12-24 に 22.34.09 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/a074d9c5-664b-402f-3a45-aa94ac2f889d.png)

表示される「コンソールサインインURL」をコピーしておきます。

その後、マネコン右上のAWSアカウント名をクリックして「セキュリティ認証情報」をクリックします。

![スクリーン ショット 2023-12-24 に 22.35.14 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/805208d2-a27c-5d33-2e35-2b4d37655c9f.png)

その後、マネコン右上のAWSアカウント名をクリックして「サインアウト」をクリックします。

![スクリーン ショット 2023-12-24 に 22.35.14 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/805208d2-a27c-5d33-2e35-2b4d37655c9f.png)

サインアウトしたら、今コピーした「コンソールサインインURL」をブラウザのアドレスバーに貼り付けてアクセスしましょう。AWSアカウントIDが自動入力された状態で、IAMユーザーを用いたログイン画面に遷移できます。

![スクリーン ショット 2023-12-24 に 22.38.02 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/ff8de84a-40eb-8ac2-eab7-b0473d3428cb.png)

先ほど作成したIAMユーザー名とパスワードを入力してマネコンにサインインします。

AWSアカウントを不正利用されることを防ぐため、必ず多要素認証（MFA）の設定をしましょう。
マネコン右上のアカウント名をクリックし、「セキュリティ認証情報」をクリックします。

![スクリーン ショット 2023-12-24 に 19.32.09 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/71011b81-1704-1999-68e8-397db4a084c0.png)

画面右側の「MFAを割り当てる」をクリックします。

![スクリーン ショット 2023-12-24 に 19.33.06 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/cd544e4e-bde6-1659-44d4-1b7754deb90d.png)

お使いのデバイス名が識別できる適当な名前（先ほどのルートユーザー用のデバイス名とか少しだけ変えてください）を入力し、「次へ」をクリックします。

![スクリーン ショット 2023-12-24 に 19.34.29 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/ed5756c6-66af-01ff-1856-f057b637a99c.png)

画面の指示に従ってMFAの初期設定をしてください。
お使いのスマホにGoogle Authenticator等のアプリをインストールして紐づけていただくのも良いですし、私のおすすめはChromeの拡張機能です。

https://chromewebstore.google.com/detail/authenticator/bhghoamapcdpbohphigoooaddinpkbai?hl=ja&pli=1

![スクリーン ショット 2023-12-24 に 19.35.22 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/ed7193ff-b79b-5de0-1679-e2867d4c6558.png)

設定が完了すると、これ以降はあなたのMFAデバイスを使ってワンタイムコードを入力しないと、このIAMユーザーでAWSアカウントへログインできなくなります。


### 0-3. Cloud9で開発環境を立ち上げる

マネコン画面上部の検索バーから「Cloud9」を検索してクリックし、Cloud9サービスのコンソールへ移動します。

![スクリーン ショット 2023-12-24 に 19.42.00 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/506ef3b5-a6f7-f46c-67ae-20d293ed20f9.png)


マネコン画面右上のリージョン表示が「米国東部（バージニア北部） us-east-1」になっていることを確認します。そうでない場合はリージョン表示名をクリックして「米国東部（バージニア北部） us-east-1」に切り替えます。

![スクリーン ショット 2023-12-24 に 19.42.35 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/7c9b8a0e-d0df-6a85-744f-ccfd57fc578e.png)

:::note warn
今回のハンズオンではAWSの「バージニア北部」リージョンのみを利用します。（後続のKnowledge BaseおよびAgentが東京リージョン未対応のためです）

以下の作業はすべて、AWSマネジメントコンソール画面右上のリージョン表示が「バージニア北部」（もしくはサービスによっては「グローバル」）となっていることを確認いただけると、トラブルがなくスムーズです。
:::

「環境を作成」をクリックして、新たな開発環境用のEC2インスタンスをセットアップします。

![スクリーン ショット 2023-12-24 に 19.44.45 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/349e686c-5898-3202-102f-bec204dd5c36.png)

- 名前： studyco-202401　※お好きな名前でもOK

他はデフォルトでOKです。「作成」をクリックします。



# 1. まずはBedrockを使ってみよう！

### Amazon Bedrockとは？

https://speakerdeck.com/minorun365/tuinidong-jing-riziyonnideng-chang-awsnosheng-cheng-aisabisu-amazon-bedrocktutehe

※生成AIの分野は日々の動きが激しく、このスライド作成以降もBedrockには頻繁にアップデートが入っていることをご了承ください。Claudeの最新版2.1もめでたく東京リージョンで使えるようになりました！

https://qiita.com/minorun365/items/a3dc900d6a15b9abb535


### 1-1. 生成AIモデルを有効化する

マネコン上部の検索バーから「Amazon Bedrock」を探してBedrockサービスのコンソールへ移動します。

![スクリーン ショット 2023-12-24 に 19.46.46 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/8389bf1f-11cc-7d2e-f0dc-687b08221fc8.png)

マネコン右上のリージョン表示が「バージニア北部」になっていることを再度確認しておきましょう。

画面左端のサイドバーをクリックして展開し、左下のほうにある「Model access」をクリックします。

![スクリーン ショット 2023-12-24 に 19.47.55 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/245b88fd-4178-e408-4a50-fd557440103b.png)

「Manage model access」をクリックして、生成AIモデルへのアクセス設定画面を開きます。

![スクリーン ショット 2023-12-24 に 19.49.45 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/0ba0ec82-1921-5cbe-2369-a590df397033.png)

「Anthropic」社名の右にある「Submit use case details」をクリックして、利用申請ウィンドウを開きます。

![スクリーン ショット 2023-12-24 に 19.51.26 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/d5aae7f2-4fd0-fa04-cd0b-c216ce53b9ca.png)

ユースケースを記入して「Submit」をクリックします。

![スクリーン ショット 2023-12-24 に 19.53.30 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/f7fc7928-3f57-b5a5-d08b-bcdf5c49f4f1.png)

その後、Anthropic社の「Claude」モデルとCohere社の「Embed Multilingual」モデルにチェックに入れて「Request model access」をクリックします。

![スクリーン ショット 2023-12-24 に 19.54.44 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/36e4912b-531f-1cc1-d97d-0f81f7a1919c.png)

これで数分待てば、このAWSアカウントのバージニア北部リージョンでBedrockのClaudeモデル呼び出し用APIが利用可能になります。


### 1-2. プレイグラウンドからチャットしてみる

マネコン左端のサイドバーから「Playgrounds > Chat」をクリックします。

![スクリーン ショット 2023-12-24 に 19.57.29 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/cddb00ae-69b4-f05b-95fd-b2fe00436c84.png)

「Select model」をクリックして「Anthropic > Claude 2.1」を選択し「Apply」をクリックします。

![スクリーン ショット 2023-12-24 に 19.57.54 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/dd201df3-62fb-3a9e-6cc5-e05814453207.png)

好きなテキストを入力してClaudeと会話してみましょう。

![スクリーン ショット 2023-12-24 に 19.58.24 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/69697f0a-e04a-0e62-cc97-662fb2fdb4c1.png)

:::note info
長い回答が途切れてしまう場合は、右側の設定項目から「Maximum length」の値を大きめに調整してみてください。（一度に大きな入出力トークン数を扱えることがClaudeモデルの強みの一つです）
:::


### 1-3. PythonからAPIを呼び出してみる

マネコン上部の検索バーから「Cloud9」を検索して、Cloud9コンソールに移動します。

![スクリーン ショット 2023-12-24 に 20.03.28 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/319994cc-7718-1a43-f229-23b88cb00a75.png)

先ほど作成した開発環境の行にある「開く」ボタンをクリックしてIDEを立ち上げます。

![スクリーン ショット 2023-12-24 に 20.04.02 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/bcca783b-bfa1-e3fe-ac1b-2babc5ea3952.png)

初期テーマは黒基調なので、見づらい方は画面右上の歯車アイコンから「Themes」を白いものにしてみてください。

![スクリーン ショット 2023-12-24 に 20.05.39 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/dba7eefb-7f47-0c8e-49a9-dbd9ddcc6fdd.png)

まずは作業用フォルダーを作成します。画面下部のターミナルに以下を順番に入力します。

```bash:Cloud9 ターミナル
mkdir studyco202401 #作業フォルダーを作成する

cd studyco202401 #作ったフォルダーの中へ移動する

touch 1-bedrock-api.py #最初に使うPythonファイルを作成する
```

Cloud9コンソール左側のツリーから「studyco202401」フォルダーを展開し、今作成した `1-bedrock-api.py` ファイルをダブルクリックして開きます。

![スクリーン ショット 2023-12-24 に 20.10.33 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/3395a21c-b45f-f82f-b17e-df9701857288.png)


ファイル内に以下のコードを記載します。

:::note info
コードの分量はそこまで多くないので、できればコピペではなく自分で実際に入力してみてください。その方がとても理解が進みます。
:::

```py:1-bedrock-api.py
# 必要なPythonライブラリをインポートする
import boto3
import json

# Bedrock API呼び出し用のクライアントを作成する
bedrock = boto3.client(service_name='bedrock-runtime')

# Bedrock APIに渡す必要のある変数を事前に定義する
accept = 'application/json'
contentType = 'application/json'
modelId = 'anthropic.claude-v2:1'

body = json.dumps({
    "prompt": "\n\nHuman: 日本の総理大臣は？\n\nAssistant:", #ここにAIへの質問を入れる
    "max_tokens_to_sample": 300,
})

# Bedrock APIをクライアントから実行する
response = bedrock.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)

# 実行結果からテキストのみを変数に入れて、画面に出力する
response_body = json.loads(response.get('body').read())
print(response_body.get('completion'))
```

※参考まで、APIの使い方は以下のドキュメントで案内されています。

https://docs.aws.amazon.com/bedrock/latest/userguide/inference-invoke.html


入力後、`command + s`（Windowsの場合は `Ctrl + s`） でPythonファイルを上書き保存します。

![スクリーン ショット 2023-12-24 に 20.15.29 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/d0389552-004b-6751-3755-85dc5775a3db.png)


Cloud9コンソール下部のターミナルで、このPythonコードを実行してみましょう。

```bash:Cloud9 ターミナル
$ python3 1-bedrock-api.py    
Traceback (most recent call last):
  File "/home/ec2-user/environment/studyco202401/1-bedrock-api.py", line 2, in <module>
    import boto3
ModuleNotFoundError: No module named 'boto3'
```

boto3（Pythtonライブラリの一つ。AWSを操作するためのSDK）が見つからないとのエラーが出るので、Cloud9をホストしているEC2にインストールしてあげる必要があります。

Cloud9画面下部のターミナルで以下コマンドを実行しましょう。

```bash:Cloud9 ターミナル
pip3 install boto3
```

その後、改めてPythonファイルを実行してみます。

```bash:Cloud9 ターミナル
$ python3 1-bedrock-api.py                                                                  
 現在の日本の総理大臣は岸田文雄です。

2021年9月から総理大臣を務めています。
```

入力プロンプトは好きに変えて再実行してみてください。

改行文字が入っているため分かりづらいですが、Claudeのプロンプトルールに従って以下のようなテキストを記述しています。

```py:prompt
Human: 日本の総理大臣は？

Assistant: #この後にAIからの回答が生成される
```


### 1-4. LangChainでラッピングしてみる

今、BedrockのAPIをPythonアプリケーションから直接呼び出しましたが、実際に生成AIをアプリケーションに組み込む際はLangChain等のLLMコーディングを便利にしてくれるPythonライブラリを活用することも多いと思います。

同じようなBedrockのAPI呼び出しをLangChain経由でリトライしてみましょう。

Cloud9画面下部のターミナルより、以下コマンドを実行して新しいPythonファイルを作成します。

```bash:Cloud9 ターミナル
touch 2-bedrock-langchain.py #次に使うPythonファイルを作成する
```

Cloud9画面左側のツリーより、今作成した「2-bedrock-langchain.py」ファイルをダブルクリックしてコードエディターを開きます。

![スクリーン ショット 2023-12-24 に 20.27.52 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/d6e570c4-34a2-35aa-4d84-cdd217d40ccd.png)

開いたファイル内に以下のコードを記載します。

:::note info
コードの分量はそこまで多くないので、できればコピペではなく自分で実際に入力してみてください。その方がとても理解が進みます。
:::

```py:2-bedrock-langchain.py
# 必要なPythonライブラリをインポートする
from langchain.llms import Bedrock
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

# LangChainのLLMモジュールを設定する
llm = Bedrock(
    credentials_profile_name="default", model_id="anthropic.claude-v2:1"
)

# LangChainの会話チェーンを設定する
conversation = ConversationChain(
    llm=llm, verbose=True, memory=ConversationBufferMemory()
)

# LangChainの会話チェーンにプロンプトを渡して実行する
result = conversation.predict(input="日本の総理大臣は？")

# 実行結果を画面に出力する
print(result)
```

※参考まで、LangChainからBedrockを使う方法は以下のドキュメントで案内されています。

https://python.langchain.com/docs/integrations/llms/bedrock


入力後、`command + s`（Windowsの場合は `Ctrl + s`） でPythonファイルを上書き保存します。

Cloud9コンソール下部のターミナルで、このPythonコードを実行してみましょう。

```bash:Cloud9 ターミナル
$ python3 2-bedrock-langchain.py 
Traceback (most recent call last):
  File "/home/ec2-user/environment/studyco202401/2-bedrock-langchain.py", line 2, in <module>
    from langchain.llms import Bedrock
ModuleNotFoundError: No module named 'langchain'
```

今度はLangChainライブラリがCloud9環境上に見つからないとのエラーが出ていますね。

Cloud9画面下部のターミナルで以下コマンドを実行しましょう。LangChainは進化が激しいので、念のためバージョンを指定しておきます。

```bash:Cloud9 ターミナル
pip3 install langchain==0.0.352
```

その後、改めてPythonファイルを実行してみます。

```bash:Cloud9 ターミナル
$ python3 2-bedrock-langchain.py


> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.

Current conversation:

Human: 日本の総理大臣は？
AI:

> Finished chain.
 日本の現在の総理大臣は岸田文雄です。2021年9月から総理大臣を務めています。
```

LangChain経由でもBedrockのAPIを使うことができました。

:::note info
ターミナルの出力を見ると、入力した質問文をLangChainが自動でClaudeのフォーマット（ `Human: （中略） AI:` ）に変換してくれているのが分かりますね。LangChain賢い！
:::

LangChainを使えば、Bedrock以外にもAzure OpenAI Serviceなど、複数の生成AIモデルを抽象化して同じロジックのコードで取り扱うことができる（＝LLMの入れ替えが簡単）ほか、LLMアプリケーションで多くの人が使う機能を簡単にコーディングできるモジュールが多数準備されているため、生成AIアプリ開発が楽になります。


# 2. Knowledge BaseでRAGに挑戦！

### Knowledge Base for Amazon Bedrockとは？

https://speakerdeck.com/minorun365/bedrock-and-amazon-q-noapude-jie-ju-koretute-star-star-deiuxxnokoto-sheng-cheng-aitorendowofu-kan-sinagarajie-shuo?slide=26


### 2-1. AIに参照させたい文書をS3にアップロードする

AIがまだ知らなさそうな、プライベートな文書や最新の情報を探してBedrockに参照させてみましょう。

:::note info
あまりボリュームのある文書だと後段の取り込み処理に時間がかかってしまいハンズオンを進められなくなるため、ブログ1本ぐらいの分量を目安に探してみてください）
:::

例として以下のWebページをブラウザの印刷機能でPDFに出力します。

https://prtimes.jp/main/html/rd/p/000000009.000115171.html

`Command + p`（Windowsの場合は `Ctrl + p`）でブラウザの印刷機能を起動し、PDFに保存することができます。

![スクリーン ショット 2023-12-24 に 21.13.37 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/7926fbf0-e37b-e496-cd4b-715a0e876612.png)


:::note info
保存する際のPDFファイル名は短い英字にしてください。日本語だと後段でエラーになる可能性があります。
:::

試しに、この文書を読み込ませない状態で普通のClaudeがどういう回答をするか確認しておきましょう。

Cloud9のIDE上で先ほどの「1-bedrock-api.py」ファイルを編集し、この文書に関する質問をしてみます。

```py:1-bedrock-api.py 
（前略）
    "prompt": "\n\nHuman: KAGってどんな会社？\n\nAssistant:", #ここにAIへの質問を入れる
（後略）
```

ファイルを上書き保存したら、ターミナルで実行してみましょう。

```bash:Cloud9 ターミナル
$ python3 1-bedrock-api.py                                                                                                                                             
 KAGは日本の化学メーカーです。以下の特徴があります。

- 合成樹脂や化学製品の製造販売を主な事業としている
- 常滑市に本社を置き、国内外に多数の拠点を持つ
- 塩ビ樹脂では世界有数のシェアを誇る
- 化学、エレクトロニクス、自動車部品など多岐にわたる分野で製品を供給している

1923年の創業以来、合成樹脂などの素材開発とその応用技術開発を強みとして成長してきた老舗企業です。自動車や家電向けなど、様々な分野のものづくりを支える基幹材料メーカーとして知られています。
```

弊社KAGは2022年に誕生したばかりの若い会社で、かつKAGという略称がそこまで普及していないこともあり、別の会社？の説明が生成されてしまいました。

これから前述のPDFをBedrockに読み込ませることで、この回答がどのように変化するか注目です。

それではマネコン上部の検索バーからS3のコンソールに移動しましょう。

![スクリーン ショット 2023-12-24 に 21.59.52 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/4deedff5-04d2-e5e5-19fd-fd27534810cc.png)

S3コンソールトップの「バケットを作成」をクリックします。

![スクリーン ショット 2023-12-24 に 22.00.43 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/cc9d468d-97b0-b8ec-3636-5ca58e096beb.png)

バケット名は世界中でユニークである必要があります。
`（ニックネーム）-kb-202401` とでも名付けておきましょう。

他はデフォルト設定のままでOKです。一番下の「バケットの作成」をクリックします。

![スクリーン ショット 2023-12-24 に 22.02.38 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/53b6513d-fc5d-577d-2280-ab747d07daa0.png)

作成されたバケット名をクリックします。

![スクリーン ショット 2023-12-24 に 22.05.18 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/f5a1e00e-d15f-3bd6-c88d-a9a52feb186c.png)

先ほど保存したPDFファイルをドラッグ＆ドロップしてアップロードしましょう。

![スクリーン ショット 2023-12-24 に 22.05.52 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/fe8842a0-5b22-4dd6-cd30-f60afcdfc5fd.png)

確認画面右下の「アップロード」をクリックします。

![スクリーン ショット 2023-12-24 に 22.06.31 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/3a7b891d-bcbb-2491-b21d-3783d5db5a38.png)

無事にPDFファイルをバケットへアップロード完了したことを確認しましょう。

![スクリーン ショット 2023-12-24 に 22.07.34 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/4025efbd-43f8-1400-95d7-0ed065ad2454.png)


### 2-2. Knowledge Baseを作成する

マネコン上部の検索バーからAmazon Bedrockのコンソールに移動します。

![スクリーン ショット 2023-12-24 に 22.08.17 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/f32cd17a-d318-6462-74ba-62dc797bf160.png)

マネコン左端のサイドバーをクリックして展開し、「Orchestration > Knowledge base」をクリックします。

![スクリーン ショット 2023-12-24 に 22.08.57 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/b7fc93a4-68d6-611f-5350-63a451566223.png)

「Create knowledge base」をクリックします。

![スクリーン ショット 2023-12-24 に 22.09.44 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/188582fe-3898-0cdc-d4fa-58393774fd0a.png)

Step 1はすべてデフォルト設定でも構いませんが、分かりやすいようにナレッジベース名だけは `KB-StudyCo-202401` などに変えておくと良いでしょう。そして「Next」をクリックします。

![スクリーン ショット 2023-12-24 に 22.11.16 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/d623335b-a918-af94-9b7e-cb3211dc4e2d.png)

「Browse S3」をクリックしてナレッジベースに取り込むS3バケットを選択します。

![スクリーン ショット 2023-12-24 に 22.13.08 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/2e0d06ba-b7b5-cd0d-ec1b-c3d888ab163a.png)

いま作成したS3バケットのラジオボタンを選択して「Choose」をクリックします。

※バケット名をクリックしてしまうと中の階層に入ってしまうのでご注意ください。（その際は一度「Cancel」をクリックしてやり直せばOKです）

![スクリーン ショット 2023-12-24 に 22.13.44 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/771d064c-e765-7eb7-f6b1-e41128454027.png)

「Next」をクリックするとStep 3でEmbeddings（ベクター変換）用のモデルとベクターDBを選択する画面になります。

Embeddings modelにはCohere社の `Embed Multilingual` を選択しましょう。今月追加されたばかりの埋め込み専用モデルで、日本語のRAG性能にも定評があります。

ベクターデータの保存先はデフォルトのままでOKです。（OpenSerach Serverlessが使用されます）

![スクリーン ショット 2024-01-28 に 16.58.44 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/e582e755-5fad-595f-ea14-ca6bbc53401e.png)

「Next」をクリックすると作成確認画面になるので、右下の「Create knowledge base」をクリックします。

![スクリーン ショット 2023-12-24 に 22.19.16 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/4b57e084-1002-bfa8-8511-7135f4f10b38.png)

作成には5分ぐらいかかるので少し待ちましょう。（ハンズオン休憩タイム）


### 2-3. マネコン上からRAGチャットを試してみる

画面右側のサイドバーから、今作ったナレッジベースを用いた生成AIモデルとの対話を試すことができます。

「Sync data source」をクリックします。

:::note info
同期がエラーになる場合は、文書のベクター変換に必要な「Titan Embeddings」モデルをちゃんと有効化できているか確認してみてください。
:::

![スクリーン ショット 2023-12-24 に 23.06.55 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/80c65b94-0aa4-e044-8857-2729aec18d74.png)

「Select Model」をクリックして、「Anthropic > Claude 2.1」を選択し「Apply」をクリックします。

![スクリーン ショット 2024-01-28 に 17.04.55 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/6bf83385-d067-eb39-a264-236e6137fd23.png)

試しに右下のチャットボックスから質問してみましょう。

![スクリーン ショット 2023-12-24 に 23.17.44 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/e6561d2b-ff28-2283-2dde-c074d4cf6840.png)

見事、S3バケット上のPDFファイル内容に基づいて、回答を生成してくれました！

※Knowledge baseの画面中央に表示されている「Knowledge base ID」は、このあとのAPI呼び出しですぐ利用するのでメモしておいてください。

ちなみに「Show result details」をクリックすると、引用されたチャンク（テキストのかたまり）を確認することができます。

![スクリーン ショット 2023-12-24 に 23.19.32 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/a7b0e370-c46a-3c32-5c8c-5c843f2f15ef.png)


### 2-4. PythonからAPIを呼び出してみる

マネコン上部の検索バーからCloud9のコンソールに移動し、また先ほどと同じ開発環境へ「開く」からアクセスします。

![スクリーン ショット 2023-12-24 に 23.37.56 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/63778088-fc09-1006-2226-a33ab31a3867.png)

IDE画面下部のターミナルで以下コマンドを実行します。

```bash:Cloud9 コンソール
cd ~/environment/studyco202401 #作業フォルダーへ再度移動する

touch 3-knowledgebase.py #次に使うPythonファイルを作成する
```

画面左側のツリーから、作成した `3-knowledgebase.py` ファイルをダブルクリックしてエディターで開きます。そこに以下のコードを入力しましょう。

※10行目にKnowledge baseのIDを入力する必要があるので、先ほどメモした値を `XXXXXXXXXX` の代わりに記載してください。

:::note info
コードの分量はそこまで多くないので、できればコピペではなく自分で実際に入力してみてください。その方がとても理解が進みます。
:::

```py:3-knowkedgebase.py
# 必要なPythonライブラリをインポートする
import boto3

# Bedrock Agent API呼び出し用のクライアントを作成する
agent = boto3.client(service_name='bedrock-agent-runtime')

# Bedrock Agent APIに渡す必要のある変数を事前に定義する
model_id = "anthropic.claude-v2:1"
model_arn = f'arn:aws:bedrock:us-east-1::foundation-model/{model_id}'
kb_id = "XXXXXXXXXX" #ここにKnowkedge BaseのIDを入れる
query = "KAGってどんな会社？" #ここにAIへの質問を入れる

# Bedrock Agent APIをクライアントから実行する
response = agent.retrieve_and_generate(
    input={
        'text': query
    },
    retrieveAndGenerateConfiguration={
        'type': 'KNOWLEDGE_BASE',
        'knowledgeBaseConfiguration': {
            'knowledgeBaseId': kb_id,
            'modelArn': model_arn
        }
    },
)

# 実行結果からテキストのみを変数に入れて、画面に出力する
generated_text = response['output']['text']
print(generated_text)
```

入力後、`command + s`（Windowsの場合は `Ctrl + s`） でPythonファイルを上書き保存します。

Cloud9コンソール下部のターミナルで、このPythonコードを実行してみましょう。

```bash:Cloud9 ターミナル
$ python3 3-knowledgebase.py 
KDDIアジャイル開発センター株式会社(KAG)は、日本の企業組織がデジタル変革を実現していくためのビジネス開発拠点です。お客さまの業務課題解決や新規事業創出といったDX推進を支援しています。
```

PythonアプリケーションからもナレッジベースをAPI経由で利用することができましたね！


# 3. AgentsでコードやRAGをAIに使わせよう！

### Agents for Amazon Bedrockとは？

https://speakerdeck.com/minorun365/bedrock-and-amazon-q-noapude-jie-ju-koretute-star-star-deiuxxnokoto-sheng-cheng-aitorendowofu-kan-sinagarajie-shuo?slide=27


### 3-1. AIに使わせたいLambda関数を作る

マネコン上部の検索バーからAWS Lambdaのコンソールに移動します。

![スクリーン ショット 2023-12-24 に 23.21.03 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/50ceaf17-8235-93c5-cb92-a1eb810aaaff.png)

画面右上のリージョン表示が「バージニア北部」になっていることを確認し、「関数の作成」をクリックします。

![スクリーン ショット 2023-12-24 に 23.21.47 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/39fd11fc-a482-fd86-1a3e-dd45fd7c27b0.png)

以下の設定を入力し、残りはデフォルトのまま「関数の作成」を実行します。

- 関数名： `tokyoWeather`
- ランタイム： Python 3.12

![スクリーン ショット 2023-12-24 に 23.23.35 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/0dba440b-0435-f936-abec-9fb515d52fc3.png)

画面下部のコードエディターから、このLambdaで実行するPythonコードを直接記述することができます。

今回は以下の記事を参考に、「東京の今日・明日の天気予報」をYahoo!天気から取得するLambda関数を作成します。（ @cyberBOSE さんありがとうございます！）

https://qiita.com/cyberBOSE/items/e8c2d0207d03b6934a1c

:::note info
上記 @cyberBOSE さんはこの他にもAmazon Bedrockの素晴らしい記事を多数執筆されています。是非みなさんもご参考にされてみてください！
:::

`lambda_function.py` の内容をすべて削除し、代わりに以下のPythonコードを記述しましょう。

```py:tokyoWeather / lambda_function.py
# 必要なPythonライブラリをインポートする
import requests
from bs4 import BeautifulSoup
import json

# メインのLambda関数を定義する
def lambda_handler(event, context):

	# 東京のYahoo天気
	url = 'https://weather.yahoo.co.jp/weather/jp/13/4410.html'

	# 今日明日の天気のみ取得
	page = requests.get(url).text
	contents = str(BeautifulSoup(page, 'html.parser').select('#main > div.forecastCity'))

	# agentの形式でreturn
	response_body = {"application/json": {"body": contents}}
	action_response = {
		"actionGroup": event["actionGroup"],
		"apiPath": event["apiPath"],
		"httpMethod": event["httpMethod"],
		"httpStatusCode": 200,
		"responseBody": response_body,
	}
	api_response = {"messageVersion": "1.0", "response": action_response}
	return api_response
```

入力したら `Command + s`（Windowsの場合は `Ctrl + s`）で上書き保存し、「Deploy」をクリックします。

これで天気取得Lambdaをすぐに呼び出せる状態になったのですが、このコードでは `requests` および `BeautifulSoup` という外部ライブラリが使われているため、Lambda実行の際にインストールされている必要があります。

今回はLambdaレイヤーという機能を使い、これらの外部ライブラリをLambda関数の外からくっつけてあげることにします。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/chapter-layers.html

まずは必要なライブラリをZIPにしてダウンロードします。

マネコン上部の検索バーからCloud9のコンソールに移動し、また先ほどと同じ開発環境へ「開く」からアクセスします。

![スクリーン ショット 2023-12-24 に 23.37.56 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/63778088-fc09-1006-2226-a33ab31a3867.png)

IDE画面下部のターミナルで以下コマンドを実行します。

```bash:Cloud9 コンソール
cd ~/environment/studyco202401 #作業フォルダーへ再度移動する

mkdir python #ライブラリをインストールするためのフォルダーを作成する
cd python #そのフォルダーへ移動する

pip3 install requests BeautifulSoup4 -t . #2つのライブラリをインストールする
```

※このとき、以下のようなメッセージが赤字で表示される場合がありますが、ライブラリ依存関係の警告であり今回のハンズオン上は問題ないのでそのまま進めて大丈夫です。

![スクリーンショット 2023-12-27 10.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/969126e1-6600-25eb-e870-0d9bc4866c5d.png)

画面左側のツリーに `python` フォルダーが作成され、中にライブラリ用のフォルダーが多数配置されていることを確認できたら、そのフォルダーをZIP形式で圧縮します。

```bash:Cloud9 コンソール
cd ~/environment/studyco202401 #一つ上のフォルダーへ戻る
zip -r python.zip python #pythonフォルダーをZIP圧縮する
```

画面左側のツリーに `python.zip` ファイルが出現しているので、右クリックして作業PCのローカルへ「Download」しましょう。

![スクリーンショット 2023-12-27 23.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/cf776756-d0e1-81f8-73ff-d7386001a69a.png)

AWSマネコン上でLambdaコンソールを開き、画面左側の「レイヤー」をクリックして「レイヤーの作成」を実行します。

![スクリーン ショット 2023-12-24 に 23.51.32 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/c9c17a72-5df2-6541-f580-0c844f1fedb2.png)

以下の設定を入力して「作成」をクリックします。

- 名前： `requests-BeautifulSoup4`
- 「アップロード」をクリックして先ほどの `python.zip` をアップロードする
- 互換性のあるアーキテクチャ： 「x86_64」にチェックを入れる
- 互換性のあるランタイム： 「Python 3.12」を選択する

![スクリーン ショット 2023-12-24 に 23.55.31 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/fba61aaa-8ff1-7e1c-b180-448787c7b053.png)

画面左側の「関数」をクリックして、先ほど作成した「tokyoWeather」関数名をクリックします。

![スクリーン ショット 2023-12-24 に 23.58.31 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/7d468c71-67ab-d911-0c4b-c61d90fa0a89.png)

コード編集画面をさらに下までスクロールすると「レイヤー」という項目があるので、「レイヤーの追加」をクリックします。

![スクリーン ショット 2023-12-24 に 23.59.20 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/bb451e27-e7e4-8243-b6c3-bc4a305a5f41.png)

以下を指定して「追加」をクリックします。

- レイヤーソース： 「カスタムレイヤー」
- カスタムレイヤー： 「requests-BeutifulSoup4」
- バージョン： 1

![スクリーン ショット 2023-12-25 に 00.00.18 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/ac50e44e-3114-dcc2-5aa5-727e41b0bb34.png)

次に、AIにこの関数を解釈させるために必要となる「APIスキーマ」のドキュメントを作成してS3バケットに配置しておきます。

あなたのPCローカルで以下のテキストファイルを作成し、`tokyoWeather.yaml` という名前で保存してください。

```yaml:tokyoWeather.yaml
openapi: 3.0.0
info:
  title: Lambda
  version: 1.0.0
paths:
  /search:
    get:
      summary: Weather Search
      description: 東京の今日・明日の天気を検索します。もしKDDIアジャイル開発センター（KAG社）に関する質問を受けた場合は、この関数ではなくナレッジベースを参照して回答を生成してください。もし東京の今日・明日の天気でもなく、KDDIアジャイル開発センター（KAG社）にも関係ない質問を受けた場合は、回答を控えずに一般的な知識に基づいて回答を生成してください。
      operationId: search
      responses:
        "200":
          description: 検索成功
          content:
            application/json:
              schema:
                type: object
                properties:
                  body:
                    type: string

```

マネコン上部の検索バーからAmazon S3のコンソールに移動し、「バケットを作成」をクリックします。

![スクリーン ショット 2023-12-25 に 00.16.30 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/211e9d2e-c146-47a0-50ff-eb9633cd905a.png)

バケット名に `（あなたの名前）-api-202401` といった世界で一意の名前を付けて、残りはデフォルトのまま「バケットの作成」をクリックします。

作成されたバケット名をクリックし、先ほどPCローカルで作成した `tokyoWeather.yaml` ファイルをドラッグ＆ドロップしてアップロードします。

![スクリーン ショット 2023-12-25 に 00.19.38 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/bca265d8-f993-3296-6153-ac3380c672a5.png)

確認画面で「アップロード」をクリックします。

![スクリーン ショット 2023-12-25 に 00.20.33 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/410e3def-3203-928d-8272-928187014079.png)

これでLambda関数の準備は完了です。


### 3-2. Agentを作成する

それでは今作成したLambda関数で天気を確認したり、先ほどのナレッジベースからKAGの情報を検索してくれるAIエージェントを作成してみましょう。

マネコン上部の検索バーからAmazon Bedrockのコンソールに移動し、画面左側のサイドバーから「Orchestration > Agents」を開いて「Create Agent」をクリックします。

![スクリーン ショット 2023-12-25 に 00.05.29 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/55733101-b94d-649a-ca93-395f31158b1a.png)

Step 1ではAgent nameのみ `weather-and-KAG` といった分かりやすい名前をつけて、他はデフォルトのまま「Next」をクリックします。

![スクリーン ショット 2023-12-25 に 00.08.04 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/7df24770-1bbd-c6c3-7b51-f3667cab651b.png)

以下を入力して「Next」をクリックします。

- モデル： Anthropic / Claude V2.1 ※もし今後V2.1が選べるようになったらそちらを。
- Instructions for the Agent： `もし東京の天気について質問されたらLambda関数を実行してください。もしKDDIアジャイル開発センター（KAG社）について質問されたらナレッジベースを参照してください。それ以外の場合は、Lambda関数やナレッジベースとは関係なく、一般的な質問への回答を生成してください。`

Step 3では「アクショングループ」を設定します。ここにAIへ実行させたいLambda関数の情報を入力して「Next」をクリックします。

- Action group name： `tokyoWeather`
- Lambda function： 「tokyoWeather」を選択する
- API schema： 「Browse S3」をクリックして、「minorun-api-202401 > tokyoWeather.yaml」をラジオボタン選択し「Choose」をクリックする

![スクリーン ショット 2023-12-25 に 00.26.39 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/01a89c86-e868-38b4-959e-9ab29b21fb08.png)

Step 4ではRAGに利用したいナレッジベースの情報を入力します。以下を入力して「Next」をクリックします。

- Knowledge base： `KB-StudyCo-202401`
- Knowledge base instructions for Agent： `もしKDDIアジャイル開発センター（KAG社）に関する質問を受けた場合は、このナレッジベースを参照して回答を生成してください。もし東京の今日・明日の天気でもなく、KDDIアジャイル開発センター（KAG社）にも関係ない質問を受けた場合は、回答を控えずに一般的な知識に基づいて回答を生成してください。`

確認画面が表示されたら「Create Agent」をクリックします。

![スクリーン ショット 2023-12-25 に 00.31.49 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/5a9d1ffc-ffc0-0791-5b1f-f65879672e76.png)


### 3-3. マネコン上からエージェントと会話してみる

エージェントの作成が成功したら、画面右側のプレイグラウンドからエージェントと試しに会話してみましょう。（AIが自律的に計画立案〜実行までを行うため、回答には少し時間がかかります）

![スクリーン ショット 2023-12-25 に 00.33.49 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/fbf7ff96-ca47-2b3c-09a1-7dd24de4abd2.png)

上の画像のようにKAGについては答えてくれるのですが、下の画像のように東京の今日の天気について聞くとLambdaの呼び出しが権限エラーになってしまいます。

![スクリーン ショット 2023-12-27 に 23.15.39 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/32f08e7e-d6ad-00a4-4620-fe9ec4164706.png)

これを解消するため、Lambda関数にアクセスポリシーを設定してあげましょう。
いま画面中央に表示されている「Agent ARN」をコピーしておいてください。

マネコン上部の検索バーからLambdaコンソールを開き、先ほど作成した「tokyoWeather」関数名をクリックして「設定 > アクセス権限」を開きます。

![スクリーン ショット 2023-12-25 に 00.37.35 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/b0225162-4aa9-7cfc-41ab-94eabb92be0b.png)

下の方へスクロールすると「リソースベースのポリシーステートメント」という項目があるので、「アクセス権限を追加」をクリックします。

![スクリーン ショット 2023-12-25 に 00.38.12 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/e69269d7-cddb-9658-1ecd-67b07d1f6121.png)

以下のとおり設定して「保存」をクリックします。

- 「AWSのサービス」を選択する
- サービス： Other
- ステートメントID： `agents-for-bedrock`
- プリンシパル： `bedrock.amazonaws.com`
- ソースARN： 先ほどコピーしたAgentのARNを貼り付ける
- アクション： lambda:InvokeFunction

![スクリーン ショット 2023-12-25 に 00.44.16 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/3d87cfb5-a346-254f-2ad1-529d9617232e.png)

これで再度、Agent for Bedrockに「今日の東京の天気」を尋ねてみると、Yahoo!天気を参照して正しく答えてくれるようになります。


### 3-4. PythonからAPIを呼び出してみる

今作ったエージェントをAPIから呼び出すために、必要となる情報を2点確認しておきます。

まずBedrockのAgentsコンソールに戻り、「weather-and-KAG」エージェントを開いて「ID」をメモしておいてください。

![スクリーン ショット 2023-12-25 に 01.12.37 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/46b8a563-3468-9cfc-d9d8-2d469dd5f205.png)

その後、画面右上の「Create Alias」をクリックしてエイリアス（≒バージョン）を作成します。

分かりやすく `v1` とでも名前をつけて「Create Alias」をクリックします。

![スクリーン ショット 2023-12-25 に 01.14.59 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/8ef099c8-0897-efc0-e7df-08b8327a9d44.png)

下の方にスクロールすると「Aliases」の項目があるので、今作成した「v1」エイリアスの「Alias ID」をメモしておきます。

![スクリーン ショット 2023-12-25 に 01.16.12 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/9e40bd17-f0d2-35ee-8f22-376dfdaec744.png)

マネコン上部の検索バーからCloud9のコンソールに移動し、また先ほどと同じ開発環境へ「開く」からアクセスします。

![スクリーン ショット 2023-12-24 に 23.37.56 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/63778088-fc09-1006-2226-a33ab31a3867.png)

IDE画面下部のターミナルで以下コマンドを実行します。

```bash:Cloud9 コンソール
cd ~/environment/studyco202401 #作業フォルダーへ再度移動する

touch 4-agent.py #次に使うPythonファイルを作成する
```

画面左側のツリーから、作成した `4-agent.py` ファイルをダブルクリックしてエディターで開きます。そこに以下のコードを入力しましょう。

※10/11行目にエージェントのIDとエイリアスのIDを入力する必要があるので、先ほどメモした値を `XXXXXXXXXX` の代わりに記載してください。

:::note info
コードの分量はそこまで多くないので、できればコピペではなく自分で実際に入力してみてください。その方がとても理解が進みます。
:::

```py:4-agents.py
# 必要なPythonライブラリをインポートする
import uuid
import boto3

# Bedrock Agent API呼び出し用のクライアントを作成する
client = boto3.client("bedrock-agent-runtime")

# Bedrock Agent APIに渡す必要のある変数を事前に定義する
session_id:str = str(uuid.uuid1())
agent_id:str = 'XXXXXXXXXX' #ここにAgentのIDを入れる
agent_alias_id:str = 'XXXXXXXXXX' #ここにAgentのエイリアスIDを入れる
input_text = "KAGってどんな会社？" #ここにAIへの質問を入れる

# Bedrock Agent APIをクライアントから実行する
response = client.invoke_agent(
    inputText=input_text,
    agentId=agent_id,
    agentAliasId=agent_alias_id,
    sessionId=session_id,
    enableTrace=False
)

# 実行結果からテキストのみを変数に入れて、画面に出力する
event_stream = response['completion']
for event in event_stream:        
    if 'chunk' in event:
        text = event['chunk']['bytes'].decode("utf-8")

print(text)
```

入力後、`command + s`（Windowsの場合は `Ctrl + s`） でPythonファイルを上書き保存します。

Cloud9コンソール下部のターミナルで、このPythonコードを実行してみましょう。

```bash:Cloud9 ターミナル
$ python3 4-agent.py 
KAG社はKDDIアジャイル開発センター株式会社の略称で、KDDIグループのITサービス企業です。KAGでは生成AIの理解と技術力向上を目的としたKAG Generative AI Labを設立し、Azure OpenAI ServiceやAmazon Bedrockなどを用いた生成AIを活用したプロダクト開発を行っています。
```

PythonアプリケーションからもナレッジベースをAPI経由で利用することができましたね！
KAGの質問だけでなく、明日の東京の天気やその他の質問なども試してみてください。


# 4. お片付け

予期せぬ課金発生を防ぐためにも、以下を忘れず実施ください！

### 4-1. Agentsを削除する

### 4-2. Knowledge Baseを削除する

### 4-3. S3バケットを削除する

### 4-4. OpenSearch Serverlessのコレクションを削除する

:::note warn
これがめちゃくちゃ重要です！ハンズオン終了までに絶対忘れず消してください。
（例えば1日放置すると、千円以上の課金が発生してしまうことがあります）
:::

### 4-5. Lambda関数とレイヤーを削除する

### 4-6. Cloud9環境を削除する


# おわりに

こちらを実際に試されてみて、もし上手く動かない点やお気づきの点などあればコメント欄やTwitter（[minorun365](https://twitter.com/minorun365)）にてフィードバックくださいますと大変幸いです！

…1時間半で終わるかなぁ😂