LoginSignup
164
151

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

Last updated at Posted at 2024-03-01

2024/3/11 今話題のClaude 3に対応したバージョンへ手順更新しました🎉

この記事について

AWSコミュニティ最大級のイベント「JAWS DAYS 2024」内のワークショップにて実施したハンズオンコンテンツとなります。

イベントでは口頭で説明しながら実施しますが、この記事さえ読めば誰でも体験できるように作っていますので、当日イベントにお越しになれない方もぜひご活用ください。(スムーズにいけば30分程度で完了します)

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

なお、Bedrockのモデル呼び出し料金はAmazon製のTitanシリーズを除き、マーケットプレイス扱いとなるためAWSクレジット(クーポン)の適用範囲外となります。

※事前にAWSアカウントの作成をお願いします。クレジットカード情報が必要です。ログイン用のEメールアドレスとパスワードをお忘れなく!

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

こちらの資料で紹介していますのでご覧ください!

なお、凄腕Bedrockerの @hedgehog051 @moritalous と入門書を出版することとなりました。最新情報&ハンズオン多数をわかりやすく整理した決定版です。

すでに予約可能で、ありがたいことにAmazonのカテゴリー内でベストセラー1位となりました!

スライド1.png

0. 事前説明(13:10-13:15)

以下スライドで簡単な事前説明を行います。

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

スクリーンショット 2024-02-25 16.45.34.png

1. 環境準備編(13:15-13:25)

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

スクリーンショット 2024-02-25 16.49.18.png

1-1. IAMユーザー作成

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

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

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

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(多要素認証)を設定いただくことをセキュリティ上推奨します。

1-2. Cloud9起動

今回のハンズオンではAWSの「バージニア北部」リージョンのみを利用します。(Bedrockのナレッジベース機能が東京リージョン未対応のため)

以下の作業はすべて、AWSマネジメントコンソール画面右上のリージョン表示が「バージニア北部」(もしくはサービスによっては「グローバル」)となっていることを確認いただけると、トラブルがなくスムーズです。

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

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

「環境を作成」をクリック

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

  • 名前: handson

他はデフォルトのまま「作成」

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

既存のAWSアカウントを流用される場合で、もしデフォルトVPCを削除してしまっていた際は以下のコマンドをCloudShell等から実行すれば復元できます。

AWS CLI
aws ec2 create-default-vpc

環境ができるまで1分ほどかかるので、別の作業に進んでしまいましょう。

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

2. ナレッジベース作成編(13:25-13:35)

以下を作成します。

スクリーンショット 2024-02-25 16.49.27.png

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

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

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

上記のWebページを開き、ページ内を右クリックして「別名で保存」し、あなたの作業PCのデスクトップ等に単一のhtmlファイルとして保存しておきましょう。

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

2-2. S3バケット作成

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

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

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

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

  • バケット名: jawsdays2024-(あなたのニックネームなど)

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

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

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

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

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

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

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

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

スクリーンショット 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

「ナレッジベースを作成」をクリック

スクリーン ショット 2024-02-16 に 21.07.55 午後.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では埋め込みモデルにAmazon製の Titan Embeddings G1 - Text を選択し、「次へ」

※デフォルトでは、ベクトル変換した社内文書はOpenSearch Serverlessへ自動格納されます。

スクリーンショット 2024-02-25 16.52.10.png

右下の「ナレッジベースを作成」をクリック

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

※ここから数分かかるので、画面を閉じないよう注意して次の作業へ進みます。

3. モデル有効化編(13:35-13:45)

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

スクリーンショット 2024-02-25 16.49.35.png

3-1. Bedrockモデル有効化

マネコン左上のAWSロゴを右クリックして「新しいタブで開く」

※これによってナレッジベースの作成を継続させながら別の作業を並行できます。

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

新しいタブで開いたマネコンにて、上部の検索バーから「Amazon Bedrock」を探して移動

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

左上のハンバーガーメニューを開き、下方の「モデルアクセス」をクリック

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

右側の「モデルアクセスを管理」をクリック

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

Anthropicの「ユースケースの詳細を送信」をクリック

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

生成AIモデルの用途を記載します。(悩みすぎず、ざっくり入力しましょう)

  • 会社名: あなたの所属会社名
  • 会社サイトのURL: あなたの会社のHPなど
  • 業界: あなたの会社の所属業界名
  • 対象ユーザー: 社内の従業員
  • Anthropicモデルの使用目的: 上記のいずれでもない
  • ユースケースの説明: 個人検証

上記を記載し「送信」をクリック

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

以下のモデルをチェック

  • Titan Embeddings G1 - Text
  • Claude 3 Sonnet
  • Claude

チェック後「モデルアクセスをリクエスト」をクリック

スクリーンショット 2024-02-25 17.03.43.png

※1〜2分待つと、選択したモデルが「アクセスが付与されました」ステータスに変わります。

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

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

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

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

