1
0

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 Skill Builder】『Building Generative AI Applications Using Amazon Bedrock』コースをやってみた - その 2

Last updated at Posted at 2025-03-14

はじめに

AWS Skill Builderにある『Building Generative AI Applications Using Amazon Bedrock』というコースを紹介する記事の「その 2」になります。

記事の構成

その 1:BedrockとLangChainについて
その 2:この記事
その 3:投稿済み

Skill Builderのコース説明や記事の概要などは、その1の記事をご覧ください。

今回のその2では、コース内のDemo 2の内容に即して、RAGに関する知識を取り扱います。

RAG

Retrieval Augmented Generation (RAG)は、基盤モデル (FM)が外部ソースを必要とするタスクを実行できるようにするシステムです。RAG自体の概念については、以下のKnowledge Baseのセクションで軽く説明しています。

Knowledge Base

RAGシステムを簡単に構築できる、Amazon Bedrockによるフルマネージドなサービスが、Knowledge Baseです。RAGの構築とテストが、マネジメントコンソールを使えばノーコードでできます。

作成手順の流れ

  1. ナレッジベースの名前や他サービスへのアクセス権限を持つロールを作成する
  2. ドキュメント類などの、RAGに取得させたい外部ソースを保存する場所(=データソース)を選択する
    • コース内のデモではAmazon S3を利用
  3. ベクトル埋め込みをする基盤モデルを選択
  4. 埋め込みしたベクトルを保存する、ベクトルストアを選択
    • コース内のデモではAmazon OpenSearch Serverlessを利用
  5. 以上の設定を完了し作成後、回答を生成するLLMを選択
  6. データソースにデータを格納

ここまでがRAG構築の最低限の設定であり、データソースを同期させればRAGを動かすことができます。

ベクトルストアの他にも、構造化データストア1グラフデータ2などを使用したRAGもあります。

Knowledge Baseの動作フロー

事前準備(データソースの同期)
Knowledge Baseは、事前にデータソースのドキュメントデータを埋め込みして、ベクトルストアに保存します。
  1. データソースのデータをいくつかのチャンクに分割
  2. チャンクをベクトルに埋め込み
  3. ベクトルをベクトルストアに保存
ランタイム
ユーザーがクエリをしてから、Knowledge Baseがレスポンスを返すまでの処理は、
  1. ユーザーのクエリを埋め込み
  2. ベクトルストアで、ユーザーのクエリと関連性の高いドキュメントを検索
  3. 取得したドキュメントをユーザーのクエリと合わせて、LLMにリクエストする
  4. LLMが与えられたドキュメントの情報(= コンテキスト)を基に、クエリに回答
  5. LLMからのレスポンスをユーザーに返す
といった感じです。「あるサービスのQA」などの限られた特定の知識が必要なクエリだとしても、LLMにドキュメントを渡す事で、そのようなクエリに対応させることができるというわけです。

APIメソッド

RetrieveAndGenerate

Knowledge Baseを用いて生成された回答を得るには、RetrieveAndGenerateメソッドを使用します。

example.py
 response = bedrock_agent_runtime.retrieve_and_generate(
    input = {
        'text': 'When was the AnyCompany established?' # ユーザーからの入力
    },
    retrieveAndGenerateConfiguration = {
        'knowledgeBaseConfiguration': {
            'knowledgeBaseId': kbId, # 作成時に生成されるID
            'modelArn': f'arn:aws:bedrock:{region_name}::foundation-model/{model_id}', # LLMのリソースネーム
            'retrievalConfiguration': {
                'vectorSearchConfiguration': {
                    'numberOfResults': 6, # ベクトルストアから検索して取得するドキュメントの数
                    'overrideSearchType': 'HYBRID'
                }
            }
        },
        'type': 'KNOWLEDGE_BASE'
    }
)

generated_text = response['output']['text'] # 生成された回答

ドキュメント → retrieve_and_generate - Boto3 1.37.9 documentation

Retrieve

Knowledge Baseを用いて、ベクトルストアの検索まで(上述のランタイムのフローでいう2.まで)の結果を取得するには、Retrieveメソッドを使用します。
このメソッドは、RAGの検索後のワークフローをカスタマイズしたい時などに役立ちます。

