AWS公式のAmazon Bedrock Agentsハンズオンがとても良かった!!


# はじめに

こちらのAWS公式ハンズオンをやってみました！

https://catalog.us-east-1.prod.workshops.aws/workshops/e8b63498-d532-4dd4-b392-622ee65bea94/ja-JP

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/62c645b5-6937-3deb-636b-58c969881514.png)

:::note
この記事は、ハンズオンで学んだ内容を備忘的に残すことを目的とさせていただいてます。
詳細な手順などはAWSのハンズオンページをご確認ください！
実際に手を動かすことによって得られる学びは非常に大きいので、是非ご自身でもやってみていただければと思います！
:::


# 1.環境準備
Claudeのモデルアクセスを有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/0d4700da-29a0-3544-2273-4ad8c263eb1c.png)


# 2.環境構築
2-1. Amazon Bedrock Agentsの作成
2-2. Amazon DynamoDBの作成
2-3. AWS Lambda関数の作成
2-4. アクショングループの追加（在庫追加）
2-5. アクショングループの追加（製品情報検索)

## 2-1. Amazon Bedrock Agentsの作成
>ここでは、マネジメントコンソールにログインし、生成AIサービスの Amazon Bedrock の Agent を作成します。

こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/2fcec8d1-84ec-d3a6-bccc-0ac245afed14.png)

:::note
今回は触りませんでしたが、「その他の設定」からCode Interpreterやユーザー入力の有効/無効を設定できるんですね！！簡単！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/7137baac-0ddf-34b9-6fd9-d3b6067557e3.png)
:::

アクショングループを追加して終了。

最後に「準備」を押すのを忘れないように！！
「準備」を押すことでステータスが `PREPARED` になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/8b104e01-47aa-5c21-02a5-51a55028aa27.png)


## 2-2. Amazon DynamoDBの作成

>ここでは、Amazon Bedrock の Agent が在庫の確認のためにアクセスする倉庫在庫DBである Amazon DynamoDB を作成します。

テーブルを作成し、レコードを1件手動で登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/784801f4-3c00-15d4-f37b-c1b2bb01ff75.png)
※`weight` が文字列型なのが解せない！w


## 2-3. AWS Lambda関数の作成
>ここでは、Amazon Bedrock の Agent が実行するアクショングループファンクションである Lambda関数 を作成します。

アクショングループ作成時に生成されたLambda関数の設定を行います。
まず、用意されているコードをコピペしてデプロイ。
DynamoDBのテーブルから特定の商品名に基づいて在庫情報を取得し、レスポンスを返すコードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/2692378f-2844-cb2e-c92b-26be6ee35ccd.png)

続いて、Lambda関数に紐づけられたIAMロールに、DynamoDBの操作権限を付与。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/726763f3-3b05-78a2-e07c-c5d01a8193b1.png)

続いてAgentの動作確認を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/03f662aa-2021-2d50-2aec-d998cc19876d.png)
いい感じ！

:::note
今回作成したAgentの設定では「ユーザー入力」は無効（デフォルト）になっているのに、上記の動作確認では、Agentがちゃんと足りない情報（今回は製品名）を聞き返してくれましたw
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/8fbcdc74-0c7d-c25b-8b75-a2deddecb6b7.png)
これは如何にw

推察するに、、
今回はアクショングループで必須のパラメータが設定されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/594ae817-5db2-5ef1-ecc9-cfa3cce63be6.png)
その状況で、必須パラメータに該当する情報がプロンプトに含まれていなかった場合、Agentが実行計画考えるときに、「製品名の情報ないとどうしようもないしな、、ユーザー入力無効やけどこればっかりはな、、」と思い至り、聞き返してくれるのかもしれません。

トレースを見ても、そのような雰囲気を感じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/6c2159eb-b8c2-3dd0-add8-59c41085655d.png)

:::


## 2-4. アクショングループの追加（在庫追加）

>ここでは、Amazon Bedrock の Agent が実行するアクショングループを追加して、自然言語によるリクエストによって、在庫の追加を実行できるようにします。

まず、在庫追加用のアクショングループを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/d5963551-eccf-6d70-e930-a654ac0a3009.png)