「モデルを選択」から「Anthropic > Claude 2.1」を選んで「適用」をクリック

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

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

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

NTTドコモさんが2017年に開発したAIアシスタントだそうです。ホンマか?

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

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

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

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

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

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

数十秒程度で同期が完了するので、その後「モデルを選択」より「Anthropic > Claude 2.1」を選んで「適用」をクリック

2024/3/11時点では、まだナレッジベースのテスト機能が最新版のClaude 3に対応していないため、暫定的にClaude 2.1を利用します。

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

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

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

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

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

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

※ちなみに本イベント当日、こんな新機能が追加されたので少しだけ画面レイアウトが変わっています。「社内文書」検索の精度向上ができそうなアツいアップデートです🔥🔥

4. アプリ開発編(13:45-13:55)

以下のアプリケーションを作成して実行してみます。

スクリーンショット 2024-02-25 16.49.42.png

4-1. Cloud9でPythonアプリを作成

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

まずは画面を移動する前に、ナレッジベース画面の中央にある「ナレッジベースID」をコピーして、どこかにメモっておいてください。この後すぐ使います。

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

マネコン上部から「Cloud9」を検索してクリック

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

ハンズオン冒頭で作成したCloud9環境 handson が出来ているので、「開く」ボタンを押してCloud9 IDEを起動

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

数秒〜数十秒待つとブラウザ上であなた専用の開発環境にアクセスできます。(内部的にはEC2インスタンスがあなたのVPC上で起動されています)

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

画面中央のエディター領域にある「Welcome」タブ右側の「+」ボタンをクリックして「New File」から新規ファイルを作成

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

開いた空ファイル内に以下のコードをコピーして貼り付ける

# 外部ライブラリをインポート
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)を押してファイルの保存ダイアログを開く

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

Filenameに rag.py と入力して、「Save」をクリック

左ペインのフォルダツリーを見ると、初期フィルダー直下に作成したPythonファイルが保存されていることが分かります。

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

この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がターミナル上に出力されます。

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

Cloud9画面上部の「Preview > Preview Running Application」をクリック

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

画面右下にWebブラウザのプレビュー画面が開きます。
表示領域が小さいので、タブをドラッグ&ドロップして画面上部のコード編集領域に移動させましょう。

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

実際にプレビューウィンドウからWebアプリを使ってみましょう。
テキストボックスに かぐたんって何? と入力して「質問する」ボタンをクリックしてみます

※Enterキーは反応せず、ボタンを押さないと送信されないので注意(うまく処理が始まるとプレビュー画面右上に「RUNNING...」ステータスが表示されます)

数秒待つとアプリ画面下部に回答テキストが表示されます。
無事に "社内文書" を参照して回答を生成してくれました!

スクリーンショット 2024-02-25 16.43.05.png

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

スクリーンショット 2024-02-25 16.45.34.png

5. お片付け(13:55-14:00)

ハンズオン実施後、作成したリソースを放置しておくと思わぬ高額請求に繋がる恐れがあります。

特に 5-3 のOpenSearch Serverlessコレクションを消し忘れてしまうと1日あたり1,000円以上の課金が発生する可能性があるため、可能なかぎりハンズオンイベント中に削除まで実施してしまうことをお勧めします。

5-1. Cloud9環境の削除

Cloud9コンソールで今回利用した環境を選択し、「削除」をクリック

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

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

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

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

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

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

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

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

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

5-3. ベクターDBの削除 【重要!】

OpenSearch Serviceコンソールで「サーバーレス > コレクション」から今回自動作成されているコレクション(検索インデックス)を選択し、「削除」をクリック

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

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

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

5-4. 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-5. 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

お帰り前に必ずアンケートにご回答ください🙏

実際にハンズオン体験してみて、いかがでしたか? ぜひ一言でもいいので率直な感想をお寄せくださいますと幸いです!

※本セッションのIDは E-6 となります(上記URLにアクセスすると自動入力されます)

おまけ:次のステップとして何に挑戦するのがいい?

レベル200

  • 今回のプロンプトテンプレートの文言を改良して、回答品質を向上させてみる
  • Agent for BedrockでAIエージェントにも挑戦してみる(以下参考)

レベル300

  • ナレッジベースの埋め込みモデルや回答生成モデルを変えてみて、RAG回答品質や応答速度を比べてみる(以下参考)

レベル400

  • 今回のPythonアプリをECSなどのインフラサービスでホストして、同僚にもWebブラウザーから使ってもらえるようにしてみる(Cognitoで認証をかけるなど、セキュリティ対策は忘れずに!)

※難しいのでClaudeに質問しながら構築してみましょう!

Bedrockerたちのブログも要チェック!

私の "推しBedrocker" の方々です。精力的にBedrockアウトプットをしてくださっており、とても勉強になります。

164
151
0

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
164
151