『Amazon Bedrock 生成AIアプリ開発入門』 から始めるAIエージェント

# はじめに
お疲れ様です。@yuki_ink です。

AWS コミュニティで活躍されている @minorun365 さん、@hedgehog051 さん、@moritalous さんが執筆された『Amazon Bedrock 生成AIアプリ開発入門』が、2024/6/26 (水) に発売されました。

https://www.google.co.jp/books/edition/Amazon_Bedrock_%E7%94%9F%E6%88%90AI%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/vNEOEQAAQBAJ?hl=ja&gbpv=0

Amazonのリンクは[こちら](https://amzn.asia/d/0gdUEbbr)。

大変ありがたい事に、著者の @minorun365 さんより書籍をご恵贈いただきました！
この記事は、その書評を個人の見解として述べるものです。
また、著書の中で紹介されているAIエージェントのハンズオンをやってみたので、その感想や、得られた学びについても触れます。

# Bedrockの最強の "バイブル"
書評です。
初めて本著を手にしたときの熱量をそのままに、書いていきたいと思います。

## 圧巻のボリューム

**お伝えしたいのが、「充実」という言葉では足りないほどのボリュームです。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/e9f78721-c7bd-0fe7-87ef-43ef78c1784f.png)
こちらの画像で伝わるでしょうか。本の厚さ、**約2.5cm**です。
ページ数にして、**528ページ**です。
また、以下記事によれば、重さは**955g**とのことです。

https://dev.classmethod.jp/articles/recommend-bedrock-genai-app-dev-intro/?s=03

