Amazon Bedrockをいろいろお試し(Step Functionsの連携・ナレッジベースの利用)

# アジェンダ
1.　概要
2.　検証前提
3.　Bedrockの基本操作検証
4.　Step Functionsの連携検証
5.　ナレッジベースの利用検証
6.　所感

---
# 1.　概要
Amazon Bedrock(以下Bedrock)とAWS Step Functions(以下Step Functions)との連携ができるようになりました。(2023/11)
また、Bedrock内で、Anthropic の Claude 3 Haiku 基盤モデルがナレッジベースで一般利用可能となりました。(2024/4)

本記事ではBedrockの基本的な使用方法や、
Step Functionsの連携方法、ナレッジベースの使用方法を検証していきます。

:::note info
以下で公式アナウンスが発表されています。
[AWS Step Functions が Amazon Bedrock 向けに最適化された統合の提供を開始](https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-step-functions-optimized-integration-bedrock/)
[Amazon Bedrock のナレッジベースが Claude 3 Haiku のサポートを開始](https://aws.amazon.com/jp/about-aws/whats-new/2024/04/knowledge-bases-amazon-bedrock-claude-3-haiku/)
:::


---
 **Bedrockとは** 
 >**Amazon Bedrock は、主要な AI スタートアップや Amazon が提供する高パフォーマンスな基盤モデル (FM) を、統合 API を通じて利用できるようにするフルマネージド型サービス**です。さまざまな基盤モデルから選択して、ユースケースに最適なモデルを見つけることができます。Amazon Bedrock には、セキュリティ、プライバシー、責任のある AI を備えた生成 AI アプリケーションを構築するためのさまざまな機能も用意されています。Amazon Bedrock を使用すると、ユースケースに適した最善の基盤モデルを簡単に試して評価したり、ファインチューニングや検索拡張生成 (RAG) などの手法を使用して基盤モデルをデータでプライベートにカスタマイズしたり、エンタープライズシステムやデータソースを使用してタスクを実行するエージェントを構築したりできます。
Amazon Bedrock のサーバーレスエクスペリエンスを使用すると、インフラストラクチャを管理することなく、すばやく開始し、独自のデータを使用して基盤モデルをプライベートにカスタマイズし、 AWS ツールを使用して簡単かつ安全に統合してアプリケーションにデプロイできます。
：[AWS公式サイト](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/what-is-bedrock.html)から引用

簡単にまとめます。
・Amazon Bedrockとは、AIが使えるサービス
・ユースケースに合わせて複数の選択肢から最適な基盤モデルを選択できる
（日本語未対応モデルもあり）
・サーバーレスを利用することにより簡単に使用を開始できる
・細かい設定や拡張機能の使用も可能で、自由にカスタマイズできる
・AWSの他のサービスとの連携も可能

 ---
 **AWS Step Functionsとは** 
 >AWS Step Functions は、分散アプリケーションの構築、プロセスの自動化、マイクロサービスのオーケストレーション、データおよび機械学習 (ML) パイプラインの作成に役立つビジュアルワークフローサービスです。
：[AWS公式サイト](https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/welcome.html)から引用

今回の検証にあたり触ってみた部分も含めてまとめると、以下の通りです。
・AWS Step FunctionsからはLambda等のAWSサービスを呼び出してタスクを実行できる
・独自のワークフローをゼロから作成するだけではなく、用意されたテンプレートも使用できるため、GUIベースで簡単にワークフローを作成できる
・2023年11月の公式アナウンスで、AWS Step FunctionsからAmazon Bedrockを実行することでワークフロー機能の中にAI機能を組み込むことが可能になったことが発表された

 ---
 **Amazon Bedrock のナレッジベースとは**
 >Amazon Bedrock のナレッジベースでは、データソースを情報のリポジトリにまとめることができます。ナレッジベースを使用すると、検索拡張生成 (RAG) を活用したアプリケーションを簡単に構築できます。RAG は、データソースから情報を取得することでモデルレスポンスの生成を強化する手法です。
 ナレッジベースは、ユーザークエリへの回答やドキュメントの分析だけでなく、プロンプトにコンテキストを提供することで基盤モデルに提供されるプロンプトを強化するためにも使用できます。ナレッジベースのレスポンスには引用も付いているため、ユーザーはレスポンスの基になっているテキストを正確に調べることで詳細な情報を見つけたり、そのレスポンスが意味のあるもので事実に基づく正確なものかどうかを確認したりできます。
 ：[AWS公式サイト](https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/knowledge-base.html)から引用

簡単にまとめます。
・ナレッジベースを使用することで、LLMとRAGを組み合わせてより正確な回答をAIが返せるようになる
・コンテキスト(外部情報や追加の文脈)も追加でき、さらに正確な回答をAIが返せるようになる
・AIの回答には引用元が含まれているため、回答の基になっている情報にアクセスすることで正確性を確認できる

詳しくはこの後の検証で動作を確認します。


---
# 2.　検証前提

・AWSにアクセスできる環境があること
 　※ユーザのセットアップなどは省略
・使用リージョン：米国西部 (オレゴン) 
 　※Amazon BedrockナレッジベースのClaude 3 Haikuモデルは、
 　  米国東部 (バージニア北部) および米国西部 (オレゴン)のみ利用可能 (2024/6現在)
    
--- 
 # 3.　Bedrockの基本操作検証

①AWSマネジメントコンソールからBedrockにアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/5279a71d-f195-fb1c-8dc8-aa40a6f4a2e2.png)

