Amazon SageMaker JumpStart の基盤モデルで検索拡張生成を使用した質問応答

Amazon SageMaker JumpStart の基盤モデルで検索拡張生成を使用した質問応答

本日、大規模言語モデル (LLM) を使用した検索拡張生成 (RAG) ベースのアプローチを使用した質問応答タスクを示すサンプル ノートブックが利用可能になったことを発表します。 Amazon SageMaker ジャンプスタート。 RAG と LLM を使用したテキスト生成では、LLM に供給されるコンテキストの一部として特定の外部データを提供することで、ドメイン固有のテキスト出力を生成できます。

JumpStart は、機械学習 (ML) の取り組みを加速するのに役立つ機械学習 (ML) ハブです。 JumpStart は、事前トレーニングされた言語モデルを多数提供します。 基礎モデル 記事の要約、質問への回答、会話の生成や画像の生成などのタスクを実行するのに役立ちます。

この投稿では、RAG とその利点について説明し、ジャンプスタートで LLM を使用した RAG 実装を使用して質問応答タスクを解決するサンプル ノートブックを使用して、すぐに開始する方法を示します。 次の XNUMX つのアプローチを示します。

  • オープンソースの問題を解決する方法 ラングチェーン ライブラリと アマゾンセージメーカー 数行のコードでエンドポイントを作成
  • SageMaker KNN アルゴリズムを使用して、SageMaker エンドポイントを使用して大規模データのセマンティック検索を実行する方法

LLMS と制約

LLM は大量の非構造化データでトレーニングされており、一般的なテキスト生成に優れています。 LLM は、自然言語データの大規模なコーパスでパラメータをトレーニングすることにより、事実の知識を保存できます。

既製の事前トレーニング済み LLM の使用にはいくつかの制限があります。

  • 通常、オフラインでトレーニングされるため、モデルは最新の情報に依存しません (たとえば、2011 年から 2018 年にトレーニングされたチャットボットには、新型コロナウイルス感染症 (COVID-19) に関する情報がありません)。
  • パラメータに保存されている情報のみを参照して予測を行うため、解釈可能性が低くなります。
  • 彼らは主に一般的なドメイン コーパスについてトレーニングされているため、ドメイン固有のタスクではあまり効果的ではありません。 モデルに一般的なデータではなく特定のデータに基づいてテキストを生成させたいシナリオがあります。 たとえば、健康保険会社は、回答が正確で、独自のビジネス ルールを反映できるように、企業ドキュメント リポジトリまたはデータベースに保存されている最新情報を使用して質問応答ボットが質問に回答できるようにしたい場合があります。

現在、LLM 内の特定のデータを参照するには XNUMX つの一般的な方法があります。

  • 結果の作成中にモデルが使用できる情報を提供する方法として、モデル プロンプトにデータをコンテキストとして挿入します。
  • プロンプトと補完のペアを含むファイルを提供してモデルを微調整する

コンテキストベースのアプローチの課題は、モデルのコンテキスト サイズが制限されており、すべてのドキュメントをコンテキストとして含めると、モデルの許容コンテキスト サイズに収まらない可能性があることです。 使用するモデルによっては、より大きなコンテキストに対して追加料金が発生する場合もあります。

微調整のアプローチでは、適切な形式の情報を生成するのに時間がかかり、コストもかかります。 さらに、微調整に使用される外部データが頻繁に変更される場合、正確な結果を作成するには頻繁な微調整と再トレーニングが必要であることを意味します。 頻繁なトレーニングは市場投入までの速度に影響し、ソリューション全体のコストが増加します。

これらの制約を実証するために、LLM Flan T5 XXL モデルを使用し、次の質問をしました。

question = "Which instances can I use with Managed Spot Training in SageMaker?"

次の応答があります。

"""For model: huggingface-text2text-flan-t5-xxl, the generated output is: the Managed Spot Training is a subscriptions product available for the following instances: Data Science Virtual Machine (DSVM), DSVM High, and DSVM Low. """

ご覧のとおり、応答は正確ではありません。 正解は、すべての SageMaker インスタンスがマネージド スポット トレーニングをサポートしていることです。