目次を見てみましょう。
p6~p16の、**なんと11ページを目次が占めています**。
※[Googleブックスのプレビューのリンク](https://www.google.co.jp/books/edition/Amazon_Bedrock_%E7%94%9F%E6%88%90AI%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/vNEOEQAAQBAJ?hl=ja&gbpv=1&pg=PA6&printsec=frontcover)を貼っておくので、ぜひ見てみてください。

目次だけで、めちゃくちゃ内容が詰まっているのが分かると思います。

>1章.生成AIの基本と動向
2章.Amazon Bedrock入門
3章.生成AIアプリの開発手法
4章.社内文書検索RAGアプリを作ってみよう
5章.便利な自律型AIエージェントを作ってみよう
6章.Bedrockの機能を使いこなそう
7章.さまざまなAWSサービスとBedrockを連携しよう
8章.生成AIアプリをローコードで開発しよう
9章.Bedrock以外の生成AI関連サービスの紹介
10章.Bedrockの活用事例
11章.お勧めの最新情報のキャッチアップ方法

さらに、本著の内容にとどまらず、**サンプルコードの配布**までされているという。
さらにさらに、**刊行後のアップデートもコードに反映される予定**とのこと。

**圧倒的情報量！！圧倒的サービス精神！！**
初見から数分で、とんでもない本を戴いてしまったと思いました。

読み進めると、基礎から応用まで、基本から最新情報まで、本当に幅広く丁寧にBedrockについて語られており、著者の皆さんの熱意が伝わってきました。

しかも、**フルカラーで図も多く、読みやすく分かりやすい！！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b5da4667-8491-b12d-7c91-6aa47c8f31fd.png)
（出典）[Googleブックス プレビュー 『Amazon Bedrock 生成AIアプリ開発入門』18ページ](https://www.google.co.jp/books/edition/Amazon_Bedrock_%E7%94%9F%E6%88%90AI%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/vNEOEQAAQBAJ?hl=ja&gbpv=1&pg=PA18&printsec=frontcover)

## "生きた知識" が身につく
本著では多くのハンズオンが収録されています。
以下、目次からハンズオンの項目を抜粋します。

>- Bedrock を実際に試してみよう
    - プレイグラウンドを利用して GUI 上で生成する方法
    - AWS SDK を用いて各モデルの API へリクエストを行う方法
>- LangChain と Streamlit を使った生成 AI アプリ開発
>- AWS Lambda 上で動作する生成 AI アプリ開発
>- Knowledge bases で RAG を実装してみよう
>- LangChain で AI エージェントを実装してみよう
>- Agents で AI エージェントを作ってみよう
>- Bedrock と Step Functions を使った生成 AI アプリ開発
>- Amazon Q Business アプリ開発

Bedrockを初めて触るところから、各機能を使ったアプリ開発まで網羅されており、最後にはAmazon Q Businessのハンズオンも掲載されています！
**このハンズオンを一通りやれば、Bedrockの主な機能は使えるようになります。**

「ハンズオンやりたいけど、忙しくてできないよ」という方も、ご安心ください。
**手順1つ1つにスクリーンショットがついており、本を読むだけで、実際に自分が手を動かしているような気持ちになれます！！笑**
また、**豊富な注釈やコラム**によって、本来自分で手を動かして初めて得られるような、細かな注意事項・気づきのような内容も記述されており、
**この本を読むだけで、Bedrockに関する実践的な "生きた知識" が身につく**と感じました。

・・・

考えてみれば、著者の皆さんは普段から積極的にBedrockについて発信されている**強々Bedrocker**のお三方。
アップデートがあれば「宇宙最速」でキャッチアップし、アウトプットされている皆さんです。
いつも本当にお世話になっています！

そんな神々の英知がこの一冊の本に詰まっている…
まさしく、**Bedrockの最強の** **"バイブル"** です。

:::note
他の方が書かれた書評は[こちら](https://github.com/minorun365/bedrock-book?tab=readme-ov-file#-%E8%AA%AD%E8%80%85%E3%81%AE%E3%81%BF%E3%81%AA%E3%81%95%E3%81%BE%E3%81%AE%E6%9B%B8%E8%A9%95%E3%83%96%E3%83%AD%E3%82%B0%E7%B4%B9%E4%BB%8B)にまとめられていますので、ぜひご覧ください。
この本の魅力やおすすめの読み方など、様々な切り口で紹介されています。
:::


# 『Amazon Bedrock 生成AIアプリ開発入門』 から始めるAIエージェント
以上、僭越ながら書評を書かせていただきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b9be9b1b-39cd-2476-9f24-2c9c8a6dd5d2.png)

私自身は、この本のページをめくるごとに **「へー！！そんな機能あるんや！！めっちゃいいなこれ！！」** と言っているような身分につき、神々が記された内容を「批評」するというのは大変畏れ多いものがありました。
ここからは一読者として、大変勉強になった「AIエージェント」に関する内容について、アウトプットしていきたいと思います！！


## AIエージェントとは
>**AIエージェントとは、特定の環境下で目標を達成する（ユーザーの指示や質問に応える）ために、AI自身が行動を選択して実行するエージェントです。**
（出典）『Amazon Bedrock 生成AIアプリ開発入門』254ページ

最初に「エージェント」というワードを聞いたとき、「"JP1エージェント"とかのエージェント? なんかインストールすんの?? よくわからんな???」と思っていたのですが、親切な強々エンジニアの方に、**「"エージェント黄昏"のエージェントと思えば理解しやすいかな」** と教えていただき、衝撃を受けたことを覚えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/505400f3-546e-a80c-fbc4-9e1b70e33f2d.png)
（画像出典）https://spy-family.net/tvseries/episodes/episode1.php

**なるほど、上から命令を受けて、それをいい感じに実行してくれる人ね！**

## Agents for Amazon Bedrock とは
Agents for Amazon Bedrock はAWSでAIエージェントを簡単に構築・設定できるサービスです。
以下の記事の記載が分かりやすかったので、引用させていただきます。

https://qiita.com/nasuvitz/items/c34419150eaee78544cc#agents-for-amazon-bedrock%E3%81%A8%E3%81%AF

>**「Agents for Amazon Bedrock」を使用すると、OpenAIのFunction Callingと同様に、一番最初に発行したプロンプトの内容に応じて前処理を挟み、前処理の結果を参考にして生成したプロンプトをクエリすることができます。**
>
>この有難みが分かるシンプルな例としては 「今日の天気に応じた服装をレコメンドして」 というプロンプトを発行するケースが分かりやすいでしょう。
>生成系AIの基盤モデル (FMs) は、ある特定の時点までの情報を事前に学習しており、学習済みの情報から回答を生成できますが、例えは「今日の天気」のようなリアルタイムの情報は持っていません。
先ほどのようなプロンプトが発行された時には、まず「今日の天気」の情報を得るための仕組み(前処理)が必要になります。
>
>同じように、URLを与えて「この記事を要約して」というプロンプトを発行しても、基盤モデルはURLの先の記事内容を事前に学習しておらず、またURLを開く機能も持っていないため、同じく前処理としてURLを開いて情報を得なければなりません。
>
>「Agents for Amazon Bedrock」は、これらの課題に対応し、不足する情報を補うための前処理を挟みながら基盤モデルから回答を得る仕組みと言えます。