example.py
 response = bedrock_agent_runtime.retrieve(
    retrievalQuery = {
        'text': 'When was the AnyCompany established?' # ユーザーからの入力
    },
    knowledgeBaseId = kbId, # 作成時に生成されるID
    retrievalConfiguration = {
        'vectorSearchConfiguration': {
            'numberOfResults': 6, # ベクトルストアから検索して取得するドキュメントの数
            'overrideSearchType': 'HYBRID'
        }
    }
)

retrievalResults = response['retrievalResults'] # 取得したドキュメントごとの配列

ドキュメント → retrieve - Boto3 1.37.9 documentation

RAGの評価方法

RAGアプリケーションを作成したら、パフォーマンスを最適化してより正確さを上げるために、アプリケーションを評価することが大切です。RAG Assessment (RAGAS)は、RAGを評価するためのオープンソースのフレームワークです。

RAGASでは、パフォーマンスを測るための様々なメトリクスを計測できます。以下はそのメトリクスの例です。

  1. Faithfulness
    • LLMに送られたコンテキストと、それを基に生成された回答を比較して計測される値
    • 0~1の数値
    • 低いほどハルシネーションであることを示唆する
  2. Answer relevance
    • 生成された回答が、コンテキストやユーザーのクエリとどれだけ関連性があるかを示す値
    • -1~1の数値
    • 低いほど、回答が不完全であるか、冗長な情報を含むことを示す
  3. Context recall
    • ユーザーの質問に対して想定される回答(出力の正解)と、コンテキストの内容から計算される値
    • 0~1の数値
    • 低いほど、出力の正解とコンテキストの間に乖離が見られる
  4. Context precision
    • 出力の正解とコンテキストの内容、ユーザーのクエリから計測される値
    • 0~1の数値
    • 低いほど、コンテキストの中に関連のある情報が少ないことを意味する

参考 → Overview - Ragas

RAGの応用テクニック

1. チャンク戦略

RAGではデータソースのドキュメントを埋め込む際、チャンクに分割するのが一般的です。その分割方法において効果的な戦略を取れるかどうかが、RAGのパフォーマンスに大きく関わってきます。

チャンク戦略には以下の4つがあります。

  1. 固定長 - fixed
    • チャンクサイズを1つの値に固定して分割する
    • チャンクサイズは、大きすぎると検索の精度と速度が落ちる一方、小さすぎると情報の不足や途切れた文章による意味の欠落を招くため、適切な粒度を見極める必要がある
  2. セマンティック - semantic
    • テキストを文の区切りや、文章のトピック、つまり文脈ごとに分割する
    • チャンクごとのサイズに違いが出るが、途中で文が途切れることはない
  3. 階層的 - hierarchical
    • 複雑に構造化したドキュメント内の、ネストされた構成や関係性を基に階層的にチャンクを分割する
    • 法的文書や技術マニュアル、学術的な記事などの場合に向いている

また、いくつかの戦略を組み合わせて利用する、ハイブリッドなアプローチが有用なケースもあります。

Knowledge Baseでは、ベクトルストアにAmazon OpenSearch Serverlessを利用している場合のみHYBRID検索タイプが指定できます。3

2. Query reformulation (クエリ分解)

ユーザーのクエリは、複数の質問を含んで複雑になることがあります。そのように複数のニュアンスがクエリに含まれていると、RAGのベクトル検索において、一部のニュアンスのみが結果に反映されたり、関連性を精度良く計れず曖昧な結果になったりと、パフォーマンスの悪化を引き起こします。

それを解決するのが、Query reformulation or decomposition (日本語にするならクエリ分解)です。複数の質問を含むようなクエリを、質問ごとのサブクエリに分割しそれぞれを別々に処理することで、上記のようなパフォーマンスの悪化を防ぐことができます。

Knowledge BaseのRetrieveAndGenerateメソッドでは、クエリ分解を有効にする設定が可能です。

example.py
'orchestrationConfiguration': {
    'queryTransformationConfiguration': {
        'type': 'QUERY_DECOMPOSITION' # クエリ分解を有効にする
    }
}