続いて、「エージェント向けの指示」を書き換えます。
```
## 修正前
あなたは倉庫業務のエージェントです。入力に応じて在庫の検索や登録・更新を行います。使用できる言語は日本語のみです。


## 修正後
あなたは倉庫業務のエージェントです。入力に応じて在庫の検索や更新を行います。
使用できる言語は日本語のみです。
製品の在庫数を検索するリクエストは、製品名{product_name}を使ってアクションを呼び出します。
製品の在庫を追加するリクエストは、製品名{product_name}と数量{num}を使って、アクションを呼び出します。
<example>
"シャンプーは何個ですか"というリクエストの場合、{product_name}がシャンプーを表します
"シャンプーを10個登録したい"というリクエストの場合、 {product_name}がシャンプー、｛num｝が10を表します
</example>
```

2-3同様、アクショングループ作成時に生成されたLambda関数の設定を行います。
用意されているコードをコピペしてデプロイ。
DynamoDBテーブルを使用して商品の在庫数を更新するコードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/ac52d349-53b3-cddd-11ca-c75ad37152c5.png)

続いて、これまた先ほどと同様に、Lambda関数に紐づけられたIAMロールにDynamoDBの操作権限を付与し、Agentの動作確認を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/66148b94-88e5-7f6f-6d42-f3b12badd068.png)
いい感じですね！

DynamoDBのテーブルも更新されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b264f5d2-d380-b1fc-58e2-4dec14f3dbd5.png)


## 2-5. アクショングループの追加（製品情報検索)

>ここでは、Amazon Bedrock の Agent が実行するアクショングループを追加して、自然言語によるリクエストによって、製品情報を照会するようにします。

やることは2-4とほぼ一緒なので割愛します。



# 3.ホスティング
3-1. Agentのエイリアスの作成
3-2. Amazon VPCの作成
3-3. Amazon EC2の作成

## 3-1. Agentのエイリアス作成
>チャットアプリケーションからアクセスするためのAgentのエイリアスを作成します。

Agentのエイリアスはエージェントのデプロイ戦略に欠かせないものです。
詳細はこちらをご確認ください。

https://aws.amazon.com/jp/blogs/news/best-practices-for-building-robust-generative-ai-applications-with-amazon-bedrock-agents-part-2/


というわけで、張り切ってエイリアス作成！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b87a64c3-feb2-a360-a07c-383290e01025.png)


## 3-2. Amazon VPC
>Amazon EC2をデプロイするためのAmazon VPC を作成します。

VPC、サブネットなどを作っていきます。

VPCを作るのと同時にサブネットやルートテーブルの設定もできます。
いい時代になりましたw
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/53e4d729-3ab5-470e-92e4-efa9e0be76fe.png)


## 3-3. Amazon EC2の作成
>チャットアプリケーションを展開する Amazon EC2 を作成します。

EC2を作成して、ユーザーデータでStreamlitを入れています。
EC2からBedrockにアクセスできるように、EC2に紐づくIAMロールに `AmazonBedrockFullAccess` を付与し、動作確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/f939b941-e6e8-7c76-5c4f-8a2c92dab3af.png)
できた！！


# 4.片付け

:::note warn
忘れずにやりましょう！
:::

4-1. Amazon EC2の削除
4-2. AWS Lambdaの削除
4-3. Amazon DynamoDBの削除
4-4. Amazon Bedrock Agentsの削除


# 終わりに
以上、AWS公式のAmazon Bedrock Agentsハンズオンをやってきました。
Agentsの構築の仕方、動き方の理解が非常に深まりました。

ただ、今回のハンズオンではアクショングループの利用にとどまり、ナレッジベース（RAG）の利用はありませんでした。
 @minorun365 さん、@hedgehog051 さん、@moritalous さんが執筆された『Amazon Bedrock 生成AIアプリ開発入門』で紹介されているハンズオンは、ナレッジベースを含む広い範囲の機能を触れますので、こちらも是非お求めいただければと思います。

https://qiita.com/yuki_ink/items/097bbe9893359e12996f

最後までお目通しいただき、ありがとうございました！