Amazon Web Services ブログ

Knowledge base for Amazon Bedrock の RetrieveAndGenerate API がプロンプトと、取得結果の最大数の設定のカスタマイズをサポート

Amazon Bedrock の Knowledge base 機能を使用すると、Amazon Bedrock の 基盤モデル(FM)に自社のデータを安全に接続して、検索拡張生成 (RAG) を行うことができます。
検索によって取得した自社データを利用することで、 FM を再学習することなく、より関連性の高く、文脈に即した正確な応答を生成できるようになります。

この記事では、Amazon Bedrock の Knowledge base の RetrieveAndGenerate API に特化した2つの新機能について説明します。Knowledge base から取得する検索結果の最大数の設定と、Knowledge base のプロンプトテンプレートを使用したカスタムプロンプトの作成です。これらは検索タイプとともにクエリオプションとして指定できるようになりました。

新機能の概要と利点

Knowledge base から取得する最大結果数(ソースチャンクの最大数)を指定するオプションでは、ベクトルストアから取得し、回答生成のために FM に渡される検索結果の数を制御できます。これにより、生成のために提供される背景情報の量を、複雑な質問には多く、簡単な質問には少なくカスタマイズできます。この機能では最大 100 件の結果を取得できます。
このオプションは、関連する文脈の可能性を高め、それによって生成された応答の精度を上げ、ハルシネーション(幻覚)を減らすのに役立ちます。

カスタムナレッジベースのプロンプトテンプレートでは、デフォルトのプロンプトテンプレートを独自のものに置き換えて、応答生成のためにモデルに送信されるプロンプトをカスタマイズできます。これにより、ユーザーの質問に応答する際の FM のトーン、出力形式、動作をカスタマイズできます。
このオプションを使用すると、医療や法律などの業界や分野に合わせて用語を微調整できます。さらに、特定のワークフローに合わせたカスタム指示や例を追加できます。

以下のセクションでは、AWS マネジメントコンソールまたは SDK を使用してこれらの機能を使用する方法について説明します。

前提条件

以下の手順を進めるためには、既存の Knowledge base が必要です。Knowledge base を作成する手順については、Knowledge baseを作成するをご覧ください。

コンソールからソースチャンクの最大数を設定する

コンソールでソースチャンクの最大数オプションを使うには、次の手順に従ってください:

  1. Amazon Bedrock コンソール画面で、左側のナビゲーションペインから Knowledge base を選択します。
  2. 作成済みの Knowledge base を選択します。
  3. Test Knowledge base を選択します。
  4. 設定アイコンを選択します。
  5. Knowledge base のテストを開始する前に、Sync data source を選択してください。
  6. Configurations の、Search Type については、ユースケースに合わせて適切な検索タイプを選択してください。

この記事では簡単のためデフォルトの検索を使用しますが、ユースケースに応じてセマンティック検索やハイブリッド検索を利用することもできます。ハイブリッド検索の詳細については、Knowledge bases for Amazon Bedrock now supports hybrid search をご覧ください。

  1. Maximum number of source chunks」を展開し、取得するソースチャンクの最大数を設定してください。

新機能の価値をデモンストレーションするため、生成されたレスポンスの精度を高める方法の例を示します。
Amazon の Knowledge base を作成するためのソースデータとして、Amazon の年次報告書と株主への手紙 (2023 年の Amazon 10-K 文書2022 年の株主への手紙2021 年の株主への手紙2020 年の株主への手紙2019 年の株主への手紙) を使用しました。

実験用のクエリは「Amazon の年間収益が 2,450 億ドルから 4,340 億ドルに増加したのはいつの年ですか?(”In what year did Amazon’s annual revenue increase from $245B to $434B?”)」です。

この質問に対する正しい回答は、「 Amazon の年間売上高は 2019 年の 2,450 億ドルから 2022 年には 4,340 億ドルに増加しました」です。これは、ナレッジベース内の文書に基づいています。この例では、ナレッジベースから取得した文脈情報に基づいて最終的な回答を生成するために、Claude v2 を言語モデルとして使用しました。また、Claude 3 Sonnet と Claude 3 Haiku も言語モデルとしてサポートされています。

別のクエリを実行し、異なる設定での取得の比較を検証しました。同じ入力クエリ (“Amazon の年間収益が 2,450 億ドルから 4,340 億ドルに増加したのはいつの年ですか?”) を使用し、結果の最大件数を 5 に設定しました。