同じ質問を試みましたが、追加のコンテキストが質問とともに渡されました。

question + context + prompt = """
Answer based on context: Managed Spot Training can be used with all instances supported in Amazon SageMaker. Managed Spot Training is supported in all AWS Regions where Amazon SageMaker is currently available. Which instances can I use with Managed Spot Training in SageMaker? """

今回は以下のような回答を頂きました。

"""For model: huggingface-text2text-flan-t5-xxl, the generated output is: instances supported in Amazon SageMaker """

応答は良くなりましたが、まだ正確ではありません。 ただし、実際の実稼働ユースケースでは、ユーザーがさまざまなクエリを送信する可能性があり、正確な応答を提供するために、利用可能な情報のすべてまたはほとんどを静的コンテキストの一部として含めて正確な応答を作成することが必要な場合があります。 したがって、このアプローチでは、質問された質問に関連しない情報もコンテキストの一部として送信されるため、コンテキスト サイズ制限の制約に遭遇する可能性があります。 ここで、RAG ベースのアプローチを使用して、ユーザーのクエリに対するスケーラブルで正確な応答を作成できます。

検索拡張生成

説明した制約を解決するには、LLM で検索拡張生成 (RAG) を使用できます。 RAG は、言語モデルの外部 (ノンパラメトリック) からデータを取得し、取得した関連データをコンテキスト内に追加することでプロンプトを拡張します。 RAG モデルは以下によって導入されました。 ルイスら。 2020年に パラメトリック メモリが事前トレーニングされた seq2seq モデルであり、ノンパラメトリック メモリがウィキペディアの密なベクトル インデックスであるモデルとして、事前トレーニングされたニューラル リトリーバーでアクセスします。

RAG では、ドキュメント リポジトリ、データベース、API などの複数のデータ ソースから外部データを取得できます。 最初のステップは、ドキュメントとユーザー クエリを比較して関連性検索を実行できる形式に変換することです。 関連性検索を実行するためにフォーマットを比較できるようにするために、文書コレクション (ナレッジ ライブラリ) とユーザーが送信したクエリは、埋め込み言語モデルを使用して数値表現に変換されます。 埋め込みは本質的に、テキスト内の概念を数値的に表現したものです。 次に、ユーザー クエリの埋め込みに基づいて、埋め込み空間での類似性検索によって、ドキュメント コレクション内でその関連テキストが特定されます。 次に、ユーザーが提供したプロンプトに、検索された関連テキストが追加され、コンテキストに追加されます。 プロンプトは LLM に送信され、コンテキストには元のプロンプトとともに関連する外部データが含まれるため、モデルの出力は関連性があり正確になります。

参照ドキュメントの最新情報を維持するには、ドキュメントを非同期的に更新し、ドキュメントの埋め込み表現を更新します。 このようにして、更新されたドキュメントを使用して今後の質問に対する回答が生成され、正確な回答が提供されます。

次の図は、LLM で RAG を使用する概念的なフローを示しています。

Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence の基礎モデルで取得拡張生成を使用した質問応答。垂直検索。あい。

この投稿では、次の手順で質問応答アプリケーションを実装する方法を示します。

  1. SageMaker GPT-J-6B 埋め込みモデルを使用して、ナレッジ ライブラリ内の各ドキュメントの埋め込みを生成します。
  2. ユーザーのクエリに基づいて、最も関連性の高いドキュメントの上位 K 個を特定します。
    1. クエリに対して、同じ埋め込みモデルを使用してクエリの埋め込みを生成します。
    2. インメモリ FAISS 検索を使用して、埋め込みスペース内で最も関連性の高い上位 K 個のドキュメントのインデックスを検索します。
    3. インデックスを使用して、対応するドキュメントを取得します。
  3. 取得した関連ドキュメントをプロンプトと質問のコンテキストとして使用し、それらを SageMaker LLM に送信して応答を生成します。

