320
287

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWSの生成AIで社内文書検索! Bedrockのナレッジベースで簡単にRAGアプリを作ってみよう

Last updated at Posted at 2024-03-01

生成AI、流行ってますね!

今みんながやってる「社内文書検索」アプリ、いわゆるRAGアーキテクチャをAWSで簡単に作ってみましょう。1時間程度でサクッと試せるハンズオンです。

手順内の画像は古いことがあります。本文のテキストを正として実施ください。

そもそもBedrockって何だっけ?

こちらの資料で紹介していますので、お時間ある方はご覧ください!

今回作成するアプリケーションの構成イメージ

スクリーンショット 2025-01-14 0.44.15.png

1. 環境準備

 
以下の部分を作成していきます。

スクリーンショット 2025-01-14 0.44.23.png

1-1. AWSアカウント作成

以下の手順でAWSアカウントを新規作成してください。
クレジットカード情報が必要です。ログイン用のEメールアドレスとパスワードをお忘れなく!

※アカウント作成を複数名で同時に実施する場合、同じネットワークを利用すると不正検知に引っかかり、SMS認証から先にうまく進めない可能性があります。20名を超える場合は、会場Wi-Fiとテザリングを使い分ける等工夫ください。

本ハンズオンの実施にあたり、多少の課金(数十円〜数百円以内)が発生することをご了承ください。実施後には忘れず不要なリソースの削除をお願いします。

1-2. IAMユーザー作成

AWSアカウントを作成すると、登録したEメールアドレスに紐づく「ルートユーザー」という最高特権のログインユーザーが一つだけ作成されるのですが、権限が強いため普段の作業には専用の個別ユーザーを作成するのがベストプラクティスです。

これを「IAMユーザー」といいます。まずは作業用のIAMユーザーを作ってサインインし直しましょう。

なお、今回の手順ではルートユーザーのまま作業してしまうと、Bedrockのナレッジベース作成に失敗するためお気をつけください。

以下URLからAWSアカウントにサインイン

「ルートユーザー」を選択し、登録メルアドを入力して次へ → パスワードを入力

スクリーン ショット 2024-02-16 に 17.35.17 午後.png

AWSマネジメントコンソール(通称マネコン)。クラウド管理者向けのホーム画面のようなものです

スクリーン ショット 2024-02-16 に 17.45.40 午後.png

マネコン上部の検索バーで「IAM」を検索し、IAMコンソールへ移動

スクリーン ショット 2024-02-16 に 17.46.23 午後.png

IAMコンソール左側の「ユーザー」 > 画面右の「ユーザーの作成」をクリック

スクリーン ショット 2024-02-16 に 17.47.32 午後.png

  • ユーザー名: handson
  • AWSマネコンへのアクセスを提供する: チェックを入れる
  • ユーザータイプ: IAMユーザーを作成します
  • コンソールパスワード: カスタムパスワードを選択し、パスワードを決めて入力(この後すぐ使います)
  • ユーザーは次回サインイン時に新しいパスワード作成が必要: チェックを外す

上記のとおり設定して「次へ」

image.png

「ポリシーを直接アタッチする」を選択し、許可ポリシー上から2つ目の AdministratorAccess にチェックを入れて、画面右下の「次へ」

スクリーン ショット 2024-02-16 に 17.53.00 午後.png

「ユーザーの作成」をクリック

スクリーン ショット 2024-02-16 に 17.54.14 午後.png

「コンソールサインインURL」をコピーしておく。

スクリーン ショット 2024-02-16 に 17.55.02 午後.png

マネコン右上のAWSアカウント名をクリックして「サインアウト」

スクリーン ショット 2024-02-16 に 17.56.09 午後.png

サインアウトできたら、ブラウザのアドレスバーに先ほどコピペした「サインインURL」を貼り付けてアクセス

スクリーン ショット 2024-02-16 に 17.58.46 午後.png

専用URLを使ったおかげで「アカウントID」が入力済みのサインイン画面に飛びます。

  • ユーザー名: handson
  • パスワード: 先ほど設定したIAMユーザー用のパスワード