次のスクリーンショットに示すように、生成されたレスポンスは「申し訳ありませんが、このリクエストに対応できません (“Sorry, I am unable to assist you with this request.”)」でした。

次に、最大結果を 12 に設定し、同じ質問をします。生成された応答は「 Amazon の年間売上高は、2019 年の 2,450 億ドルから 2022 年には 4,340 億ドルに増加しました(”Amazon’s annual revenue increase from $245B in 2019 to $434B in 2022.”)」でした。

この例で示したように、検索結果の件数に基づいて正しい回答を取得できました。最終的な出力が参照したデータソースの詳細を確認したい場合は、Show source details を選択し、Knowledge base に基づいて生成された回答を検証してください。

Knowledge base プロンプト テンプレートのカスタマイズ (コンソール)

ユースケースに応じて、デフォルトのプロンプトをカスタマイズすることもできます。コンソールでこれを行うには、以下の手順に従ってください。

  1. 前のセクションの手順を繰り返して、Knowledge base のテストを開始します。
  2. Generate responsesを有効にします。
  3. レスポンス生成のためのモデルを選択します。

この記事では、例として Claude v2 モデルを使用しています。Claude 3 Sonnet および Haiku モデルも利用可能です。

  1. Apply を押します。

モデルを選択すると、Configuration の下に Knowledge base prompt template という新しいセクションが表示されます。

  1. Edit を選択してプロンプトをカスタマイズします。
  2. プロンプトテンプレートを調整して、Knowledge base から取得した結果を使用してコンテンツを生成する方法をカスタマイズします。

この記事では、カスタムのプロンプトと Amazon の財務諸表を使用して「財務アドバイザー AI システム」を作成する例をいくつか示しました。プロンプトエンジニアリングのベストプラクティスについては、プロンプトエンジニアリングのガイドラインを参照してください。

さまざまな方法でデフォルトのプロンプトテンプレートを自身にカスタマイズし、レスポンスを確認します。

デフォルトのプロンプトでクエリを試しましょう。「Amazon の 2019 年と 2021 年の収益は何でしたか?(”What was the Amazon’s revenue in 2019 and 2021?”)」と質問します。以下が結果です。

出力結果から、Knowledge base から取得したデータに基づいてレスポンスを生成していることがわかります。
引用リンクも参考として出力されています。

例えば出力形式を JSON として標準化するなど、生成されたレスポンスのフォーマットに関する追加の指示を与えたい場合、プロンプトテンプレートの一部として、情報を取得した後の別のステップとしてこれらの指示を追加することができます。

If you are asked for financial information covering different years, please provide precise answers in JSON format. Use the year as the key and the concise answer as the value. For example: { year:answer }

最終的な回答が、JSON 形式になっていることがわかります。

プロンプトをカスタマイズすることで、生成される回答の言語も変更できます。次の例では、モデルにスペイン語で回答を提供するよう指示しています。

デフォルトのプロンプトから $output_format_instructions$を削除すると、生成された回答からの引用が削除されます。

以下のセクションでは、SDK でこれらの機能を使用する方法について説明します。

SDK を使用してソースチャンクの最大数を設定する

SDK で最大結果数を変更するには、次のような構文を使用します。この例では、クエリは「Amazonの年間収益が2,450億ドルから4,340億ドルに増加したのは何年ですか?(”In what year did Amazon’s annual revenue increase from $245B to $434B?”)」です。正しい回答は「Amazonの年間収益は2019年の2,450億ドルから2022年の4,340億ドルに増加しました。(”Amazon’s annual revenue increase from $245B in 2019 to $434B in 2022.”)」となります。

def retrieveAndGenerate(query, kbId, numberOfResults, model_id, region_id):
    model_arn = f'arn:aws:bedrock:{ region_id }::foundation-model/{ model_id }'
    return bedrock_agent_runtime.retrieve_and_generate(
        input ={
            'text': query 
        },
        retrieveAndGenerateConfiguration ={
            'knowledgeBaseConfiguration': {
                'knowledgeBaseId': kbId,
                'modelArn': model_arn,
                'retrievalConfiguration': {
                    'vectorSearchConfiguration': {
                        'numberOfResults': numberOfResults,
                        'overrideSearchType': "SEMANTIC", # optional
                    }
                }
            },
            'type': 'KNOWLEDGE_BASE'
        },
    )