## ハンズオンやってみた
本著で紹介されているハンズオンの1つ「Agents で AI エージェントを作ってみよう」をやってみました！
ハンズオンでは、Agents for Amazon Bedrockを利用して、ユーザーの質問内容に応じて以下の3種類の動作を行うAIエージェントを開発しています。
| ユーザーの質問 | AIエージェントの動作 |
|-|-|
|AWSの最新情報に関する質問   |アクショングループ（Lambda関数）を実行して回答を作成する   |
|ナレッジベース内の情報に関する質問   |ナレッジベースを参照して回答を作成する   |
|それ以外の一般的な質問   |モデルが持つ知識を元に回答を作成する   |


:::note
以下、ハンズオンをやりながらの感想を書いていきます。
**詳細なハンズオン手順は、ぜひ本著をお手に取ってご確認ください！**

ハンズオン手順のなんとなくのイメージを持ちたい方は、以下の記事の内容が近しいかなと思いますので、ご参照ください。
[AWSの生成AI最新機能ハンズオン！BedrockのKnowledge BaseとAgentsに入門しよう](https://qiita.com/minorun365/items/86a3667290a8e5657f65)
※著者のお一人 @minorun365 さんの記事です！
:::

### Pineconeを準備する
ハンズオンでは、ナレッジベースで連携するベクトルDBとして「Pinecone」が利用されていました。
コスト的にもありがたい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/4019a061-cdb1-1e4f-a959-8a7fdf467f3f.png)

### ナレッジベースを作成する
ナレッジベースに入れるドキュメントについて、手順ではJPX（日本取引所グループ）の決算短信が使われていましたが、私はTransit Gatewayのドキュメントを入れてみました。

https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/what-is-transit-gateway.html

この謎のオリジナリティのせいで苦労したポイントがいくつかあったので、備忘として残しますw


#### 備忘① ナレッジベースの同期が警告終了
以下のような警告がでました。
```
Encountered error: Ignored 1 files as no text content found in the files [Files: document/(ドキュメント名).pdf]. Call to Amazon S3 Source did not succeed.
```
テキスト情報が含まれてないから無視したよ！というメッセージ。
いや、無視されたら困るんやが。。

調べてみると、**Webページを「PDF印刷」してしまったことによるエラーでした。**
PDF印刷すると文字情報って消えるんですね、、
初歩的な躓きでしたが、勉強になりました。

▼ PDF印刷、ﾀﾞﾒｾｯﾀｲ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/52c44d3d-74d3-28ac-f3bb-94c2597842b3.png)

上記を踏まえ、AWSから配布されているPDFをそのまま使う作戦にしました。

https://docs.aws.amazon.com/ja_jp/vpc/latest/tgw/vpc-tgw.pdf#what-is-transit-gateway

#### 備忘② ナレッジベースの同期が失敗
S3のドキュメントを格納し直して、よっしゃリベンジするで～と意気揚々と再同期をすると、今度は同期が失敗したとのこと。
こちらのエラーが出ていました。
```
The server encountered an internal error while processing the request.
```
調べたところ、似たような事象に遭遇された方がいらっしゃいました。

https://qiita.com/sugimount-a/items/1c01fbe962edaa9c9f1e#%E4%BB%98%E9%8C%B21--cohere-%E3%81%A7-300-chunk-%E3%81%A7-sync-%E3%81%97%E3%81%9F%E6%99%82%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E7%94%BB%E9%9D%A2

>Model Cohere の Embedding Model を選択した際に、以下のエラーが表示されることがありました。正確には AWS Support に問合せする内容だと思いますが、おそらく、Cohere Embed Multilingual Model の Chunk Size の上限 512 に引っ掛かっているエラーだと思います。Chunk Size をより小さくするとエラーがなくなったりもしていました。
>
>>The server encountered an internal error while processing the request.