スクリーン ショット 2024-02-16 に 17.59.52 午後.png

無事にIAMユーザーでサインインできました。
ルートユーザー(登録メルアド)を使った場合と異なり、右上の表示が「AWSアカウント名」ではなく「IAMユーザー名 @ AWSアカウントID」になっています。

スクリーン ショット 2024-02-16 に 18.04.40 午後.png

今回のハンズオンでは、東京リージョンを利用します。
右上のリージョン表示をクリックして、操作リージョンを東京に切り替えておいてください。

ハンズオンイベントでは時間の都合上割愛しますが、セキュリティ上、このタイミングでIAMユーザーにMFA(多要素認証)を設定いただくことを推奨します。

2. ナレッジベース作成

今回のメイン部分を作ります。

スクリーンショット 2025-01-14 0.44.30.png

2-1. 「社内文書」を準備

今回はAIに参照させる独自情報として、比較的最近のニュース記事を利用してみます。

KDDIアジャイル開発センター(通称KAG)という会社が、「かぐたん」というSlackチャットボットを開発したという最近の内容が書かれています。

上記のWebページを、あなたの作業PCのデスクトップ等に kagutan.pdf というファイル名で「PDFとして保存」しておきましょう。以下よりダウンロードください。

本ハンズオンでは動作確認の方法として、PinggyというWebサービスを利用し、作成したRAGアプリへ外部からのアクセスが可能なURLを一時的に発行します。
そのため、セキュリティ上の理由から「社内文書」のサンプルに用いるドキュメントは、機密情報などが含まれない外部公開OKのものをご利用ください。

2-2. S3バケット作成

マネコン上部の検索バーで「S3」を探してクリック

スクリーン ショット 2024-02-16 に 19.30.39 午後.png

「バケットを作成」をクリック

スクリーン ショット 2024-02-16 に 19.50.53 午後.png

  • AWSリージョン: 東京
  • バケット名: handson-(年月日の数字)-(あなたのニックネームなど)

S3バケットの名前は世界中でユニークである必要があるため、何でもいいので被らなさそうなバケット名を設定してください。

他はデフォルトのまま「バケットを作成」をクリック

スクリーン ショット 2024-02-16 に 20.08.49 午後.png

作成されたバケット名をクリックして開く

スクリーン ショット 2024-02-16 に 20.45.22 午後2.png

オレンジ色の「アップロード」をクリック

スクリーンショット 2024-02-16 20.52.29.png

「ファイルを追加」から先ほど保存したPDFファイルを選択して、右下の「アップロード」をクリック

スクリーンショット 2024-02-17 15.39.31.png

すぐに完了しますが、アップロード中はページを閉じないようにご注意ください。

スクリーンショット 2024-02-17 15.40.09.png

2-3. ナレッジベース作成

繰り返しになりますが、ここはルートユーザー(Eメールアドレスでログイン)だと失敗します。作業用の handson IAMユーザーでログインした状態で実施ください。

マネコン上部の検索バーで「Bedrock」を検索して移動

スクリーン ショット 2024-02-16 に 21.06.40 午後.png

右上のリージョン表示が「東京」になっていることを再確認しておきましょう。
左上のハンバーガーメニュー( マーク)を開き「ナレッジベース」をクリック

スクリーン ショット 2024-02-16 に 21.07.23 午後.png

「ナレッジベースを作成 > ベクトルストアを含むナレッジベース」をクリック

スクリーンショット 2025-01-14 0.50.30.png

ステップ1はデフォルトのまま「次へ」

スクリーン ショット 2024-02-16 に 21.09.28 午後.png

ステップ2では「S3を参照」から先ほど作成したS3バケットを選択し、「次へ」

スクリーンショット 2024-02-17 15.41.26.png

スクリーン ショット 2024-02-16 に 21.11.09 午後.png

ステップ3では以下を選択して「次へ」をクリックします。

  • 埋め込みモデル:Embed Multilingual v3
  • ベクトルデータベース:クイック作成 > Amazon Aurora PostgreSQL Serverless

スクリーンショット 2025-01-14 0.52.59.png