次のアプローチを示します。

  • SageMaker LLM を使用して質問応答タスクを解決し、エンドポイントとオープンソース ライブラリ LangChain を数行のコードで解決する方法。 特に、LLM (Flan T5 XXL) と埋め込みモデル (GPT-J 6B) に XNUMX つの SageMaker エンドポイントを使用し、使用されるベクター データベースはメモリ内にあります。 フェイス。 詳細については、「 GitHubレポ.
  • インメモリ FAISS が大規模なデータセットに適合しない場合は、 SageMaker KNN アルゴリズム セマンティック検索を実行します。これも基礎となる検索アルゴリズムとして FAISS を使用します。 詳細については、 GitHubレポ.

次の図は、ソリューション アーキテクチャを示しています。

Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence の基礎モデルで取得拡張生成を使用した質問応答。垂直検索。あい。

LangChain を使用した JumpStart RAG ベースの実装ノートブック

ラングチェーン は、言語モデルを利用してアプリケーションを開発するためのオープンソース フレームワークです。 LangChain は、さまざまな LLM に汎用インターフェイスを提供します。 また、開発者がさまざまな LLM をチェーンして強力なアプリケーションを構築することも容易になります。 LangChain は、エージェントまたはチェーンの呼び出し間で状態を保持するためのメモリの標準インターフェイスとメモリ実装のコレクションを提供します。

LangChain には、開発者の生産性を向上させる他の多くのユーティリティ機能があります。 これらの機能には、プロンプト テンプレート内の変数を使用してプロンプトをカスタマイズするのに役立つプロンプト テンプレート、エンドツーエンド アプリケーションを構築するエージェント、チェーンの検索および取得ステップのインデックスなどが含まれます。 LangChain の機能をさらに詳しく調べるには、以下を参照してください。 ラングチェーンのドキュメント.

LLM モデルの作成

最初のステップとして、選択した JumpStart LLM モデルをデプロイします。 このデモでは、Jumpstart Flan T5 XXL モデル エンドポイントを使用します。 導入手順については、以下を参照してください。 Amazon SageMaker JumpStart での Flan-T5 基盤モデルのゼロショット プロンプト。 ユースケースに基づいて、次のような他の命令調整モデルをデプロイすることもできます。 フラン T5 UL2 or ブルームズ 7B1。 詳細については、 サンプルノート.

LangChain で SageMaker LLM エンドポイントを使用するには、次を使用します。 langchain.llms.sagemaker_endpoint.SagemakerEndpoint、SageMaker LLM エンドポイントを抽象化します。 LangChain SageMaker 統合の次のコードに示すように、リクエストとレスポンスのペイロードの変換を実行する必要があります。 コードを調整する必要がある場合があることに注意してください。 ContentHandler に基づく content_type 使用することを選択した LLM モデルの形式を受け入れます。

from langchain.llms.sagemaker_endpoint import SagemakerEndpoint class ContentHandler(ContentHandlerBase): content_type = "application/json" accepts = "application/json" def transform_input(self, prompt: str, model_kwargs={}) -> bytes: input_str = json.dumps({"text_inputs": prompt, **model_kwargs}) return input_str.encode("utf-8") def transform_output(self, output: bytes) -> str: response_json = json.loads(output.read().decode("utf-8")) return response_json["generated_texts"][0] content_handler = ContentHandler() sm_llm = SagemakerEndpoint( endpoint_name=_MODEL_CONFIG_["huggingface-text2text-flan-t5-xxl"]["endpoint_name"], region_name=aws_region, model_kwargs=parameters, content_handler=content_handler,
)

埋め込みモデルを作成する

次に、埋め込みモデルを準備する必要があります。 私たちは、 GPT-J6B モデルを埋め込みモデルとして使用します。 JumpStart 埋め込みモデルを使用している場合は、LangChain SageMaker エンドポイント埋め込みクラスをカスタマイズし、モデルのリクエストとレスポンスを変換して LangChain と統合する必要があります。 詳細な実装については、を参照してください。 GitHubレポ.

embeddings = SagemakerEndpointEmbeddingsJumpStart( endpoint_name=_MODEL_CONFIG_["huggingface-textembedding-gpt-j-6b"]["endpoint_name"], region_name=aws_region, content_handler=content_handler,
)

