生成AI、流行ってますね!
今みんながやってる「社内文書検索」アプリ、いわゆるRAGアーキテクチャをAWSで簡単に作ってみましょう。1時間程度でサクッと試せるハンズオンです。
2024/9/3更新: 東京リージョン & Claude 3.5 Sonnetへ対応しました 🎉
そもそもBedrockって何だっけ?
こちらの資料で紹介していますので、お時間ある方はご覧ください!
0. 事前説明
このハンズオンで実施することは以下です。
今回作成するアプリケーションの構成イメージ
1. 環境準備
以下の部分を作成していきます。
1-1. AWSアカウント作成
以下の手順でAWSアカウントを新規作成してください。
クレジットカード情報が必要です。ログイン用のEメールアドレスとパスワードをお忘れなく!
※アカウント作成を複数名で同時に実施する場合、同じネットワークを利用すると不正検知に引っかかり、SMS認証から先にうまく進めない可能性があります。20名を超える場合は、会場Wi-Fiとテザリングを使い分ける等工夫ください。
本ハンズオンの実施にあたり、多少の課金(数十円〜数百円以内)が発生することをご了承ください。実施後には忘れず不要なリソースの削除をお願いします。
1-2. IAMユーザー作成
AWSアカウントを作成すると、登録したEメールアドレスに紐づく「ルートユーザー」という最高特権のログインユーザーが一つだけ作成されるのですが、権限が強いため普段の作業には専用の個別ユーザーを作成するのがベストプラクティスです。
これを「IAMユーザー」といいます。まずは作業用のIAMユーザーを作ってサインインし直しましょう。
なお、今回の手順ではルートユーザーのまま作業してしまうと、Bedrockのナレッジベース作成に失敗するためお気をつけください。
以下URLからAWSアカウントにサインイン
「ルートユーザー」を選択し、登録メルアドを入力して次へ → パスワードを入力
AWSマネジメントコンソール(通称マネコン)。クラウド管理者向けのホーム画面のようなものです
マネコン上部の検索バーで「IAM」を検索し、IAMコンソールへ移動
IAMコンソール左側の「ユーザー」 > 画面右の「ユーザーの作成」をクリック
- ユーザー名:
handson
- AWSマネコンへのアクセスを提供する: チェックを入れる
- ユーザータイプ: IAMユーザーを作成します
- コンソールパスワード: カスタムパスワードを選択し、パスワードを決めて入力(この後すぐ使います)
- ユーザーは次回サインイン時に新しいパスワード作成が必要: チェックを外す
上記のとおり設定して「次へ」
「ポリシーを直接アタッチする」を選択し、許可ポリシー上から2つ目の AdministratorAccess
にチェックを入れて、画面右下の「次へ」
「ユーザーの作成」をクリック
「コンソールサインインURL」をコピーしておく。
マネコン右上のAWSアカウント名をクリックして「サインアウト」
サインアウトできたら、ブラウザのアドレスバーに先ほどコピペした「サインインURL」を貼り付けてアクセス
専用URLを使ったおかげで「アカウントID」が入力済みのサインイン画面に飛びます。
- ユーザー名:
handson
- パスワード: 先ほど設定したIAMユーザー用のパスワード
無事にIAMユーザーでサインインできました。
ルートユーザー(登録メルアド)を使った場合と異なり、右上の表示が「AWSアカウント名」ではなく「IAMユーザー名 @ AWSアカウントID」になっています。
今回のハンズオンでは、東京リージョンを利用します。
右上のリージョン表示をクリックして、操作リージョンを東京に切り替えておいてください。
ハンズオンイベントでは時間の都合上割愛しますが、セキュリティ上、このタイミングでIAMユーザーにMFA(多要素認証)を設定いただくことを推奨します。
2. ナレッジベース作成
今回のメイン部分を作ります。
2-1. 「社内文書」を準備
今回はAIに参照させる独自情報として、比較的最近のニュース記事を利用してみます。
KDDIアジャイル開発センター(通称KAG)という会社が、「かぐたん」というSlackチャットボットを開発したという最近の内容が書かれています。
上記のWebページを、あなたの作業PCのデスクトップ等に kagutan.pdf
というファイル名で「PDFとして保存」しておきましょう。以下よりダウンロードください。
本ハンズオンでは動作確認の方法として、PinggyというWebサービスを利用し、作成したRAGアプリへ外部からのアクセスが可能なURLを一時的に発行します。
そのため、セキュリティ上の理由から「社内文書」のサンプルに用いるドキュメントは、機密情報などが含まれない外部公開OKのものをご利用ください。
2-2. S3バケット作成
マネコン上部の検索バーで「S3」を探してクリック
「バケットを作成」をクリック
- AWSリージョン: 東京
- バケット名:
handson-(年月日の数字)-(あなたのニックネームなど)
S3バケットの名前は世界中でユニークである必要があるため、何でもいいので被らなさそうなバケット名を設定してください。
他はデフォルトのまま「バケットを作成」をクリック
作成されたバケット名をクリックして開く
オレンジ色の「アップロード」をクリック
「ファイルを追加」から先ほど保存したPDFファイルを選択して、右下の「アップロード」をクリック
すぐに完了しますが、アップロード中はページを閉じないようにご注意ください。
2-3. ナレッジベース作成
繰り返しになりますが、ここはルートユーザー(Eメールアドレスでログイン)だと失敗します。作業用の handson
IAMユーザーでログインした状態で実施ください。
マネコン上部の検索バーで「Bedrock」を検索して移動
右上のリージョン表示が「東京」になっていることを再確認しておきましょう。
左上のハンバーガーメニュー( 三
マーク)を開き「ナレッジベース」をクリック
「ナレッジベースを作成」をクリック
ステップ1はデフォルトのまま「次へ」
ステップ2では「S3を参照」から先ほど作成したS3バケットを選択し、「次へ」
ステップ3では埋め込みモデルにCohere社の Embed Multilingual
を選択し、「次へ」
※デフォルトでは、ベクトル変換した社内文書はOpenSearch Serverlessへ自動格納されます。
右下の「ナレッジベースを作成」をクリック
※ここから数分かかるので、画面を閉じないよう注意して次の作業へ進みます。
3. 生成AIモデルの有効化
以下を設定していきます。
3-1. Bedrockモデル有効化
マネコン左上のAWSロゴを右クリックして「新しいタブで開く」
※これによってナレッジベースの作成を継続させながら別の作業を並行できます。
新しいタブで開いたマネコンにて、上部の検索バーから「Amazon Bedrock」を探して移動
左上のハンバーガーメニューを開き、下方の「モデルアクセス」をクリック
オレンジ色の「Enable all models」をクリック
すべてのモデルがチェックされている状態で、画面右下のオレンジ色「Next」をクリック
有効にしたモデルの数ぶん、AWS Marketplaceのサブスクライブ通知メールが飛んできますが驚かないで大丈夫です。
もちろん必要なモデルのみにチェックを絞ってもOKです。今回使用するモデルは以下です。
- Anthropic > Claude 3.5 Sonnet
- Cohere > Embed Multilingual
もしClaude 3.5 Sonnetが「利用不可」の場合は、代わりにClaude 3 Haikuを使って進めてください。
次のステップでは、Anthropic社の要件により、モデル用途を記載する必要があります。(悩みすぎず、ざっくり入力しましょう)
- 会社名: あなたの所属会社名
- 会社サイトのURL: あなたの会社のHPなど
- 業界: あなたの会社の所属業界名
- 対象ユーザー:
社内の従業員
- ユースケースの説明:
個人検証
など
上記を記載し「送信」をクリック ※以下の画面は少し古いものなので参考です。
最後の確認画面で、画面右下のオレンジ色「Submit」をクリック
※1〜2分待つと、選択したモデルが「アクセスが付与されました」ステータスに変わります。右上の更新ボタンでリロードできます。
3-2. プレイグラウンドからチャット
画面左側の「プレイグラウンド > チャット」をクリック
「モデルを選択」から「Anthropic > Claude 3.5 Sonnet」を選んで「適用」をクリック
標準状態のClaudeモデルに質問してみましょう。画面下部のテキストボックスに かぐたんって何?
というプロンプトを入力して「実行」をクリック
NTTドコモさんが2017年に開発したAIアシスタントだそうです。ホンマか?
※このように生成AIが知識範囲外の質問にウソの回答をしてしまう現象を「ハルシネーション」と言います。
言語モデルが生成するテキストは、同じプロンプトを与えても毎回異なる内容が生成されます。そのため上記の回答は一例となります。
3-3. ナレッジベースをマネコンからテスト
それでは、先ほどの最新ニュース記事を参照させるとClaudeの回答がどう変わるか確認してみましょう。
閉じずに置いておいたブラウザのタブを見ると、Bedrockのナレッジベース作成が完了しています。右側のテスト用サイドバーの「データソースを同期」をクリック
数秒で同期が完了するので、その後「モデルを選択」より「Anthropic > Claude 3.5 Sonnet」を選んで「適用」をクリック
右下のテスト用メッセージ欄に かぐたんって何?
と入れて「実行」をクリック
読み込ませた "社内文書" を元に、Claudeが今度は正しく回答してくれました!
もし 申し訳ありません。このリクエストには対応できません。
といった回答が返ってきてしまう場合、ナレッジベースの内部で一時的なエラーが発生している可能性があります。数秒おいて何度かリトライしてみてください。
4. アプリケーション開発
ナレッジベース単体の動作確認ができたので、これを簡単なPythonアプリケーションから実行してみましょう。
4-1. CloudShellでOSS版VS Codeを起動
ナレッジベースの概要画面は後で使うので開いておき、画面左上のAWSロゴを右クリックして、「新しいタブで開く」からマネコンを別タブで開きます。
開いた新規タブで、マネコン上部から「CloudShell」を検索してクリック
マネコン内であなた専用のターミナル(コマンドライン端末)が開きます。
アプリケーション開発用のエディタとして、OSS版のVS Code(code-server)をインストールしましょう。
以下のコマンドをCloudShellのターミナルにコピペして、Enter
キーで実行
curl -fsSL https://code-server.dev/install.sh | sh
インストールが完了し、入力を受け付けるプロンプトが点滅状態に復帰したら、以下を実行してcode-serverを起動
code-server --auth none
成功すると、このターミナルはcode-serverの実行状態になります。
このエディタ画面にアクセスするため、Pinggyというサービスを利用して一時的に外部公開URLを生成します。
CloudShellの最初のタブの右にある「+」をクリックして、「us-east-1」の新規タブを開く
開いた2つ目のターミナルで以下を実行
ssh -p 443 -R0:localhost:8080 a.pinggy.io
Are you sure you want to continue connecting (yes/no/[fingerprint])?
と質問されるので、 yes
と入力してEnterを押すと、外部公開URLが発行されます。
このURLが第三者に知られると、あなたのCloudShellにアクセス可能となってしまうため、不用意にURLを共有しないようご注意ください。
(なおPinggyは無料版の制約として、60分経つとURLが無効となります)
このうち https
で始まる方をコピーしてブラウザの新規タブで開き、赤色の「Enter site」をクリック
すると、ブラウザ上でVS Codeのようにリッチな開発環境にアクセスできました!
参考まで、以下のような仕組みでCloudShell上のcode-serverにアクセスしています。
4-2. Pythonアプリを作成
code-server画面左側、上から2つ目のアイコンをクリックして「エクスプローラー」を開き、「Open Folder」をクリック
画面上部のポップアップに自動でホームディレクトリのパス(/home/cloudshell-user/
)が表示されるので、「OK」をクリック
当該ディレクトリ配下のファイルの実行権限について、確認するモーダル画面が表示されたら「Yes, I trust the authors」をクリック
エディターの文字サイズが小さいので、見づらい場合はブラウザのズーム設定で文字を大きくしましょう。
左サイドバー上部の「New File...」アイコンをクリック
rag.py
というPythonファイル名を入力して、Enterを押すと新規ファイルの編集画面が開く
新規ファイル内に以下のコードをコピーして貼り付ける
# 外部ライブラリをインポート
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-5-sonnet-20240620-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))
イベント中は時間が限られるため、コードは軽く口頭説明してコピペで進めてしまいますが、時間のある方はぜひコードを手打ちしてみてください。理解が断然深まります。
もしClaude 3 Haikuを使う場合、18行目のモデルIDを以下へ置き換えてください。
anthropic.claude-3-haiku-20240307-v1:0
コードを貼り付けたあと、11行目の XXXXXXXXXX
の部分をあなたのナレッジベースIDで置き換えます。
先ほど開いておいたブラウザのタブの、ナレッジベースの概要画面から「ナレッジベースID」をコピーできます。
コード11行目の該当部分に貼り付けたら、Command + s
(Windowsでは Ctrl + s
)で上書き保存します。
4-3. アプリケーションを実行
このPythonアプリを実行してみます。そのためにはCloudShellを実行しているEC2サーバーへ、Pythonの外部ライブラリを3つインストールする必要があります。
エディター画面右上、左から2つ目のアイコンをクリックすると、画面下側にターミナルが開きます。ここから先ほどのCloudShellターミナルと同じようにコマンドを実行することができます。
以下コマンドを実行して、Pythonの外部ライブラリをインストール
pip install langchain==0.1.12 boto3 streamlit
貼り付け時にブラウザからポップアップが表示されたら、許可します。
以下のライブラリがインストールされます。
- LangChain:LLMアプリでよく使うロジックを簡単に記述できる
- Boto3:PythonでAWSサービスを操作するSDK(LangChainに内包)
- Streamlit:PythonでモダンなWebフロント画面を簡単に作成できる
完了したら、以下のコマンドを実行してPythonコードをStreamlitで稼働させましょう。
streamlit run rag.py
上手くいくとエディター画面右下にポップアップが表示されるので、「Open in Browser」をクリック
ポップアップが閉じてしまった場合は、ターミナルで Ctrl + c
を押してStreamlitの実行を停止し、再度 streamlit run rag.py
を実行するとポップアップが再表示されます。
すると、ブラウザの新しいタブでStreamlitアプリの画面にアクセスできます。
実際にこのアプリを使ってみましょう。テキストボックスに かぐたんって何?
と入力して「質問する」ボタンをクリックしてみます。
Enterキーは反応せず、ボタンを押さないと送信されないので注意(うまく処理が始まるとプレビュー画面右上に「RUNNING...」ステータスが表示されます)
数秒待つとアプリ画面下部に回答テキストが表示されます。
無事に "社内文書" を参照して回答を生成してくれました!
あなたのCloudShell上で、このStreamlitアプリを実行している間であれば、PinggyのURLを共有するだけで同僚にもこのアプリを使ってもらうことができます。
繰り返しますが、このURLが第三者に知られるとあなたのCloudShellにアクセス可能となってしまうため、セキュリティ上のリスクがあることをご認識ください。
URLを同僚に共有する場合は慎重に行い、ハンズオン終了後は速やかに環境の停止・削除を実施ください。
(なおPinggyは無料版の制約として、60分経つとURLが無効となります)
今回作成したアプリケーションの構成を再掲しておきます。
4-4. 補足: エディターやアプリへの接続が切れてしまった場合
- AWS CloudShellは、20分以上無操作が続くと停止してしまいます。
- Pinggyは、無料版の制約として60分でURLが無効になります。
CloudShellは「再接続」ボタンから再開することができます。
一度停止してしまったら、code-serverのインストールから再実行しましょう。
# code-serverのインストール
curl -fsSL https://code-server.dev/install.sh | sh
# code-serverの起動
code-server --auth none
# Pinggyサーバーに接続して公開URLを生成
ssh -p 443 -R0:localhost:8080 a.pinggy.io
発行されたURLにアクセスすれば、作成したPythonファイルやインストールしたライブラリはそのまま残っていますので、再度実行すればStreamlitアプリへのアクセスが可能です。
streamlit run rag.py
4-5. 付録: AIエージェントもついでに体験
ここまで早く終わった方は、以下の記事の「5. エージェント」に記載のコードを同様に実行してみましょう。
今回利用したCloudShell環境そのままで、AIエージェントの動作を簡単に体験することができます。
5. お片付け
ハンズオン実施後、作成したリソースを放置しておくと思わぬ高額請求に繋がる恐れがあります。
特に 5-2
のOpenSearch Serverlessコレクションを消し忘れてしまうと、1日あたり数百円の課金が発生する可能性があるため、可能なかぎりハンズオンイベント中に削除まで実施してしまうことをお勧めします。
5-1. ナレッジベースの削除
Bedrockコンソールで「オーケストレーション > ナレッジベース」から今回作成したナレッジベースを選択し、「削除」をクリック
確認キーワードを入力して「削除」をクリック
Bedrockのモデル自体は有効化したままでも実際に利用しない限り料金が発生しませんので、特段の対応は不要です。
5-2. ベクターDBの削除 【重要!】
OpenSearch Serviceコンソールで「サーバーレス > コレクション」から今回自動作成されているコレクション(検索インデックス)を選択し、「削除」をクリック
確認キーワードを入力して「削除」をクリック
5-3. S3バケットの削除
S3コンソールで今回作成したバケットをクリックし、「空にする」をクリック
確認キーワードを入力して「空にする」をクリック
画面上部の削除成功トーストにある「バケットの削除設定」リンクをクリック
確認キーワードを入力して「バケットを削除」をクリック
5-4. AWSアカウントの解約
AWSアカウントは残しておき、イベント後にこの環境を引き続き利用されたい方は、ルートユーザーやIAMユーザーにMFAを設定しておきましょう。不正ログインにより思わぬ高額請求などの被害に遭うリスクを減らすことができます。
- ルートユーザーへのMFA設定方法
- IAMユーザーへのMFA設定方法
- IAMユーザーの削除方法
もしこのAWSアカウントをしばらく使う予定がない場合、忘れないうちに解約してしまいましょう。
一度解約すると、同じメールアドレスで再度AWSアカウントを作成できなくなってしまうため、事前にメールアドレスをあまり使わないものに変更したうえで解約されることをお勧めします。
以下リンクよりルートユーザー(契約時のメールアドレス)でAWSアカウントに再サインインします。
画面右上のAWSアカウント名をクリックして「アカウント」へ移動
メールアドレスを変更する場合、アカウント設定の「編集」から変えられます。
AWSアカウントを解約する場合、同じ画面の最下部の「アカウントを閉鎖」から手続きできます。
おまけ:次のステップとして何に挑戦するのがいい?
RAG応用編
今回のPythonアプリをECSなどのインフラサービスでホストして、同僚にもWebブラウザーから使ってもらえるようにしてみる
エージェント入門編
Agent for Amazon BedrockでAIエージェントにも挑戦してみる
宣伝
凄腕Bedrockerの @hedgehog051 @moritalous と入門書を出版しました。最新情報&ハンズオン多数をわかりやすく整理した決定版です。