※Auroraクラスターは、そのリージョンのデフォルトVPC内に自動作成されます。デフォルトVPCを削除してしまっている方は、画面右上のAWS CloudShellを起動し、以下コマンドで再作成してください。

CloudShell
aws ec2 create-default-vpc 

ステップ4で、右下の「ナレッジベースを作成」をクリック

スクリーン ショット 2024-02-16 に 21.14.48 午後.png

※作成完了まで10分ほどかかるので、並行して次の作業へ進みます。

3. 生成AIモデルの有効化

以下を設定していきます。

スクリーンショット 2025-01-14 0.44.37.png

3-1. Bedrockモデル有効化

Bedrockコンソール左下の「モデルアクセス」をクリック

スクリーン ショット 2024-02-16 に 21.22.21 午後.png

オレンジ色の「Enable all models」をクリック

スクリーン ショット 2024-07-25 に 23.43.28 午後.png

すべてのモデルがチェックされている状態で、画面右下のオレンジ色「Next」をクリック

スクリーン ショット 2024-07-25 に 23.44.50 午後.png

有効にしたモデルの数ぶん、AWS Marketplaceのサブスクライブ通知メールが飛んできますが驚かないで大丈夫です。

もちろん必要なモデルのみにチェックを絞ってもOKです。今回使用するモデルは以下です。

  • Anthropic > Claude 3.7 Sonnet
  • Cohere > Embed Multilingual

次のステップでは、Anthropic社の要件により、モデル用途を記載する必要があります。(ざっくりでOK)

  • 会社名: あなたの所属会社名
  • 会社サイトのURL: あなたの会社のHPなど
  • 業界: あなたの会社の所属業界名
  • 対象ユーザー: 社内の従業員 のみにチェック
  • ユースケースの説明: 個人検証 など

上記を記載し「送信」をクリック ※以下の画面は少し古いものなので参考です。

スクリーン ショット 2024-02-16 に 21.27.35 午後.png

最後の確認画面で、画面右下のオレンジ色「Submit」をクリック

※1〜2分待つと、選択したモデルが「アクセスが付与されました」ステータスに変わります。右上の更新ボタンでリロードできます。

スクリーン ショット 2024-02-16 に 21.34.19 午後.png

3-2. プレイグラウンドからチャット

画面左側の「プレイグラウンド > チャット」をクリック

スクリーン ショット 2024-02-16 に 21.41.58 午後.png

「モデルを選択」から「Anthropic > Claude 3.7 Sonnet > APAC Anthropic Claude 3.7 Sonnet(推論プロファイル)」を選んで「適用」をクリック

スクリーンショット 2025-01-14 1.04.10.png

標準状態のClaudeモデルに質問してみましょう。画面下部のテキストボックスに かぐたんって何? というプロンプトを入力して「実行」をクリック

スクリーン ショット 2024-02-16 に 21.45.02 午後.png

おそらく正しく答えられないと思います。間違った答えを堂々と出力してしまうこともあります。

※このように生成AIが知識範囲外の質問にウソの回答をしてしまう現象を「ハルシネーション」と言います。

言語モデルが生成するテキストは、同じプロンプトを与えても毎回異なる内容が生成されます。そのため上記の回答は一例となります。

3-3. ナレッジベースをマネコンからテスト

それでは、先ほどの最新ニュース記事を参照させるとClaudeの回答がどう変わるか確認してみましょう。

閉じずに置いておいたブラウザのタブを見ると、Bedrockのナレッジベース作成が完了しています。右側のテスト用サイドバーの「データソースを同期」をクリック

スクリーン ショット 2024-02-16 に 21.48.53 午後.png

数秒で同期が完了するので、その後「モデルを選択」より「Anthropic > Claude 3.7 Sonnet > APAC Anthropic Claude 3.7 Sonnet(推論プロファイル)」を選んで「適用」をクリック

スクリーン ショット 2024-02-16 に 21.56.18 午後.png

右下のテスト用メッセージ欄に かぐたんって何? と入れて「実行」をクリック

スクリーンショット 2024-02-17 15.53.43.png

読み込ませた "社内文書" を元に、Claudeが今度は正しく回答してくれました!