LangChain ドキュメント ローダーを使用してドメイン固有のドキュメントをロードし、インデックスを作成する

私たちは、使用 CSVLoader CSV 形式のドキュメントをドキュメント ローダーにロードするには、LangChain のパッケージを使用します。

loader = CSVLoader(file_path="rag_data/processed_data.csv")
documents = loader.load()

次に、TextSplitter を使用して埋め込み目的でデータを前処理し、SageMaker 埋め込みモデルを使用します。 GPT-J-6B 埋め込みを作成します。 インデックスを作成するために、FAISS ベクター ストアに埋め込みを保存します。 このインデックスを使用して、ユーザーのクエリと意味的に類似した関連ドキュメントを検索します。

次のコードは、これらすべてのステップがどのように実行されるかを示しています。 VectorstoreIndexCreator LangChain のわずか数行のコードでクラスを作成し、RAG を使用した質問応答の簡潔な実装を作成します。

index_creator = VectorstoreIndexCreator( vectorstore_cls=FAISS, embedding=embeddings, text_splitter=CharacterTextSplitter(chunk_size=300, chunk_overlap=0),
)
index = index_creator.from_loaders([loader])

インデックスを使用して関連するコンテキストを検索し、LLM モデルに渡します。

次に、作成したインデックスに対して query メソッドを使用し、ユーザーの質問と SageMaker エンドポイント LLM を渡します。 LangChain は、上位 4 つの最も近いドキュメント (K=XNUMX) を選択し、ドキュメントから抽出された関連コンテキストを渡して、正確な応答を生成します。 次のコードを参照してください。

index.query(question=question, llm=sm_llm)

Flan T5 XXL を使用した RAG ベースのアプローチを使用すると、クエリに対して次の応答が得られます。

"""For model: huggingface-text2text-flan-t5-xxl, the generated output is: Managed Spot Training can be used with all instances supported in Amazon SageMaker """

この応答は、コンテキストがない、または必ずしも関連性があるとは限らない静的なコンテキストを持たない、以前に示した他のアプローチで得られた応答と比較して、より正確に見えます。

SageMaker と LangChain を使用してさらにカスタマイズした RAG を実装する代替アプローチ

このセクションでは、SageMaker と LangChain を使用して RAG を実装する別のアプローチを示します。 このアプローチでは、ドキュメント内の関連性検索用に上位 K パラメーターを構成する柔軟性が提供されます。 また、LangChain 機能を使用することもできます。 プロンプトテンプレートこれにより、プロンプトをハードコーディングする代わりに、プロンプトの作成を簡単にパラメータ化できます。

次のコードでは、FAISS を明示的に使用して、SageMaker GPT-J-6B 埋め込みモデルを使用してナレッジ ライブラリ内の各ドキュメントの埋め込みを生成します。 次に、ユーザーのクエリに基づいて、最も関連性の高い上位 K (K=3) ドキュメントを特定します。

docsearch = FAISS.from_documents(documents, embeddings)
docs = docsearch.similarity_search(question, k=3)

次に、プロンプト テンプレートを使用し、それを SageMaker LLM とチェーンします。

