🐳

Amazon Bedrockのナレッジベース使ってRAG構築してみた

に公開

初めに

最近話題のAmazon Bedrockのナレッジベースを使って、RAG(Retrieval-Augmented Generation)構成を試してみました。本記事では、簡単な構成の紹介から、実装、つまずいた点までをまとめています。これからBedrockやRAGを使ってみたい人の参考になれば嬉しいです。

想定する読者

  • Amazon Bedrockを使いたい人
  • RAGを構築してみたい人

この記事の到達目標

  • Amazon Bedrockを利用したRAGの構築方法を理解する

RAGとは??

大規模言語モデル(LLM)に外部の知識を参照させて回答させる手法です。
もともとのLLM(GPT、Claudeなど)は、学習時点までの情報しか持っておらず、新しい情報や企業独自のドキュメントなどには答えられないことがあります。
簡単に言うとネット上にない情報をDBに格納してそのデータをもとに回答生成させるということをしています。
この手法を用いればLLM単体では難しかった「最新情報」や「企業固有の知識」にも対応できるようになります。

構成


今回構築したのは、Amazon Bedrockのナレッジベースを活用したシンプルなRAG(検索拡張生成)構成です。
AWSのサービスとPythonを組み合わせて、Pythonコードに指定した自然言語の質問を投げると事前にアップロードしておいたドキュメントから関連情報を検索・抽出し、回答を得るという流れを実現しました。

  • Amazon Bedrock
    → ナレッジベース機能を使ってドキュメント検索を実現しました。

  • Amazon S3
    → ナレッジベースのデータソースとして使用。検索対象となるドキュメント(PDF)を格納しました。

  • Python(boto3)
    → Bedrock APIを呼び出すためのコードを作成。ナレッジベースにクエリを投げて検索結果を取得・表示できるようにしました。

実際の構築

S3にデータを保存する

まずはS3で汎用バケットを作成します。今回は「test-bashi」という名前で作成しています。

作成したバケットにRAGで使用したいデータを入れます。ダミーデータ.pdfには架空の人物のプロフィールを入れています。

格納したドキュメント

架空の人物プロフィール(ダミーデータ)


佐藤 太郎(さとう たろう)

  • 年齢: 35歳
  • 性別: 男性
  • 職業: 営業マネージャー
  • 出身地: 東京都
  • 趣味: ゴルフ / ビジネス書を読む / 料理

経歴:

大学卒業後、大手商社に入社。10年間営業部門で実績を上げ、現在はマネージャーとして10人の部下を持つ。

特記事項:

チームマネジメントとプレゼンテーションが得意。海外駐在経験あり。


山田 花子(やまだ はなこ)

  • 年齢: 29歳
  • 性別: 女性
  • 職業: データサイエンティスト
  • 出身地: 神奈川県
  • 趣味: 読書 / 猫と遊ぶ / コーヒー巡り

経歴:

理系大学院卒。AI系スタートアップにて機械学習モデルの開発を担当。PythonとRが得意。

特記事項:

Kaggle Competitions入賞経験あり。リモートワーク中心の生活。


鈴木 一郎(すずき いちろう)

  • 年齢: 42歳
  • 性別: 男性
  • 職業: 小学校教員
  • 出身地: 北海道
  • 趣味: 登山 / 家庭菜園 / 将棋

経歴:

大学教育学部を卒業後、地元の小学校にて20年勤務。教育ICT導入にも積極的に取り組む。

特記事項:

地域の教育イベントでの講演実績多数。教育分野でのSNS発信にも力を入れている。


高橋 未来(たかはし みく)

  • 年齢: 31歳
  • 性別: 女性
  • 職業: フリーランスデザイナー
  • 出身地: 大阪府
  • 趣味: イラスト制作 / アート鑑賞 / 旅行

経歴:

美大卒。広告代理店を経てフリーランスへ。Web・UIデザイン、イラスト、ロゴ制作が得意。

特記事項:

海外のクライアントとも取引多数。Adobe Creative Suiteのスペシャリスト。


中村 健(なかむら けん)

  • 年齢: 38歳
  • 性別: 男性
  • 職業: システムエンジニア
  • 出身地: 福岡県
  • 趣味: プログラミング / アニメ鑑賞 / キャンプ

経歴:

情報系の専門学校を卒業後、SIerで開発業務に従事。Java、C#、AWS環境での構築経験が豊富。

特記事項:

現在はプロジェクトマネージャーとして複数案件を統括中。資格:AWS SAA、基本情報技術者。



Amazon Bedrockを利用してAWSマネジメントコンソール上でRAGを構築