先達の知見を得て、実践してみます。
ナレッジベースのデータソースは、一度登録してしまうと Chunk Size などの設定は変えられないので、別のデータソースとして再登録しました。

「チャンキング戦略」で「固定サイズのチャンキング」を選択。
もともとの「デフォルトチャンキング」でも最大300トークンとのことなので、あまり問題ない気はしますが。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/1b94319a-364e-e2cb-d7ea-485b189de581.png)

「最大トークン」は200、「チャンク感のオーバーラップの割合」は15%に設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/dfa6cb79-152c-b218-d6ba-8f49649fa985.png)

上記の要領でデータソースを作成し、再度同期。
エラーなく、正常に同期できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/04fc3b3b-ede4-f23f-e1cc-90c5863ffd5e.png)

動作確認も問題なさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/d32f2cac-5b52-51f4-3b8c-209014059050.png)


### Agentsを作成する
簡単に作成できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/1767b861-11bf-7399-11e2-97ac6870a3d7.png)

ここに、先ほど作ったナレッジベースやアクショングループ（Lambda関数）を関連付けていきます。

### 動作確認
というわけで、完成したエージェントがこちら！！
いい感じに動いてくれました。

#### AWSの最新情報に関する質問
```
AWSの最新情報について教えて。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b9fee073-66ff-17f6-d536-22b3e167ff50.png)

以下のWebページから情報を拾ってきてくれました！
おお、確かに最新情報だ！

https://aws.amazon.com/blogs/aws/aws-weekly-roundup-ai21-labs-jamba-instruct-in-amazon-bedrock-amazon-workspaces-pools-and-more-july-1-2024/

#### ナレッジベース内の情報に関する質問
```
Transit Gatewayの利用にあたり、ベストプラクティスを箇条書きで示してください。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/a4b28416-ff07-a66d-9486-556d90301ef6.png)

ちゃんと元ネタのドキュメントも示してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/1fb624df-c170-a87e-f65b-9e7ec0055548.png)

#### それ以外の一般的な質問
```
日本で一番高い山を教えてください。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/4f88de4e-3b87-8682-eac1-09b924a74824.png)

LLM（Claude 3）が持っている知識で回答してくれました。

### ハンズオンの感想
:::note
アプリケーションから上記のエージェントを呼び出したりするなど、まだまだハンズオンには続きがありますが、いったんここまでにしておきます！
かなり情報を端折りましたので、詳細が気になった方はぜひ本著をお求めください！
:::

「ハンズオン」というと、与えられた手順通りに無心で手を動かし、コードなどはコピー&ペーストで、最終的に、**なんか知らんけど動いた** という状況に陥ることもままあります。
しかし、**本著に掲載されているハンズオンは、ちゃんと我々に知見を与えてくれます。**

**「githubに上げているこのコードをコピペしてください。コピペしましたね？ じゃあ今からコードの解説しますね！（以降４ページもの詳細な解説）」** 
ほんとにこんな感じの流れなんですよ。
ちょっと感動しました。

「本」という形式もあるのかもしれませんが、PC画面上のハンズオン手順より「読み飛ばす」ということが難しく（いい意味で）しっかり読み込みができ、学びになります。

そしてなにより、**各操作が非常に細かく手順に落とされている**印象でした。
「もし自分がこのハンズオン書いたら、ここの手順書くのめんどくさくて端折っちゃうな…」という箇所がたくさんあり、**初心者にも優しい** とはこういうことかと思いました。



# 終わりに
以上、勢いで書評とハンズオン体験記を書いてきました。
最後までお目通しいただき、ありがとうございます。

末筆ではありますが、 @minorun365 さん、@hedgehog051 さん、@moritalous さん、改めてこの度はおめでとうございます。
そして、このような素晴らしい本をこの世に出していただき、本当にありがとうございます！

### ご案内
2024/07/04(木) 19:30〜、出版記念セッションが行われるようです！
直前ですが、ご案内させていただきます。

https://studyco.connpass.com/event/321443/?s=03