スクリーンショット 2024-02-17 15.54.15.png

もし 申し訳ありません。このリクエストには対応できません。 といった回答が返ってきてしまう場合、ナレッジベースの内部で一時的なエラーが発生している可能性があります。数秒おいて何度かリトライしてみてください。

特に、今回利用するAurora Serverlessは、一定時間アクセスがないと自動でスリープする「ゼロスケール」に対応しているため、復帰に1分程度かかることがあります。

4. アプリケーション開発

ナレッジベース単体の動作確認ができたので、これを簡単なPythonアプリケーションから実行してみましょう。

スクリーンショット 2025-01-14 0.44.47.png

4-1. フロントエンドの開発

マネコン上部の検索バーから「CloudShell」を検索して右クリックし、新しいタブで開きます。

スクリーンショット 2025-05-25 18.49.16.png

以下のコマンドを実行しましょう。
nanoというシンプルなテキストエディターで、フロントエンド用のPythonファイルを新規作成します。

CludShell
nano frontend.py

以下のコードを、そのままコピーしてnanoに貼り付けましょう。

frontend.py
# 必要なライブラリをインポート
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

スクリーンショット 2025-05-25 19.01.10.png

4-2. フロントエンドの起動

以下コマンドで、必要なPythonライブラリをインストールします。

CloudShell
pip install boto3 streamlit

その後、フロントエンドを起動しましょう。

CloudShell
streamlit run frontend.py

Streamlitのアクセス用URLが表示されたら、うまく起動しています。

スクリーンショット 2025-05-25 19.10.59.png

4-3. 作ったアプリへアクセスしてみよう

CloudShell上部の「+」をクリックし、2つ目の「us-east-1」ターミナルを起動して以下を実行します。

CloudShell
ssh -p 443 -R0:localhost:8501 a.pinggy.io

確認メッセージが出力されたら yes と入力してEnterを押すと、Pinggyという外部サービスを通じてこのアプリにアクセス可能なURLが発行されます。

下側のHTTPSの方のURLをコピーして、ブラウザの別タブからアクセスしてみましょう。

スクリーンショット 2024-08-25 17.26.53.png

赤色の「Enter site」をクリックすると、先ほどアップロードしたPythonアプリにアクセスできます。Streamlitというフレームワークを使って、フロントエンドを表示しています。

参考まで、以下のような仕組みでCloudShell上のPythonアプリににアクセスしています。

スクリーンショット 2025-05-25 19.14.34.png

以下のようなStreamlitのWeb画面が表示されます。

スクリーンショット 2025-05-25 19.05.42.png

実際にこのアプリを使ってみましょう。

先ほど作ったナレッジベースの概要画面から「ナレッジベースID」をコピーして、アプリに入力します。

スクリーン ショット 2024-08-07 に 22.23.28 午後.png

その後、「質問を入力」フォームに かぐたんって何? と入力して「質問する」ボタンをクリックしてみましょう。

もしエラーメッセージが表示された際は、1分ほど待ってから再実行してみてください。

  • 今回利用するAurora Serverlessは、一定時間アクセスがないと自動でスリープする「ゼロスケール」に対応しているため、復帰に1分程度かかることがあります。
  • 新規作成したAWSアカウントでは、Claude APIの分間レートリミットが厳しめです。

あなたのCloudShell上で、このStreamlitアプリを実行している間であれば、PinggyのURLを共有するだけで同僚にもこのアプリを使ってもらうことができます。

繰り返しますが、このURLが第三者に知られるとあなたのCloudShellにアクセス可能となってしまうため、セキュリティ上のリスクがあることをご認識ください。
URLを同僚に共有する場合は慎重に行い、ハンズオン終了後は速やかに環境の停止・削除を実施ください。
(なおPinggyは無料版の制約として、60分経つとURLが無効となります)

今回作成したアプリケーションの構成を再掲しておきます。

スクリーンショット 2025-01-14 0.44.15.png

トラブルシュート

Pyhtonファイルがエラーとなり、修正したい場合

Streamlitを停止するには Ctrl + c を押します。

