2024/3/11 今話題のClaude 3に対応したバージョンへ手順更新しました🎉
この記事について
AWSコミュニティ最大級のイベント「JAWS DAYS 2024」内のワークショップにて実施したハンズオンコンテンツとなります。
イベントでは口頭で説明しながら実施しますが、この記事さえ読めば誰でも体験できるように作っていますので、当日イベントにお越しになれない方もぜひご活用ください。(スムーズにいけば30分程度で完了します)
本ハンズオンの実施にあたり、多少の課金(数十円〜数百円以内)が発生することをご了承ください。実施後には忘れず不要なリソースの削除をお願いします。
なお、Bedrockのモデル呼び出し料金はAmazon製のTitanシリーズを除き、マーケットプレイス扱いとなるためAWSクレジット(クーポン)の適用範囲外となります。
※事前にAWSアカウントの作成をお願いします。クレジットカード情報が必要です。ログイン用のEメールアドレスとパスワードをお忘れなく!
そもそもBedrockって何だっけ?
こちらの資料で紹介していますのでご覧ください!
なお、凄腕Bedrockerの @hedgehog051 @moritalous と入門書を出版することとなりました。最新情報&ハンズオン多数をわかりやすく整理した決定版です。
すでに予約可能で、ありがたいことにAmazonのカテゴリー内でベストセラー1位となりました!
0. 事前説明(13:10-13:15)
以下スライドで簡単な事前説明を行います。
今回作成するアプリケーションの構成イメージ
1. 環境準備編(13:15-13:25)
以下の部分を作成していきます。
1-1. IAMユーザー作成
AWSアカウントを作成すると、登録したEメールアドレスに紐づく「ルートユーザー」という最高特権のログインユーザーが一つだけ作成されるのですが、権限が強いため普段の作業には専用の個別ユーザーを作成するのがベストプラクティスです。
これを「IAMユーザー」といいます。まずは作業用のIAMユーザーを作ってサインインし直しましょう。
なお、今回の手順ではルートユーザーのまま作業してしまうと、Bedrockのナレッジベース作成に失敗してしまう仕様のためお気をつけください。
AWSアカウントにサインイン
「ルートユーザー」を選択し、登録メルアドを入力して次へ → パスワードを入力
AWSマネジメントコンソール(通称マネコン)。クラウド管理者向けのホーム画面のようなものです
マネコン上部の検索バーで「IAM」を検索し、IAMコンソールへ移動
IAMコンソール左側の「ユーザー」 > 画面右の「ユーザーの作成」をクリック
- ユーザー名:
handson
- AWSマネコンへのアクセスを提供する: チェックを入れる
- ユーザータイプ: IAMユーザーを作成します
- コンソールパスワード: カスタムパスワードを選択し、パスワードを決めて入力(この後すぐ使います)
- ユーザーは次回サインイン時に新しいパスワード作成が必要: チェックを外す
上記のとおり設定して「次へ」
「ポリシーを直接アタッチする」を選択し、許可ポリシー上から2つ目の AdministratorAccess
にチェックを入れて、画面右下の「次へ」
「ユーザーの作成」をクリック
「コンソールサインインURL」をコピーしておく。
マネコン右上のAWSアカウント名をクリックして「サインアウト」
サインアウトできたら、ブラウザのアドレスバーに先ほどコピペした「サインインURL」を貼り付けてアクセス
専用URLを使ったおかげで「アカウントID」が入力済みのサインイン画面に飛びます。
- ユーザー名:
handson
- パスワード: 先ほど設定したIAMユーザー用のパスワード
無事にIAMユーザーでサインインできました。
ルートユーザー(登録メルアド)を使った場合と異なり、右上の表示が「AWSアカウント名」ではなく「IAMユーザー名 @ AWSアカウントID」になっています。
今回のハンズオンでは時間の都合上割愛しますが、このタイミングでIAMユーザーにMFA(多要素認証)を設定いただくことをセキュリティ上推奨します。
1-2. Cloud9起動
今回のハンズオンではAWSの「バージニア北部」リージョンのみを利用します。(Bedrockのナレッジベース機能が東京リージョン未対応のため)
以下の作業はすべて、AWSマネジメントコンソール画面右上のリージョン表示が「バージニア北部」(もしくはサービスによっては「グローバル」)となっていることを確認いただけると、トラブルがなくスムーズです。
マネコン上部の検索バーから「Cloud9」を探してクリック
「環境を作成」をクリック
- 名前:
handson
他はデフォルトのまま「作成」
既存のAWSアカウントを流用される場合で、もしデフォルトVPCを削除してしまっていた際は以下のコマンドをCloudShell等から実行すれば復元できます。
aws ec2 create-default-vpc
環境ができるまで1分ほどかかるので、別の作業に進んでしまいましょう。
2. ナレッジベース作成編(13:25-13:35)
以下を作成します。
2-1. 「社内文書」を準備
今回はAIに参照させる独自情報として、比較的最近のニュース記事を利用してみます。
KDDIアジャイル開発センター(通称KAG)という会社が、「かぐたん」というSlackチャットボットを開発したという最近の内容が書かれています。
上記のWebページを開き、ページ内を右クリックして「別名で保存」し、あなたの作業PCのデスクトップ等に単一のhtmlファイルとして保存しておきましょう。
2-2. S3バケット作成
マネコン上部の検索バーで「S3」を探してクリック
「バケットを作成」をクリック
- バケット名:
jawsdays2024-(あなたのニックネームなど)
S3バケットの名前は世界中でユニークである必要があるため、何でもいいので被らなさそうなバケット名を設定してください。
他はデフォルトのまま「バケットを作成」をクリック
作成されたバケット名をクリックして開く
オレンジ色の「アップロード」をクリック
「ファイルを追加」から先ほど保存したhtmlファイルを選択して、右下の「アップロード」をクリック
すぐに完了しますが、アップロード中はページを閉じないようにご注意ください。
2-3. ナレッジベース作成
繰り返しになりますが、ここはルートユーザー(Eメールアドレスでログイン)だと失敗します。作業用の handson
IAMユーザーでログインした状態で実施ください。
マネコン上部の検索バーで「Bedrock」を検索して移動
左上のハンバーガーメニュー( 三
マーク)を開き「ナレッジベース」をクリック
「ナレッジベースを作成」をクリック
ステップ1はデフォルトのまま「次へ」
ステップ2では「S3を参照」から先ほど作成したS3バケットを選択し、「次へ」
ステップ3では埋め込みモデルにAmazon製の Titan Embeddings G1 - Text
を選択し、「次へ」
※デフォルトでは、ベクトル変換した社内文書はOpenSearch Serverlessへ自動格納されます。
右下の「ナレッジベースを作成」をクリック
※ここから数分かかるので、画面を閉じないよう注意して次の作業へ進みます。
3. モデル有効化編(13:35-13:45)
以下を設定していきます。
3-1. Bedrockモデル有効化
マネコン左上のAWSロゴを右クリックして「新しいタブで開く」
※これによってナレッジベースの作成を継続させながら別の作業を並行できます。
新しいタブで開いたマネコンにて、上部の検索バーから「Amazon Bedrock」を探して移動
左上のハンバーガーメニューを開き、下方の「モデルアクセス」をクリック
右側の「モデルアクセスを管理」をクリック
Anthropicの「ユースケースの詳細を送信」をクリック
生成AIモデルの用途を記載します。(悩みすぎず、ざっくり入力しましょう)
- 会社名: あなたの所属会社名
- 会社サイトのURL: あなたの会社のHPなど
- 業界: あなたの会社の所属業界名
- 対象ユーザー:
社内の従業員
- Anthropicモデルの使用目的:
上記のいずれでもない
- ユースケースの説明:
個人検証
上記を記載し「送信」をクリック
以下のモデルをチェック
- Titan Embeddings G1 - Text
- Claude 3 Sonnet
- Claude
チェック後「モデルアクセスをリクエスト」をクリック
※1〜2分待つと、選択したモデルが「アクセスが付与されました」ステータスに変わります。
3-2. プレイグラウンドからチャット
画面左側の「プレイグラウンド > チャット」をクリック
「モデルを選択」から「Anthropic > Claude 2.1」を選んで「適用」をクリック
標準状態のClaudeモデルに質問してみましょう。画面下部のテキストボックスに かぐたんって何?
というプロンプトを入力して「実行」します
NTTドコモさんが2017年に開発したAIアシスタントだそうです。ホンマか?
※このように生成AIが知識範囲外の質問にウソの回答をしてしまう現象を「ハルシネーション」と言います。
言語モデルが生成するテキストは設定にもよりますが、同じプロンプトを与えても異なる内容が生成されることがあります。そのため上記の回答は一例となります。
3-3. ナレッジベースをマネコンからテスト
それでは、先ほどの最新ニュース記事を参照させるとClaudeの回答がどう変わるか確認してみましょう。
閉じずに置いておいたブラウザのタブを見ると、Bedrockのナレッジベース作成が完了しています。
右側のテスト用サイドバーの「データソースを同期」をクリックします
数十秒程度で同期が完了するので、その後「モデルを選択」より「Anthropic > Claude 2.1」を選んで「適用」をクリック
2024/3/11時点では、まだナレッジベースのテスト機能が最新版のClaude 3に対応していないため、暫定的にClaude 2.1を利用します。
右下のテスト用メッセージ欄に かぐたんって何?
と入れて「実行」をクリック
読み込ませた "社内文書" を元に、Claudeが今度は正しく回答してくれました!
もし 申し訳ありません。このリクエストには対応できません。
といった回答が返ってきてしまう場合、ナレッジベースの内部で一時的なエラーが発生している可能性があります。数秒おいて何度かリトライしてみてください。
※ちなみに本イベント当日、こんな新機能が追加されたので少しだけ画面レイアウトが変わっています。「社内文書」検索の精度向上ができそうなアツいアップデートです🔥🔥
4. アプリ開発編(13:45-13:55)
以下のアプリケーションを作成して実行してみます。
4-1. Cloud9でPythonアプリを作成
ナレッジベース単体の動作確認ができたので、これを実際に簡単なPythonアプリケーションから利用してみましょう。
まずは画面を移動する前に、ナレッジベース画面の中央にある「ナレッジベースID」をコピーして、どこかにメモっておいてください。この後すぐ使います。
マネコン上部から「Cloud9」を検索してクリック
ハンズオン冒頭で作成したCloud9環境 handson
が出来ているので、「開く」ボタンを押してCloud9 IDEを起動
数秒〜数十秒待つとブラウザ上であなた専用の開発環境にアクセスできます。(内部的にはEC2インスタンスがあなたのVPC上で起動されています)
画面中央のエディター領域にある「Welcome」タブ右側の「+」ボタンをクリックして「New File」から新規ファイルを作成
開いた空ファイル内に以下のコードをコピーして貼り付ける
# 外部ライブラリをインポート
import streamlit as st
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_community.chat_models import BedrockChat
from langchain_community.retrievers.bedrock import AmazonKnowledgeBasesRetriever
# 検索手段を指定
retriever = AmazonKnowledgeBasesRetriever(
knowledge_base_id="XXXXXXXXXX", # ここにナレッジベースIDを記載する
retrieval_config={"vectorSearchConfiguration": {"numberOfResults": 10}})
# プロンプトのテンプレートを定義
prompt = ChatPromptTemplate.from_template("以下のcontextに基づいて回答してください: {context} / 質問: {question}")
# LLMを指定
model = BedrockChat(model_id="anthropic.claude-3-sonnet-20240229-v1:0", model_kwargs={"max_tokens": 1000})
# チェーンを定義(検索 → プロンプト作成 → LLM呼び出し → 結果を取得)
chain = ({"context": retriever, "question": RunnablePassthrough()} | prompt | model | StrOutputParser())
# フロントエンドを記述
st.title("おしえて!Bedrock")
question = st.text_input("質問を入力")
button = st.button("質問する")
# ボタンが押されたらチェーン実行結果を表示
if button:
st.write(chain.invoke(question))
イベント中は時間が限られるため、コードは軽く口頭説明してコピペで進めてしまいますが、時間のある方はぜひコードを手打ちしてみてください。理解が断然深まります。
コードを貼り付けたあと、11行目の XXXXXXXXXX
の部分を先ほどコピーしたあなたのナレッジベースIDで置き換えておいてください。
その後、Command + s
(Windowsの場合は Ctrl + s
)を押してファイルの保存ダイアログを開く
Filenameに rag.py
と入力して、「Save」をクリック
左ペインのフォルダツリーを見ると、初期フィルダー直下に作成したPythonファイルが保存されていることが分かります。
このPythonアプリを実行してみます。
そのためにはCloud9を実行しているEC2サーバーへ、Pythonの外部ライブラリを3つインストールする必要があります。
Cloud9画面下部のターミナルに以下を貼り付けて実行してみましょう
pip install streamlit langchain==0.1.12 boto3
以下のライブラリがインストールされます。
- Streamlit:PythonでモダンなWebフロント画面を簡単に作成できる
- LangChain:LLMアプリでよく使うロジックを簡単に記述できる
- Boto3:PythonでAWSサービスを操作するSDK(LangChainに内包)
4-2. アプリケーションを実行
完了したら、以下のコマンドを実行してPythonコードをStreamlitで稼働させましょう。
streamlit run rag.py --server.port 8080
上手くいくとアプリケーションにアクセスするためのURLがターミナル上に出力されます。
Cloud9画面上部の「Preview > Preview Running Application」をクリック
画面右下にWebブラウザのプレビュー画面が開きます。
表示領域が小さいので、タブをドラッグ&ドロップして画面上部のコード編集領域に移動させましょう。
実際にプレビューウィンドウからWebアプリを使ってみましょう。
テキストボックスに かぐたんって何?
と入力して「質問する」ボタンをクリックしてみます
※Enterキーは反応せず、ボタンを押さないと送信されないので注意(うまく処理が始まるとプレビュー画面右上に「RUNNING...」ステータスが表示されます)
数秒待つとアプリ画面下部に回答テキストが表示されます。
無事に "社内文書" を参照して回答を生成してくれました!
今回作成したアプリケーションの構成を再掲しておきます。
5. お片付け(13:55-14:00)
ハンズオン実施後、作成したリソースを放置しておくと思わぬ高額請求に繋がる恐れがあります。
特に 5-3
のOpenSearch Serverlessコレクションを消し忘れてしまうと1日あたり1,000円以上の課金が発生する可能性があるため、可能なかぎりハンズオンイベント中に削除まで実施してしまうことをお勧めします。
5-1. Cloud9環境の削除
Cloud9コンソールで今回利用した環境を選択し、「削除」をクリック
確認キーワードを入力して「削除」をクリック
5-2. ナレッジベースの削除
Bedrockコンソールで「オーケストレーション > ナレッジベース」から今回作成したナレッジベースを選択し、「削除」をクリック
確認キーワードを入力して「削除」をクリック
Bedrockのモデル自体は有効化したままでも実際に利用しない限り料金が発生しませんので、特段の対応は不要です。
5-3. ベクターDBの削除 【重要!】
OpenSearch Serviceコンソールで「サーバーレス > コレクション」から今回自動作成されているコレクション(検索インデックス)を選択し、「削除」をクリック
確認キーワードを入力して「削除」をクリック
5-4. S3バケットの削除
S3コンソールで今回作成したバケットをクリックし、「空にする」をクリック
確認キーワードを入力して「空にする」をクリック
画面上部の削除成功トーストにある「バケットの削除設定」リンクをクリック
確認キーワードを入力して「バケットを削除」をクリック
5-5. AWSアカウントの解約
AWSアカウントは残しておき、イベント後にこの環境を引き続き利用されたい方は、ルートユーザーやIAMユーザーにMFAを設定しておきましょう。不正ログインにより思わぬ高額請求などの被害に遭うリスクを減らすことができます。
- ルートユーザーへのMFA設定方法
- IAMユーザーへのMFA設定方法
- IAMユーザーの削除方法
もしこのAWSアカウントをしばらく使う予定がない場合、忘れないうちに解約してしまいましょう。
その場合、一度解約すると同じメールアドレスで再度AWSアカウントを作成できなくなってしまうため、事前にメールアドレスをあまり使わないものに変更したうえで解約されることをお勧めします。
以下リンクよりルートユーザー(契約時のメールアドレス)でAWSアカウントに再サインインします。
画面右上のAWSアカウント名をクリックして「アカウント」へ移動
メールアドレスを変更する場合、アカウント設定の「編集」から変えられます。
AWSアカウントを解約する場合、同じ画面の最下部の「アカウントを閉鎖」から手続きできます。
お帰り前に必ずアンケートにご回答ください🙏
実際にハンズオン体験してみて、いかがでしたか? ぜひ一言でもいいので率直な感想をお寄せくださいますと幸いです!
※本セッションのIDは E-6
となります(上記URLにアクセスすると自動入力されます)
おまけ:次のステップとして何に挑戦するのがいい?
レベル200
- 今回のプロンプトテンプレートの文言を改良して、回答品質を向上させてみる
- Agent for BedrockでAIエージェントにも挑戦してみる(以下参考)
レベル300
- ナレッジベースの埋め込みモデルや回答生成モデルを変えてみて、RAG回答品質や応答速度を比べてみる(以下参考)
レベル400
- 今回のPythonアプリをECSなどのインフラサービスでホストして、同僚にもWebブラウザーから使ってもらえるようにしてみる(Cognitoで認証をかけるなど、セキュリティ対策は忘れずに!)
※難しいのでClaudeに質問しながら構築してみましょう!
Bedrockerたちのブログも要チェック!
私の "推しBedrocker" の方々です。精力的にBedrockアウトプットをしてくださっており、とても勉強になります。