---
②モデルアクセスページに移動して、「モデルアクセルを管理」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/71421568-4cb2-29f2-279b-5bb168859426.png)

---
③使用したいモデルを選択して「モデルアクセスをリクエスト」
　※リクエストから許可まで時間がかかる場合があります。
　※リージョンによって対応しているモデルが異なります。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/dd5ae5cf-d64a-a973-1016-11041da5e8c2.png)

---
④モデルアクセスが許可されたら、「使用を開始」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/1952c399-f58f-d54f-256e-9e932a3fea88.png)
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/f6b684d8-6f0b-11b6-49b7-820dabc5ba17.png)

---
⑤使いたいプレイグランウンドを選択して「モデルを選択」
　※今回はチャットを使用
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/4dcef90a-f3bf-1592-5621-951b620d5eff.png)

---
⑥許可されたモデルの中から使用するモデルを選択して「適用」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/330b928f-d3a2-5725-dc28-c99b53c58b7d.png)

---
⑦プロンプトを入力したり、設定を変更してLLMの利用ができる
　※設定内容はモデルによって異なるため、[公式サイト](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html)を参照して検証してみると面白いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/d53924eb-f253-fef1-262e-ac4deec54cb9.png)

---
参考）札幌 名古屋間の移動手段を聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/6264b33b-c394-cfe2-5d33-743d6f7fe90c.png)

---
⑧CloudTrailに利用状況は記録される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/8088e190-f32f-5e3e-f100-106631e43714.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/19d5aa6c-94ed-b0eb-12f3-894ee3d6026c.png)


JSON形式のイベントレコードを確認すると、以下が記載されていました。
・実行日時
・実行者(IAMユーザー情報)
・呼び出しモデル

---
⑨CloudWatchへのログ記録をONにする
　※Bedrockの設定から指定でき、出力先としてはCloudWatchとS3が使用可能
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/7f92325b-28a7-372c-1616-bd196428ea3c.png)

---
⑩CloudWatchから記録されたログを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/f02057cf-ad49-99f6-568d-5036fd009e0f.png)


JSON形式のメッセージを確認すると、以下が記載されていました。
・実行日時
・実行者(IAMユーザー情報)
・呼び出しモデル
・プロンプト内容
・回答内容

---
#  4.　Step Functionsの連携検証

①マネジメントコンソールからAWS Step Functionsにアクセスして「今すぐ始める」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/2207e852-5f3d-be72-5e74-f99e594e47f4.png)

---
②「テンプレートを選択」
　※「自分で作成する」を選択すると、ワークフローを用途に合わせてカスタムメイクできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/03b0062f-72e5-2d9f-c230-e4ed39646325.png)

---
③テンプレートの中から「Bedrockでプロンプト…」を選択して「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/5ad97cf3-6e6e-f81d-ccd4-c5930f01205d.png)

---
参考）プロンプトチェイニングとは何か、Bedrockの基本操作方法を用いて聞いてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/0ebfaaf6-4333-0895-0278-779d157b60e3.png)


---
④「デモの実行」を選択して「テンプレートの使用」

　このテンプレートでは、3つのプロンプトを連続で実行して、
　前のプロンプトの回答の情報をもとに次のプロンプト回答を生成するフローになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/515f23ef-8380-a851-0453-5c043239512c.png)

---
⑤テンプレート通りに3つのプロンプトからなるワークフローが作成されたので、「デプロイと実行」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/2438f21d-e399-9306-e475-bba10c4640f5.png)

---
⑥プロンプトを入力して「実行を開始」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/da391cff-5a26-b7c8-508e-7e31d74edcc5.png)


---
⑦実行に成功したので結果を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/57703679-a810-af06-99c5-d01640390183.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/017dddd8-9c1f-809b-b8f0-f803a0694cfe.png)


---
⑧テンプレートの中身を確認

⑧-1 アクション「Invoke Invoke model with first prompt」
　設定：使用するモデルや、プロンプトをパラメータとして渡すためのJSONを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/78340fbe-f260-0cb8-e98e-5d58b9486bee.png)

　入力：前のステップの出力を入力値に組み込む場合に設定(今回は設定なし)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/c664444e-f75f-c025-85a1-7ef1b07a35e1.png)
 
