生成AI、流行ってますね!
今みんながやってる「社内文書検索」アプリ、いわゆるRAGアーキテクチャをAWSで簡単に作ってみましょう。1時間程度でサクッと試せるハンズオンです。
手順内の画像は古いことがあります。本文のテキストを正として実施ください。
そもそもBedrockって何だっけ?
こちらの資料で紹介していますので、お時間ある方はご覧ください!
今回作成するアプリケーションの構成イメージ
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では以下を選択して「次へ」をクリックします。
- 埋め込みモデル:Embed Multilingual v3
- ベクトルデータベース:クイック作成 > Amazon Aurora PostgreSQL Serverless
※Auroraクラスターは、そのリージョンのデフォルトVPC内に自動作成されます。デフォルトVPCを削除してしまっている方は、画面右上のAWS CloudShellを起動し、以下コマンドで再作成してください。
aws ec2 create-default-vpc
ステップ4で、右下の「ナレッジベースを作成」をクリック
※作成完了まで10分ほどかかるので、並行して次の作業へ進みます。
3. 生成AIモデルの有効化
以下を設定していきます。
3-1. Bedrockモデル有効化
Bedrockコンソール左下の「モデルアクセス」をクリック
オレンジ色の「Enable all models」をクリック
すべてのモデルがチェックされている状態で、画面右下のオレンジ色「Next」をクリック
有効にしたモデルの数ぶん、AWS Marketplaceのサブスクライブ通知メールが飛んできますが驚かないで大丈夫です。
もちろん必要なモデルのみにチェックを絞ってもOKです。今回使用するモデルは以下です。
- Anthropic > Claude 3.7 Sonnet
- Cohere > Embed Multilingual
次のステップでは、Anthropic社の要件により、モデル用途を記載する必要があります。(ざっくりでOK)
- 会社名: あなたの所属会社名
- 会社サイトのURL: あなたの会社のHPなど
- 業界: あなたの会社の所属業界名
- 対象ユーザー:
社内の従業員
のみにチェック - ユースケースの説明:
個人検証
など
上記を記載し「送信」をクリック ※以下の画面は少し古いものなので参考です。
最後の確認画面で、画面右下のオレンジ色「Submit」をクリック
※1〜2分待つと、選択したモデルが「アクセスが付与されました」ステータスに変わります。右上の更新ボタンでリロードできます。
3-2. プレイグラウンドからチャット
画面左側の「プレイグラウンド > チャット」をクリック
「モデルを選択」から「Anthropic > Claude 3.7 Sonnet > APAC Anthropic Claude 3.7 Sonnet(推論プロファイル)」を選んで「適用」をクリック
標準状態のClaudeモデルに質問してみましょう。画面下部のテキストボックスに かぐたんって何?
というプロンプトを入力して「実行」をクリック
おそらく正しく答えられないと思います。間違った答えを堂々と出力してしまうこともあります。
※このように生成AIが知識範囲外の質問にウソの回答をしてしまう現象を「ハルシネーション」と言います。
言語モデルが生成するテキストは、同じプロンプトを与えても毎回異なる内容が生成されます。そのため上記の回答は一例となります。
3-3. ナレッジベースをマネコンからテスト
それでは、先ほどの最新ニュース記事を参照させるとClaudeの回答がどう変わるか確認してみましょう。
閉じずに置いておいたブラウザのタブを見ると、Bedrockのナレッジベース作成が完了しています。右側のテスト用サイドバーの「データソースを同期」をクリック
数秒で同期が完了するので、その後「モデルを選択」より「Anthropic > Claude 3.7 Sonnet > APAC Anthropic Claude 3.7 Sonnet(推論プロファイル)」を選んで「適用」をクリック
右下のテスト用メッセージ欄に かぐたんって何?
と入れて「実行」をクリック
読み込ませた "社内文書" を元に、Claudeが今度は正しく回答してくれました!
もし 申し訳ありません。このリクエストには対応できません。
といった回答が返ってきてしまう場合、ナレッジベースの内部で一時的なエラーが発生している可能性があります。数秒おいて何度かリトライしてみてください。
特に、今回利用するAurora Serverlessは、一定時間アクセスがないと自動でスリープする「ゼロスケール」に対応しているため、復帰に1分程度かかることがあります。
4. アプリケーション開発
ナレッジベース単体の動作確認ができたので、これを簡単なPythonアプリケーションから実行してみましょう。
4-1. フロントエンドの開発
マネコン上部の検索バーから「CloudShell」を検索して右クリックし、新しいタブで開きます。
以下のコマンドを実行しましょう。
nanoというシンプルなテキストエディターで、フロントエンド用のPythonファイルを新規作成します。
nano frontend.py
以下のコードを、そのままコピーしてnanoに貼り付けましょう。
# 必要なライブラリをインポート
import boto3, streamlit
# フロントエンドを描画
streamlit.title("おしえて!Bedrock")
kb_id = streamlit.text_input("ナレッジベースIDを入力")
model_arn = streamlit.text_input("モデルIDを入力", "anthropic.claude-3-7-sonnet-20250219-v1:0")
question = streamlit.text_input("質問を入力")
button = streamlit.button("質問する")
# Bedrock APIクライアントを作成
bedrock = boto3.client("bedrock-agent-runtime")
# ボタンが押されたらナレッジベースを呼び出し
if button:
with streamlit.spinner("回答を生成中…"):
response = bedrock.retrieve_and_generate(
input={"text": question},
retrieveAndGenerateConfiguration={
"type": "KNOWLEDGE_BASE",
"knowledgeBaseConfiguration": {
"knowledgeBaseId": kb_id,
"modelArn": model_arn
}
}
)
# 回答を描画
streamlit.write(response["output"]["text"])
時間に余裕のある方は、ぜひ自分の手で直接打ち込んでみてください。Pythonを詳しく知らなくとも、理解がとても深まります!
貼り付け後、エディターを保存して閉じるために以下のキーを順番に入力します。
- エディターの終了:
Ctrl + x
- 変更を保存しますか?:
y
- ファイル名はこれでいいですか?:
Enter
4-2. フロントエンドの起動
以下コマンドで、必要なPythonライブラリをインストールします。
pip install boto3 streamlit
その後、フロントエンドを起動しましょう。
streamlit run frontend.py
Streamlitのアクセス用URLが表示されたら、うまく起動しています。
4-3. 作ったアプリへアクセスしてみよう
CloudShell上部の「+」をクリックし、2つ目の「us-east-1」ターミナルを起動して以下を実行します。
ssh -p 443 -R0:localhost:8501 a.pinggy.io
確認メッセージが出力されたら yes
と入力してEnterを押すと、Pinggyという外部サービスを通じてこのアプリにアクセス可能なURLが発行されます。
下側のHTTPSの方のURLをコピーして、ブラウザの別タブからアクセスしてみましょう。
赤色の「Enter site」をクリックすると、先ほどアップロードしたPythonアプリにアクセスできます。Streamlitというフレームワークを使って、フロントエンドを表示しています。
以下のようなStreamlitのWeb画面が表示されます。
実際にこのアプリを使ってみましょう。
先ほど作ったナレッジベースの概要画面から「ナレッジベースID」をコピーして、アプリに入力します。
その後、「質問を入力」フォームに かぐたんって何?
と入力して「質問する」ボタンをクリックしてみましょう。
もしエラーメッセージが表示された際は、1分ほど待ってから再実行してみてください。
- 今回利用するAurora Serverlessは、一定時間アクセスがないと自動でスリープする「ゼロスケール」に対応しているため、復帰に1分程度かかることがあります。
- 新規作成したAWSアカウントでは、Claude APIの分間レートリミットが厳しめです。
あなたのCloudShell上で、このStreamlitアプリを実行している間であれば、PinggyのURLを共有するだけで同僚にもこのアプリを使ってもらうことができます。
繰り返しますが、このURLが第三者に知られるとあなたのCloudShellにアクセス可能となってしまうため、セキュリティ上のリスクがあることをご認識ください。
URLを同僚に共有する場合は慎重に行い、ハンズオン終了後は速やかに環境の停止・削除を実施ください。
(なおPinggyは無料版の制約として、60分経つとURLが無効となります)
今回作成したアプリケーションの構成を再掲しておきます。
トラブルシュート
Pyhtonファイルがエラーとなり、修正したい場合
Streamlitを停止するには Ctrl + c
を押します。
その後、以下コマンドで一度ファイルを削除してしまいましょう。
rm frontend.py
削除後、新たに同名のファイルを作成すればOKです。
nano frontend.py
エディターやアプリへの接続が切れてしまった場合
- AWS CloudShellは、20分以上無操作が続くと停止してしまいます。
- Pinggyは、無料版の制約として60分でURLが無効になります。
CloudShellは「再接続」ボタンから再開することができます。
一度停止してしまったら、StreamlitとPinggyを再実行しましょう。
streamlit run frontend.py
ssh -p 443 -R0:localhost:8501 a.pinggy.io
発行されたURLにアクセスすれば、作成したPythonファイルやインストールしたライブラリはそのまま残っていますので、アプリへの再アクセスが可能です。
5. お片付け
5-1. ナレッジベースの削除
Bedrockコンソールで「オーケストレーション > ナレッジベース」から今回作成したナレッジベースを選択し、「削除」をクリック
確認キーワードを入力して「削除」をクリック
Bedrockのモデル自体は有効化したままでも実際に利用しない限り料金が発生しませんので、特段の対応は不要です。
5-2. Aurora Serverlessクラスターの削除
RDSコンソールで、自動作成されているクラスター内のライターインスタンスを選択し「アクション > 削除」をクリック(数分かかります)
その後、クラスター側も選択し「アクション > 削除」をクリック
5-3. S3バケットの削除
S3コンソールで今回作成したバケットをクリックし、「空にする」をクリック
確認キーワードを入力して「空にする」をクリック
画面上部の削除成功トーストにある「バケットの削除設定」リンクをクリック
確認キーワードを入力して「バケットを削除」をクリック
5-4. AWSアカウントの解約
AWSアカウントは残しておき、イベント後にこの環境を引き続き利用されたい方は、ルートユーザーやIAMユーザーにMFAを設定しておきましょう。不正ログインにより思わぬ高額請求などの被害に遭うリスクを減らすことができます。
- ルートユーザーへのMFA設定方法
- IAMユーザーへのMFA設定方法
- IAMユーザーの削除方法
もしこのAWSアカウントをしばらく使う予定がない場合、忘れないうちに解約してしまいましょう。
一度解約すると、同じメールアドレスで再度AWSアカウントを作成できなくなってしまうため、事前にメールアドレスをあまり使わないものに変更したうえで解約されることをお勧めします。
以下リンクよりルートユーザー(契約時のメールアドレス)でAWSアカウントに再サインインします。
画面右上のAWSアカウント名をクリックして「アカウント」へ移動
メールアドレスを変更する場合、アカウント設定の「編集」から変えられます。
AWSアカウントを解約する場合、同じ画面の最下部の「アカウントを閉鎖」から手続きできます。
次のステップ
話題のAIエージェントを作ってみる
LLMOps(監視と評価)に入門してみる
今回作ったアプリをコンテナにしてWeb公開してみる
おまけ
Bedrockにちゃんと入門してみたくなったら…
MCPの入門書も出版します! すでにアマゾン等で予約可能。