Amazon Bedrockでは使用するモデルに対して明示的なアクセスリクエストやサブスクリプション操作が必要なので、Amazon Bedrockで使用するモデルをアクセスリクエストします。
Model catalogには大きく分けて二つの分類があります。

  • serverless models
    →AWSが直接提供
  • Marketplace models
    →サードパーティベンダー(独自LLMなど)が提供

Marketplace modelsはサードパーティベンダーが提供しているものなので多様なモデルや独自機能、カスタマイズ性あるといったメリットがある一方で、使用するには環境を構築しなくては行けなかったり料金体系が複雑であったりというデメリットがあります。
今回は比較的導入が簡単なserverless modelsの方を使用します。
埋め込みモダリティとしてAmazonのTitan Text Embeddings V2、テキストモダリティとしてAnthoropicのClaude 3.5 Sonnetを採用します。

それぞれどのような役割で利用しているかというと、Titan Text Embeddings V2はS3に格納したデータをベクトル化することで意味的に近い言葉を検索できるようにしていて、Claude 3.5 Sonnetはその検索結果をもとに回答生成するという役割です。

ナレッジベース作成

ここまで出来たらナレッジベースを作成します。
「ベクトルストアを含むナレッジベース」を選択して、データソースにAmazon S3を指定しましょう。

S3 sourceにバケット名を指定して

埋め込みモデルに「Titan Text Embeddings V2」を指定したらナレッジベースを作成します。

この処理には数分かかります。

ナレッジベースが作成出来たらデータソースを同期しましょう。これでRAGを使う準備が整いました。ここからは正しく検索できるかテストします。
「ナレッジベースをテスト」からモデル「Claude 3.5 Sonnet」を選択してPreviewにて検索を行います。今回はダミーデータ.pdfに入れた架空の人物について質問してみます。

架空の人物(鈴木一郎さん)について教えてくれました。

PythonコードからAmazon Bedrockを使う

ここからはAmazon BedrockのPreviewで行った検索をPythonのコードを使って実行します。

今回作成したコード

# search.py

import os
from dotenv import load_dotenv
import boto3

# .envファイルを読み込み
load_dotenv()

# 環境変数から認証情報を取得
aws_access_key_id = os.getenv("AWS_ACCESS_KEY_ID")
aws_secret_access_key = os.getenv("AWS_SECRET_ACCESS_KEY")
region = os.getenv("AWS_REGION", "ap-northeast-1")
knowledge_base_id = os.getenv("KNOWLEDGE_BASE_ID")

# boto3 クライアント作成(Knowledge Base 用)
client = boto3.client(
    "bedrock-agent-runtime",
    region_name=region,
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key
)

# クエリ送信
response = client.retrieve_and_generate(
    input={
        "text": "鈴⽊⼀郎さんはどのような人物ですか。"
    },
    retrieveAndGenerateConfiguration={
        "type": "KNOWLEDGE_BASE",
        "knowledgeBaseConfiguration": {
            "knowledgeBaseId": knowledge_base_id,
            "modelArn": "arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-3-5-sonnet-20240620-v1:0"
        }
    }
)

print("▼ 回答:")
print(response['output']['text'])

.envから認証情報やナレッジベース IDを読み込むようにしています。

結果

25行目の部分で検索したい内容を入れてsearch.pyファイルを実行するとAWSマネジメントコンソール上を表示された内容と同じような結果が表示されました。

Loading .env environment variables...
▼ 回答:
鈴木一郎さんは42歳の男性で、北海道出身の小学校教員です。彼は大学の教育学部を卒業後、地元の小学校で20年間勤務しています。趣味は登山、家庭菜園、将棋です。

教育者として、鈴木さんは教育ICTの導入に積極的に取り組んでおり、地域の教育イベントで多数の講演実績があります。また、教育分野でのSNS発信にも力を入れており、現代の教育に対して積極的な姿勢を持っています。

まとめ

今回は、Amazon Bedrockのナレッジベース機能を活用して、RAG(検索拡張生成)構成を構築する方法を紹介しました。

S3にドキュメントをアップロードし、AWS Bedrockのナレッジベースと連携させるだけで、複雑なベクトル検索やEmbedding処理を意識せずに、手軽にRAGの仕組みを試すことができました。

特に印象的だったのは、検索・文書分割・埋め込み・類似検索のすべてをBedrock側で抽象化してくれる点で、初学者でも比較的スムーズにRAGを体験できる点が魅力だと思いました。

ここまでご覧いただきありがとうございました。

ネイバーズ東京

Discussion