prompt_template = """Answer based on context:nn{context}nn{question}"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
chain = load_qa_chain(llm=sm_llm, prompt=PROMPT)

LangChain チェーンを使用して、見つかった上位 3 つ (K=XNUMX) の関連ドキュメントをコンテキストとしてプロンプトに送信します。

result = chain({"input_documents": docs, "question": question}, return_only_outputs=True)["output_text"]

RAG 実装のこのアプローチにより、LangChain プロンプト テンプレートのさらなる柔軟性を活用し、上位 K ハイパーパラメータを使用して関連性の一致を検索するドキュメントの数をカスタマイズすることができました。

SageMaker KNN を使用した JumpStart RAG ベースの実装ノートブック

このセクションでは、KNN アルゴリズムを使用して関連ドキュメントを検索し、強化されたコンテキストを作成する RAG ベースのアプローチを実装します。 このアプローチでは、LangChain は使用しませんが、同じデータセットを使用します。 Amazon SageMaker のよくある質問 以前の LangChain アプローチと同様に、モデル GPT-J-6B および LLM Flan T5 XXL をナレッジ ドキュメントとして埋め込みます。

大規模なデータセットがある場合、 SageMaker KNN アルゴリズム 効果的なセマンティック検索が提供される場合があります。 SageMaker KNN アルゴリズムは、基盤となる検索アルゴリズムとして FAISS も使用します。 このソリューションのノートブックは次の場所にあります。 GitHubの.

まず、前のセクションと同じ方法で、LLM Flan T5 XXL および GPT-J 6B 埋め込みモデルをデプロイします。 ナレッジ データベース内のレコードごとに、GPT-J 埋め込みモデルを使用して埋め込みベクトルを生成します。

次に、 セージメーカー KNN ナレッジ データの埋め込みにインデックスを付けるトレーニング ジョブ。 データのインデックス付けに使用される基礎となるアルゴリズムは次のとおりです。 フェイス。 最も関連性の高いドキュメントの上位 XNUMX つを見つけたいので、 TOP_K KNN アルゴリズムの推定器を作成し、トレーニング ジョブを実行し、KNN モデルをデプロイして、クエリに一致する上位 5 つのドキュメントのインデックスを見つけます。 次のコードを参照してください。

from sagemaker.amazon.amazon_estimator import get_image_uri def trained_estimator_from_hyperparams(s3_train_data, hyperparams, output_path): """ Create an Estimator from the given hyperparams, fit to training data, and return a deployed predictor """ # set up the estimator knn = sagemaker.estimator.Estimator( get_image_uri(boto3.Session().region_name, "knn"), aws_role, instance_count=1, instance_type="ml.m5.2xlarge", output_path=output_path, sagemaker_session=sess, ) knn.set_hyperparameters(**hyperparams) # train a model. fit_input contains the locations of the train data fit_input = {"train": s3_train_data} knn.fit(fit_input) return knn hyperparams = {"feature_dim": train_features.shape[1], "k": TOP_K,"sample_size": train_features.shape[0], "predictor_type": "classifier"}
output_path = f"s3://{bucket}/{prefix}/default_example/output"
knn_estimator = trained_estimator_from_hyperparams( s3_train_data, hyperparams, output_path)

次に、ナレッジ ライブラリ ドキュメントの埋め込みを作成するために使用した GPT-J-6B 埋め込みモデルを使用して、クエリの埋め込み表現を作成します。

query_response = query_endpoint_with_json_payload(question, endpoint_name_embed, content_type="application/x-text")
question_embedding = parse_response_text_embed(query_response)

次に、KNN エンドポイントを使用し、クエリの埋め込みを KNN エンドポイントに渡し、最も関連性の高い上位 K 個のドキュメントのインデックスを取得します。 インデックスを使用して、対応するテキスト文書を取得します。 次に、コンテキストの最大許容長を超えないようにドキュメントを連結します。 次のコードを参照してください。

"""With maximum sequence length 500, selected top 4 document sections: Managed Spot Training can be used with all instances supported in Amazon SageMaker. Managed Spot Training is supported in all AWS Regions where Amazon SageMaker is currently available. The difference between Savings Plans for Amazon SageMaker and Savings Plans for EC2 is in the services they include. SageMaker Savings Plans apply only to SageMaker ML Instance usage. There are no fixed limits to the size of the dataset you can use for training models with Amazon SageMaker. """

ここで、クエリ、プロンプト、および関連ドキュメントのテキストを含むコンテキストを結合し、それをテキスト生成 LLM Flan T5 XXL モデルに渡して回答を生成する最後のステップに進みます。

Flan T5 XXL を使用した RAG ベースのアプローチを使用すると、クエリに対して次の応答が得られます。

"""
For model: huggingface-text2text-flan-t5-xxl, the generated output is: Managed Spot Training can be used with all instances supported in Amazon SageMaker """

クリーンアップ

このノートブックで作成したエンドポイントを使用しない場合は、コストの再発を避けるために必ず削除してください。

まとめ

この投稿では、LangChain と組み込み KNN アルゴリズムという 5 つのアプローチを使用して、質問応答タスク用の LLM による RAG ベースのアプローチの実装を実証しました。 RAG ベースのアプローチは、ドキュメントのリストを検索して作成された関連コンテキストを動的に提供することで、Flan TXNUMX XXL を使用したテキスト生成の精度を最適化します。

これらのノートブックは SageMaker でそのまま使用することも、ニーズに合わせてカスタマイズすることもできます。 カスタマイズするには、ナレッジ ライブラリ内の独自のドキュメント セットを使用したり、OpenSearch などの他の関連性検索実装を使用したり、JumpStart で利用可能な他の埋め込みモデルやテキスト生成 LLM を使用したりできます。

RAG ベースのアプローチを使用して、JumpStart で何を構築するか楽しみにしています。


著者について

Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence の基礎モデルで取得拡張生成を使用した質問応答。垂直検索。あい。XinHuang博士 Amazon SageMaker JumpStart および Amazon SageMaker 組み込みアルゴリズムの上級応用科学者です。 スケーラブルな機械学習アルゴリズムの開発に注力しています。 彼の研究対象は、自然言語処理、表形式データの説明可能なディープ ラーニング、およびノンパラメトリック時空クラスタリングの堅牢な分析の分野です。 彼は、ACL、ICDM、KDD カンファレンス、Royal Statistical Society: Series A で多くの論文を発表しています。

Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence の基礎モデルで取得拡張生成を使用した質問応答。垂直検索。あい。ラクナ チャダ は、AW​​S の戦略アカウントにおける AI/ML のプリンシパル ソリューション アーキテクトです。 Rachna は楽観主義者で、AI を倫理的かつ責任を持って使用することで将来の社会を改善し、経済的および社会的繁栄をもたらすことができると信じています。 余暇には、家族と一緒に時間を過ごしたり、ハイキングをしたり、音楽を聴いたりするのが好きです。

Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence の基礎モデルで取得拡張生成を使用した質問応答。垂直検索。あい。カイル・ウルリッヒ博士 Amazon SageMaker 組み込みアルゴリズムチームの応用科学者です。 彼の研究対象には、スケーラブルな機械学習アルゴリズム、コンピューター ビジョン、時系列、ベイジアン ノンパラメトリック、ガウス プロセスなどがあります。 彼はデューク大学で博士号を取得しており、NeurIPS、Cell、および Neuron で論文を発表しています。

Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence の基礎モデルで取得拡張生成を使用した質問応答。垂直検索。あい。ヘマントシン Amazon SageMaker JumpStart および Amazon SageMaker 組み込みアルゴリズムの経験を持つ機械学習エンジニアです。 彼はクーラント数理科学研究所で修士号を取得し、デリー工科大学で学士号を取得しました。 彼は、自然言語処理、コンピューター ビジョン、時系列分析の分野でさまざまな機械学習の問題に取り組んだ経験があります。

Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence の基礎モデルで取得拡張生成を使用した質問応答。垂直検索。あい。マナス・ダダルカール Amazon Forecast サービスのエンジニアリングを担当するソフトウェア開発マネージャーです。 彼は、機械学習のアプリケーションと、ML テクノロジを誰もが簡単に利用できるようにして、本番環境に導入してデプロイできるようにすることに情熱を注いでいます。 仕事以外では、旅行、読書、友人や家族と過ごす時間など、複数のことに興味を持っています。

Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence の基礎モデルで取得拡張生成を使用した質問応答。垂直検索。あい。アシッシュ・ケタン博士 は、Amazon SageMaker 組み込みアルゴリズムを使用する上級応用科学者であり、機械学習アルゴリズムの開発を支援しています。 イリノイ大学アーバナシャンペーン校で博士号を取得。 彼は機械学習と統計的推論の活発な研究者であり、NeurIPS、ICML、ICLR、JMLR、ACL、および EMNLP カンファレンスで多くの論文を発表しています。

タイムスタンプ:

より多くの AWS機械学習