　出力：出力結果のハンドリング方法を指定
 　　　(今回はプロンプトの回答を戻り値として出力する設定がされている)
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/8d578e70-4dca-2702-a989-7b40389da2dd.png)
 
　エラー処理：エラーハンドリング方法を指定(今回は設定なし)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/9aee20dc-8c39-2f73-1345-01dcb6dec859.png)

---
⑧-2 フロー「Add first result to conversation history」
　設定：パスステートのため特に設定なし
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/619a04ed-8d21-1fa4-21ed-05e08bdcd57e.png)

　入力：次のステップに入力値を渡すための変換方法を設定
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/4335deb5-c80e-1178-a53f-df6c86e55b29.png)

　出力：変換された入力値を次のステップに渡す方法を設定
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/06a163c2-7ef4-709d-e560-4f443fa61cc3.png)

 ---
⑧-3 アクション「Invoke model with second prompt」
　⑧-1とほぼ同一のため省略

⑧-4 フロー「Add second result to conversation history」
　⑧-2とほぼ同一のため省略

⑧-5 アクション「Invoke model with third prompt」
　⑧-1とほぼ同一のため省略

---
#  5.　ナレッジベースの利用検証
 
①ナレッジベースとするファイルをS3に格納
　※今回は労働基準法全文を格納
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/bab42652-b6c5-8990-cbba-d86f781320ac.png)


---
②Bedrock内で「ナレッジベースを作成」
![ナレッジベース作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307796/a50a62f8-c87d-14bf-961a-554225d48209.png)

---
③ナレッジベースの詳細を入力し「次へ」を押下 
　※今回はIAMロールを新規作成
![ナレッジベースの詳細を入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307796/1ac92dd3-a5e6-0b1c-43f2-ec735d1c5795.png)

---
④データソースとして①のS3のURIを指定して「次へ」
![データソースを設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307796/85ab6ecb-c2b4-4d29-dab1-86d6cdf21e3b.png)

---
⑤埋め込みモデルとベクトルデータベースの選択
　※埋め込みモデル：データソースから取得した情報を変換する際に使用されるモデル
　※ベクトルデータベース：埋め込みを保存、更新、管理するためのベクトルストア
　※ベクトルデータベースで「新しいベクトルストアをクイック作成」とすると、
　　Amazon OpenSearch Serverlessの新規ドメインが作成され、別途料金が発生する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/64331edd-5c6f-41ef-ea4d-acbb0643217c.png)


---
⑥内容を確認して「ナレッジベースを作成」
![最終確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307796/7068f56a-4434-cb94-9a41-f8faf3ed84c3.png)

---
⑦ナレッジベースをテストから「モデルを選択」
![テスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307796/318dd886-acd5-b017-b06b-49e86af389fd.png)

---
⑧モデルを選択して「適用」
　※今回は2024年4月から一般利用可能となった、Claude 3 Haikuを選択
![Haikuを選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307796/c1a85260-133b-f606-fbcb-08ac41fd98cc.png)

---
⑨ナレッジベースをテストから「データソースを同期」して①で格納したファイルを⑤で指定したベクトルストアに読み込み
![同期.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307796/08f1d828-74ab-c6fb-2760-a44eb16604ff.png)

---
⑩実際にプロンプトを投げて回答を確認
　⇒S3に格納した労働基準法全文から回答を生成し、引用元に遷移可能なリンクも回答に含まれる
![実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3307796/48c66baa-2696-ade4-0333-81c67bfc96a9.png)

---
参考）Bedrockの基本操作方法を用いて同じプロンプトを投げてみます。
　⇒回答に含まれる情報はほとんど同じ
　⇒ナレッジベースを利用すると、情報源から引用されていてより正確な情報が得られる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525311/e9eb852c-8d90-60a6-768d-64da52a3f3d5.png)


今回は労働基準法を用いましたが、プロンプト実行者が所属する組織の規則等をナレッジベースに格納することで、プロンプト実行者の属性に合わせた回答が得られます。
これにより、LLMとRAGを効果的に掛け合わせることができ、回答の精度が上がります。

---
# 6.　所感

AWSのサービス全体的に見ても、AI関連に力を入れていることは感じます。
その一部として、Bedrockも徐々に機能が広がっており、Step Functionsで使えるテンプレートやアクションも増えてきています。
一方で、リージョンや日本語に対応しているモデルが限定的であるなど、まだ日本のユーザーが本格的に使うためには壁がありそうです。
検証してみて感じたことは、Bedrockに限らずAWS全般への知識がない人が触ってみるのはハードルが高い、ということです。
他のサービスと連携させるときはもちろんですが、Bedrockだけを利用するときも料金体系等、AWS関連で何かしら触ったことがある人でないとすぐに理解するのは難しいと思います。
すでにAWSのサービスを何かしらの用途で使っていて、それと連携したAI機能に興味があるという方は、検証として触ってみるのは面白いのではないでしょうか。


---
# さいごに
 株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：

https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area