その後、以下コマンドで一度ファイルを削除してしまいましょう。

CloudShell(1つ目のタブ)
rm frontend.py

削除後、新たに同名のファイルを作成すればOKです。

CloudShell(1つ目のタブ)
nano frontend.py

エディターやアプリへの接続が切れてしまった場合

  • AWS CloudShellは、20分以上無操作が続くと停止してしまいます。
  • Pinggyは、無料版の制約として60分でURLが無効になります。

CloudShellは「再接続」ボタンから再開することができます。

スクリーン ショット 2024-08-07 に 22.42.47 午後.png

一度停止してしまったら、StreamlitとPinggyを再実行しましょう。

CloudShell(1つ目のタブ)
streamlit run frontend.py
CloudShell(2つ目のタブ)
ssh -p 443 -R0:localhost:8501 a.pinggy.io

発行されたURLにアクセスすれば、作成したPythonファイルやインストールしたライブラリはそのまま残っていますので、アプリへの再アクセスが可能です。

5. お片付け

5-1. ナレッジベースの削除

Bedrockコンソールで「オーケストレーション > ナレッジベース」から今回作成したナレッジベースを選択し、「削除」をクリック

スクリーン ショット 2024-02-18 に 00.36.01 午前.png

確認キーワードを入力して「削除」をクリック

スクリーン ショット 2024-02-18 に 00.37.00 午前.png

Bedrockのモデル自体は有効化したままでも実際に利用しない限り料金が発生しませんので、特段の対応は不要です。

5-2. Aurora Serverlessクラスターの削除

RDSコンソールで、自動作成されているクラスター内のライターインスタンスを選択し「アクション > 削除」をクリック(数分かかります)

スクリーンショット 2025-01-14 2.02.23.png

その後、クラスター側も選択し「アクション > 削除」をクリック

5-3. S3バケットの削除

S3コンソールで今回作成したバケットをクリックし、「空にする」をクリック

スクリーン ショット 2024-02-18 に 00.39.45 午前.png

確認キーワードを入力して「空にする」をクリック

スクリーン ショット 2024-02-18 に 00.40.43 午前.png

画面上部の削除成功トーストにある「バケットの削除設定」リンクをクリック

スクリーン ショット 2024-02-18 に 00.41.45 午前.png

確認キーワードを入力して「バケットを削除」をクリック

スクリーン ショット 2024-02-18 に 00.42.33 午前.png

5-4. AWSアカウントの解約

AWSアカウントは残しておき、イベント後にこの環境を引き続き利用されたい方は、ルートユーザーやIAMユーザーにMFAを設定しておきましょう。不正ログインにより思わぬ高額請求などの被害に遭うリスクを減らすことができます。

  • ルートユーザーへのMFA設定方法

  • IAMユーザーへのMFA設定方法

  • IAMユーザーの削除方法

もしこのAWSアカウントをしばらく使う予定がない場合、忘れないうちに解約してしまいましょう。

一度解約すると、同じメールアドレスで再度AWSアカウントを作成できなくなってしまうため、事前にメールアドレスをあまり使わないものに変更したうえで解約されることをお勧めします。

以下リンクよりルートユーザー(契約時のメールアドレス)でAWSアカウントに再サインインします。

画面右上のAWSアカウント名をクリックして「アカウント」へ移動

スクリーン ショット 2024-02-18 に 00.57.03 午前.png

メールアドレスを変更する場合、アカウント設定の「編集」から変えられます。

スクリーン ショット 2024-02-18 に 00.58.22 午前.png

AWSアカウントを解約する場合、同じ画面の最下部の「アカウントを閉鎖」から手続きできます。

スクリーン ショット 2024-02-18 に 00.59.28 午前.png

次のステップ

話題のAIエージェントを作ってみる

LLMOps(監視と評価)に入門してみる

今回作ったアプリをコンテナにしてWeb公開してみる

おまけ

Bedrockにちゃんと入門してみたくなったら…

スクリーンショット 2025-05-25 19.39.00.png

MCPの入門書も出版します! すでにアマゾン等で予約可能。

やさしいMCP入門.png

320
287
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
320
287

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?