3. Guardrails

Amazon Bedrock Guardrailsは、AIが攻撃的な内容や倫理に反する回答を生成することを防ぎ、RAGアプリケーションの信頼性や安全性を守るための機能です。

例えば、以下のような設定ができます。

  • 特定のトピックを拒否
  • コンテンツのフィルタリング
  • センシティブな情報を設定

Demo 2

構成

コースのDemo 2には、RAGに関する以下の5つの話題に対して、それぞれ実装例が用意されています。

  1. RetrieveAndGenerateによるRAGの使用
  2. Retrieveを使ったRAGのカスタマイズ
  3. クエリ分解
  4. RAGASによるRAGの評価
  5. Guardrailsの設定

補足事項

  • プロファイルとリソースのリージョンの一致
    デモのコードでは、読み込んだプロファイルに設定されたリージョン内でKnowledge Baseを検索するため(しかも最初の1つ)、そのリソースを作成したリージョンと一致している必要があります。
    (しかし、Knowledge BaseのIDを取得するために検索APIを利用するので、IDをハードコーディングか環境変数などで渡すようにすれば、そもそも検索するコードが不要です)

  • ベクトルストアにPineconeを利用しよう
    デモでベクトルストアに設定するAmazon OpenSearch Serverlessは、かなり費用がかかります。
    代替案として、Pineconeの利用をオススメします。AWS外のサービスですが、「Starter」という無料プランがあり、デモを実施するには十分です。詳しい設定方法は、公式ブログの記事をご参照ください。

    前述しましたが、Pineconeの場合はHYBRID検索タイプが使用できません。3

    (追記)
    APIKeyの保存に使用するSecretsManagerの課金が発生します4。結構高いのでデモの実施が終わり使用しなくなったら、削除する方が良さそうです。

    ※ベクトルストアのコストについては、以下の記事がかなり参考になります。

  • LangChainのライブラリについて
    デモ内のコードで登場する、LangChainライブラリのAmazonKnowledgeBasesRetrieverクラスが非推奨になっています。しかし、ただライブラリの場所が変わっただけっぽいので、以下のようにインポートを変更すれば問題なさそうです。

    Task-2.ipynb
    - from langchain.retrievers import AmazonKnowledgeBasesRetriever
    + from langchain_aws.retrievers.bedrock import AmazonKnowledgeBasesRetriever
    

  • 必要なポリシー
    デモの実行には、Bedrockサービスに対するポリシー以外にも必須のポリシーがあります。マネジメントコンソールにログインするIAMユーザー等に、以下のポリシーを許可して下さい。(ローカル開発環境と上述したPineconeを使う場合)

    • S3
      • s3:ListBucket
      • s3:ListAllMyBuckets
      • s3:PutEncryptionConfiguration
      • s3:GetObject
      • s3:CreateBucket
      • s3:PutObject
    • IAM
      • iam:CreateRole
      • iam:CreatePolicy
      • iam:CreatePolicyVersion
      • iam:AttachRolePolicy
        特にKnowledge Baseの作成時に必要
    • STS
      • sts:GetCallerIdentity
        Task-3.ipynbでAWSアカウントID取得のために必要となりますが、アカウントID使っていないので取得のコード消せば不要…

  • pandasライブラリの依存関係
    Knowledge Baseは全く関係ありませんが、コードの実行中(2025年2月)にpandasライブラリ関係のエラーに遭遇したので、補足として残します。
    以下の記事を参考に対処しました。

おわり

Knowledge BaseでRAGを簡単に構築できて便利だと思います。
あと、英単語に当てはまるいい感じの訳を考えるのが結構難しかったです。

その3に続きます。

参考リンク

  1. https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/knowledge-base-build-structured.html

  2. https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/knowledge-base-build-graphs.html

  3. https://docs.aws.amazon.com/bedrock/latest/userguide/kb-test-config.html の「Search type」より 2

  4. https://aws.amazon.com/jp/secrets-manager/pricing/?did=ap_card&trk=ap_card (執筆時点で1シークレットあたり、$0.40 / 月

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?