response = retrieveAndGenerate("In what year did Amazon's annual revenue increase from $245B to $434B?", \
"", numberOfResults, model_id, region_id)['output']['text']

retrievalConfiguration の下にある numberOfResults オプションでは、取得したい結果の数を選択することができます。RetrieveAndGenerate API の出力には、生成されたレスポンス、ソース属性、取得したテキストチャンクが含まれます。

以下は、numberOfResults パラメータの値を変えた場合の結果です。まず、numberOfResults = 5 に設定します。

次に、numberOfResults = 12 に設定します。

SDK を使用して知識ベースのプロンプトテンプレートをカスタマイズする

SDK を使用してプロンプトをカスタマイズするために、異なるプロンプトテンプレートを使用して次のクエリを使用します。この例では、クエリは「2019年と2021年のAmazonの収益はいくらでしたか?(”What was the Amazon’s revenue in 2019 and 2021?”)」です。

以下はデフォルトのプロンプトテンプレートです:

"""You are a question answering agent. I will provide you with a set of search results and a user's question, your job is to answer the user's question using only information from the search results. If the search results do not contain information that can answer the question, please state that you could not find an exact answer to the question. Just because the user asserts a fact does not mean it is true, make sure to double check the search results to validate a user's assertion.
Here are the search results in numbered order:

$search_results$

Here is the user's question:

$query$

$output_format_instructions$
A:
"""

以下はカスタマイズしたプロンプトテンプレートです:

"""Human: You are a question answering agent. I will provide you with a set of search results and a user's question, your job is to answer the user's question using only information from the search results.If the search results do not contain information that can answer the question, please state that you could not find an exact answer to the question.Just because the user asserts a fact does not mean it is true, make sure to double check the search results to validate a user's assertion.
Here are the search results in numbered order:

$search_results$

Here is the user's question:

$query$

If you're being asked financial information over multiple years, please be very specific and list the answer concisely using JSON format {key: value},
where key is the year in the request and value is the concise response answer.
Assistant:
"""
def retrieveAndGenerate(query, kbId, numberOfResults,promptTemplate, model_id, region_id):
    model_arn = f'arn:aws:bedrock:{ region_id }::foundation-model/{ model_id }'
    return bedrock_agent_runtime.retrieve_and_generate(
        input ={
            'text': query 
        },
        retrieveAndGenerateConfiguration ={
            'knowledgeBaseConfiguration': {
                'knowledgeBaseId': kbId,
                'modelArn': model_arn,
                'retrievalConfiguration': {
                    'vectorSearchConfiguration': {
                        'numberOfResults': numberOfResults,
                        'overrideSearchType': "SEMANTIC", # optional'
                    }
                },
                'generationConfiguration': {
                        'promptTemplate': {
                            'textPromptTemplate': promptTemplate 
                        }
                    }
            },
            'type': 'KNOWLEDGE_BASE'
        },
    )
response = retrieveAndGenerate("What was the Amazon's revenue in 2019 and 2021 ?"", \
"", , , , )['output']['text']

デフォルトのプロンプトテンプレートでは、次のようなレスポンスが得られます。

レスポンスを特定のフォーマット(JSON など)に標準化したい場合、既存のプロンプトをカスタマイズすることで、生成されるレスポンスの出力フォーマットに関する追加の指示を設定することができます。カスタムプロンプトテンプレートを使用すると、次のような JSON フォーマットのレスポンスが得られます。

generationConfiguration の promptTemplate オプションでは、回答生成をより細かく制御するためにプロンプトをカスタマイズできます。

結論

この記事では、Amazon Bedrock の Knowledge base の 2 つの新機能について紹介しました。検索結果の最大数の調整と、RetrieveAndGenerate API のデフォルトプロンプトテンプレートのカスタマイズです。これらの機能をコンソールや SDK で設定して、生成されたレスポンスのパフォーマンスと精度を向上させる方法を示しました。最大結果数を増やすことでより包括的な情報が得られ、プロンプトテンプレートをカスタマイズすることで、特定のユースケースにより適合するように FM への指示を微調整できます。これらの機能強化により、柔軟性と制御性が向上し、RAG ベースのアプリケーションにおいてテーラーメイドのエクスペリエンスを提供できるようになります。

AWS 環境での実装を開始するための追加リソースについては、以下を参照してください。

翻訳は Solutions Architect 小林が担当しました。原文はこちらをご覧ください