Amazon Bedrockとドキュメントを利用したRAG入門

1. はじめに

はじめまして、プラットフォームサービス部のKです。
みなさま、検索拡張生成(RAG)を活用されてますでしょうか?
まだの方は本記事をお読みいただき、RAGにご入門いただければと思います。

本記事ではAmazon Bedrockとドキュメントを利用した簡単なRAGを実施し、言語モデルに回答を作成してもらいます。

2. 目次

3. 用語説明

RAG(Retrieval-Augmented Generation)とは、外部の知識を利用して言語モデルが応答を生成する手法です。
言語モデルにはベースとなるデータが備わっていますが、最新の情報や専門知識を参照することで、より正確で詳細な回答を提供できるようになります。
応用例として、質問応答システムや顧客サポートなど、特定分野の知識が必要なシナリオで活用されています。

aws.amazon.com

4. 事前準備

4.1 リージョン

今回は米国西部(オレゴン):us-west-2 を使用してRAGを行います。
AWSコンソールログイン後、右上のリージョン選択がオレゴンになっていることを確認してください。
サービス検索窓でBedrockを入力し、Bedrockへアクセスしてください。

4.2 モデルアクセス

言語モデルの使用にはアクセス申請が必要になります。今回は Claude 3 Sonnet を使用します。アクセスが既に付与されていればこの手順は不要です。

画面左下の「モデルアクセス」をクリックし、次に画面上部の「モデルアクセスを変更」をクリックください。

モデルの一覧から「Anthropic Claude 3 Sonnet」を探し、チェックをつけた状態で次へ進んでください。変更内容が表示されますので、問題なければ完了してください。
完了後、数分するとアクセスが可能になります。再度アクセスステータスを確認するとアクセスが付与されていることを確認できます。

5. 言語モデルへの質問

5.1 RAGを使用しない質問

画面左の「Chat/text」にアクセスしてください。

「モデルを選択」をクリックし、モデルとして Anthropic Claude 3 Sonnet を選択してください。スループットにはオンデマンドを選択してください。

質問内容に「令和5年の日本の輸出総額はいくらですか。」と記入して実行をクリックしてください。

現時点で令和5年のデータは公表されていますが、Claude 3 Sonnet に使用されている知識が少し古いため、上記のような回答が返ってきます。

5.2 RAGを使用した質問

画面左の「ナレッジベース」にアクセスし、画面上部の「ドキュメントとチャット」タブをクリックしてください。 「モデルを選択」ボタンがありますので、先ほどと同様にClaude 3 Sonnet を選択します。

設定画面の「データ」に以下のファイルを指定しました。ファイルには貿易統計のデータが含まれています。
https://www.customs.go.jp/toukei/shinbun/trade-st/gaiyo2023_4-3.pdf

以下のように質問しました。
令和5年の日本の輸出総額はいくらですか。また、最も古い年度と令和5年度を比較して、輸出額が最も増えた地域を教えてください。

ドキュメントの内容が参照された回答が作成されました。

5.3 PythonとRAGを使用した質問

Pythonを使用してRAGを行います。実装内容としては上記のコンソールで実施した内容と同じです。
コード実行にはPythonが実行できる環境とSDKのboto3が必要です。PDFファイルと以下のコードが同じディレクトリにある状態で実行します。

import boto3


bedrock_client = boto3.client(service_name="bedrock-runtime", region_name = "us-west-2")

with open('gaiyo2023_4-3.pdf', "rb") as f:
    pdf = f.read()
    
message = {
    "role": "user",
    "content": [
        {
            "text": "令和5年の日本の輸出総額はいくらですか。また、最も古い年度と令和5年度を比較して、輸出金額が最も増えた地域を教えてください。"
        },
        {
            "document": {
                "name": "document",
                "format": "txt",
                "source": {
                    "bytes": pdf
                }
            }
        }
    ]
}

messages = [message]

response = bedrock_client.converse(
    modelId="anthropic.claude-3-sonnet-20240229-v1:0",
    messages=messages,
    )

output_message = response['output']['message']

for content in output_message['content']:
    print(content['text'])

python rag_document.py

コンソールで実施した内容と同じ回答が作成されました。

6. その他の手法との違い

本記事では1つのドキュメントを指定する形でRAGを行いました。
Amazon Bedrock ナレッジベースを使用することでドキュメントのデータベースを利用して大規模な検索が可能になります。

7. おわりに

いかがだったでしょうか。今回は簡単にRAGを実施しました。RAGを活用することで言語モデルの知識を簡単に拡張することが可能となります。
本記事がみなさまのRAGへの入門をお助けできれば幸いです。