Amazon Web Services ブログ

高精度な生成系 AI アプリケーションを Amazon Kendra、LangChain、大規模言語モデルを使って作る

2023/05/17: DocumentExcerpt の Request quota value を 1000 から 750 に修正しました
2023/05/18: Flan-T5-XL、Flan-T5-XXL、Anthropic Claude-V1、OpenAI text-davinci-003のtypoを修正しました


Amazon BedrockAmazon Titan を通じて間もなく利用可能になるような生成系 AI(GenAI)と大規模言語モデル(LLM)は、開発者や企業が従来行っていた自然言語処理と自然言語理解に関連する複雑な課題の解決方法を変革しています。LLM が提供するメリットには、カスタマーサービスアプリケーション向けのより有能で説得力のある会話型 AI 体験を作成できることや、より直感的で正確な応答で従業員の生産性を向上できる、などがあります。

しかし、これらのユースケースでは、会話体験を実装する GenAI アプリケーションが、回答を企業データに限定することでモデルのハルシネーション (誤った発言) を軽減し、エンドユーザーのコンテンツアクセス権限に応じて回答をフィルタリングするという2つの重要な基準を満たすことが重要です。

GenAI アプリケーションの出力を企業データのみに制限するには、検索拡張生成 (RAG, Retrieval Augmented Generation) と呼ばれる手法を使用する必要があります。RAG アプローチを使用するアプリケーションは、ユーザーのリクエストに最も関連する情報を企業のナレッジベースまたはコンテンツから取得し、それをプロンプトとしてユーザーのリクエストとともにコンテキストとして束ね、LLM に送信して GenAI レスポンスを取得します。LLM には入力プロンプトの最大単語数に制限があるため、企業内の数千または数百万のドキュメントの中から適切な文章を抽出することが LLM の精度に直接影響します。

効果的なRAGを設計する上で、LLMが企業コンテンツから最も関連性が高く簡潔なコンテキストを受け取り、正確な回答を生成させるには、コンテンツ検索が重要なステップです。ここで、Amazon Kendraインテリジェント検索が重要な役割を果たします。Amazon Kendra は完全マネージド型のサービスで、すぐに使えるセマンティック検索機能により、ドキュメントや文章の最先端のランキングを行うことができます。Amazon Kendra の高精度検索を使用して、最も関連性の高いコンテンツやドキュメントを取り出し、RAG ペイロードの品質を最大限に高めることができます。これにより、従来の検索ソリューションやキーワードベースの検索ソリューションを使用するよりも優れた LLM からの出力を得られます。Amazon Kendra は、14 のドメインで事前にトレーニングされ、ML の専門知識を必要としない使いやすいディープラーニング検索モデルを提供しているため、RAG の実装に通常必要とされる単語の埋め込み、ドキュメントのチャンキング、その他の低レベルの複雑さに対処する必要はありません。Amazon Kendra には、Amazon Simple Storage Service (Amazon S3)、SharePoint、Confluence、ウェブサイトなどの一般的なデータソースへのコネクタがあらかじめ組み込まれており、HTML、Word、PowerPoint、PDF、Excel、テキストファイルなどの一般的なドキュメント形式もサポートしています。エンドユーザーの権限で許可されているドキュメントのみに基づいて応答をフィルタリングするために、Amazon Kendra ではアクセス制御リスト (ACL) をサポートするコネクタを提供しています。Amazon Kendra では、ユーザーグループ情報を Okta や Azure AD などのカスタマー ID プロバイダーと同期できるように、AWS Identity and Access Management (IAM)AWS IAM Identity Center (successor to AWS Single Sign-On) を統合することもできます。

この記事では、Amazon Kendra の機能と LLM の機能を組み合わせて RAG ワークフローを実装し、エンタープライズコンテンツ上で会話型のエクスペリエンスを提供する最先端の GenAI アプリケーションを作成する方法を示します。Amazon Bedrockのローンチ後、Amazon Bedrockを使用して同様のGenAIアプリケーションを実装する方法を示すフォローアップ記事を公開する予定ですので、ご期待ください。

ソリューション概要

次の図は、RAG アプローチによる GenAI アプリケーションのアーキテクチャを示しています。

Amazon Kendra インデックスを使用して、wiki ページ、MS SharePoint サイト、Atlassian Confluence などのデータソースや Amazon S3 などのドキュメントリポジトリからエンタープライズ非構造化データを取り込みます。ユーザーが GenAI アプリを操作するときのフローは次のようになります。

  1. ユーザーはGenAIアプリにリクエストを出す。
  2. アプリはユーザーのリクエストに基づき、Amazon Kendra インデックスに検索クエリを発行します。
  3. インデックスは、取り込まれたエンタープライズデータから関連するドキュメントの抜粋を含む検索結果を返す。
  4. アプリは、ユーザーリクエストと、インデックスから取得したデータをLLMプロンプトのコンテキストとして送信します。
  5. LLMは、検索されたデータに基づいて、ユーザーリクエストに対する簡潔なレスポンスを返します。
  6. LLMからの応答はユーザーに送り返されます。

このアーキテクチャでは、ユースケースに最も適した LLM を選択できます。LLM オプションには、パートナーの Hugging Face、AI21 Labs、Cohere をAmazon SageMaker エンドポイントでホストしたもののほか、AnthropicOpenAI などの企業によるモデルも含まれます。Amazon Bedrock では Amazon が所有する LLM であるAmazon Titan やパートナーが提供する API 付きの AI21 Labs や Anthropic などを安全に選択できるようになります。データをAWSエコシステムから持ち出す必要はありません。Amazon Bedrock が提供するその他の利点としては、サーバーレスアーキテクチャ、サポートされている LLM を呼び出す単一の API、開発者のワークフローを効率化するマネージドサービスなどがあります。

最良の結果を得るには、GenAI アプリは、ユーザーの要求と使用されている特定の LLM に基づいてプロンプトを設計する必要があります。会話型 AI アプリでは、チャットの履歴とコンテキストも管理する必要があります。GenAI アプリ開発者は、選択したLLMと統合するモジュールを提供するLangChainなどのオープンソースフレームワークや、チャット履歴管理やプロンプトエンジニアリングなどのアクティビティ用のオーケストレーションツールを使用できます。LangChain retrieverインターフェイスを実装する KendraIndexRetriever クラスを提供しました。このクラスは、アプリケーションで chains などの他の LangChain インターフェイスと組み合わせて使用して Amazon Kendra インデックスからデータを取得できます。また、GitHub リポジトリでいくつかのサンプルアプリケーションも提供しています。この記事のステップバイステップガイドを使用して、このソリューションを AWS アカウントにデプロイできます。

前提条件

このチュートリアルでは、Linux、Mac、または Linux 用の Windows サブシステムに Python 3.9 以降がインストールされた bash ターミナルと AWS アカウントが必要です。また、AWS Cloud9 インスタンスまたは Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを使用することをお勧めします。

RAG ワークフローの実装

RAG ワークフローを設定するには、次の手順を実行します。

  1. 提供されている AWS CloudFormationテンプレートを利用して、新しい Amazon Kendra インデックスを作成します。このテンプレートには、Amazon Kendra、Amazon Lex と Amazon SageMaker の AWS オンラインドキュメントを含むサンプルデータが含まれています。別の方法として、Amazon Kendra インデックスがあって、独自のデータセットにインデックスを付けている場合は、それを使用することもできます。スタックの起動には約 30 分かかり、その後同期してインデックスにデータを取り込むのに約 15 分かかります。そのため、スタックを起動してから約 45 分待ってください。スタックの Outputs タブにインデックス ID と AWS リージョンを書き留めておきます。
  2. 生成系 AI のエクスペリエンスを向上させるには、大きな文書の抜粋を返すようにすることをおすすめします。そのためにDocumentExcerpt の最大サイズとして Amazon Kendra service quota increase の引き上げをリクエストします。ブラウザから AWS Management Console, Service Quota の順にアクセスしRequest quota increase を選択します。さらに Quoata Value を 750 に変更します。
  3. 任意のコマンドラインインターフェイスに AWS SDK for Python をインストールします。
  4. Streamlit を使用して構築されたサンプル Web アプリを使用する場合は、まず Streamlit をインストールする必要があります。サンプルアプリケーションのコマンドラインバージョンのみを実行する場合、このステップはオプションです。
  5. LangChain をインストールします。
  6. このチュートリアルで使用するサンプルアプリケーションでは、Flan-T5-XL、Flan-T5-XXL、Anthropic Claude-V1、OpenAI text-davinci-003 の 1 つ以上の LLMにアクセスできる必要があります。
    1. Flan-T5-XL、Flan-T5-XXL を使用する場合は、Amazon SageMaker Studio Jumpstart を使用して推論できるようにエンドポイントにデプロイしてください。
    2. Anthropic Claude-V1 や OpenAI da-vinci-003 を利用したい場合は、興味のある LLM の API キーをそれぞれ https://www.anthropic.com/https://openai.com/ から入手してください。
  7. GitHub repoの指示に従って、KendraIndexRetriever インターフェイスとサンプルアプリケーションをインストールします。
  8. サンプルアプリケーションを実行する前に、使用する LLM の Amazon Kendra インデックスの詳細と API キー、または Flan-T5-XL or Flan-T5-XXL のデプロイメントの SageMaker エンドポイントを使用して環境変数を設定する必要があります。以下は、環境変数を設定するサンプルスクリプトです。
    export AWS_REGION="<YOUR-AWS-REGION>"
    export KENDRA_INDEX_ID="<YOUR-KENDRA-INDEX-ID>"
    export FLAN_XL_ENDPOINT="<YOUR-SAGEMAKER-ENDPOINT-FOR-FLAN-T-XL>"
    export FLAN_XXL_ENDPOINT="<YOUR-SAGEMAKER-ENDPOINT-FOR-FLAN-T-XXL>"
    export OPENAI_API_KEY="<YOUR-OPEN-AI-API-KEY>"
    export ANTHROPIC_API_KEY="<YOUR-ANTHROPIC-API-KEY>"
  9. コマンドラインウィンドウで、GitHub リポジトリをCloneした場所の samples サブディレクトリに移動します。コマンドラインアプリは python <sample-file-name.py> としてコマンドラインから実行できます。 ディレクトリを samples に変更し、streamlit run app.py <anthropic|flanxl|flanxxl|openai> と実行すれば、streamlitのWebアプリを実行することができます。
  10. 任意のエディターでサンプルファイル kendra_retriever_flan_xxl.py を開きます。ステートメントに注目してください。result = run_chain(chain, "What's SageMaker?") (“What’s SageMaker?”) はユーザークエリです。 Flan-T-XXLをLLMとして、Amazon Kendra を検索ツール (Retriever) として使用するチェーンで実行されています。 このファイルを実行すると、次のように出力を確認できます。チェーンはユーザークエリを Amazon Kendra インデックスに送信し、上位 3 つの結果の抜粋を取得して、クエリとともにプロンプトでコンテキストとして送信しました。LLM はこれに対して簡潔な回答を返しました。また、ソース(回答の生成に使用されるドキュメントへのURL)も提供されています。
    ~. python3 kendra_retriever_flan_xxl.py
    Amazon SageMaker is a machine learning service that lets you train and deploy models in the cloud.
    Sources:
    https://docs.thinkwithwp.com/sagemaker/latest/dg/data-parallel-intro.html
    https://docs.thinkwithwp.com/sagemaker/latest/dg/sagemaker-projects-whatis.html
    https://docs.thinkwithwp.com/sagemaker/latest/dg/whatis.html
  11. それでは、ウェブアプリ app.pystreamlit run app.py flanxxlとして実行してみましょう。今回の特定の実行では、LLMとしてFlan-T-XXLモデルを使用しています。ブラウザウィンドウが開き、Web インターフェイスが表示されます。クエリを入力できます。この場合は”What is Amazon Lex?”(Amazon Lex とは何です?)次のスクリーンショットに示すように、アプリケーションは応答を返し、Sources セクションには Amazon Kendra インデックスから抜粋を取得して LLM に送信したドキュメントの URL がクエリとともにコンテキストとしてプロンプトに表示されます
  12. それでは、app.pystreamlit run app.py anthropic でもう一度実行して anthropic を使った会話体験の感触をつかんでみましょう。ここで使われているLLMはAnthropic Claude-V1です。

次のビデオでわかるように、LLM は Amazon Kendra インデックスから取得したドキュメントに基づいてユーザーのクエリに対する詳細な回答を提供し、回答の生成に使用されたソースドキュメントの URL を使用して回答をサポートします。2つ目以降のクエリが Amazon Kendra というキーワードを明示的に含んでいなくても Kendra に関する結果を得られていることに注目しましょう。ConversationalRetrievalChain (LangChain フレームワークの一部であり、このLangChainアプリケーションで使用される、検索用インスタンスから取得した会話型のアプリケーションベースの情報を簡単に開発するメカニズムを提供するチェーン) は、チャット履歴とコンテキストを管理して適切な応答を取得します。

また、次のスクリーンショットでは、Amazon Kendra がクエリに対する抽出的な回答を見つけ、上位のドキュメントを抜粋とともに候補リストに追加していることにも注意してください。そうすれば、LLMは取得したこれらの抜粋に基づいて、より簡潔な回答を生成できます。

以下のセクションでは、Amazon Kendra で生成系 AI を使用する場合の 2 つのユースケースについて説明します。

使用事例 1: 金融サービス会社向けの生成系 AI

金融機関は、財務報告書、法的文書、ホワイトペーパーなどを、さまざまなデータリポジトリにわたってデータを作成し保存します。政府による厳しい規制や監督を順守しなければならないため、従業員は関連性が高く正確で信頼できる情報を迅速に見つける必要があります。さらに、さまざまなデータソースからインサイトを検索して集約するのは面倒で、間違いも起こりがちです。AWS の生成系 AI を使用すると、ユーザーはさまざまなデータソースやタイプから回答をすばやく生成し、企業規模で正確な回答を合成できます。

Amazon Kendra と AI21 Lab の Jurassic-2 Jumbo Instruct LLM を使ったソリューションを選ぶ。Amazon Kendra を使用すると、Amazon S3、ウェブサイト、ServiceNow などの複数のデータソースからデータを簡単に取り込むことができます。その後、Amazon Kendra は AI21 Lab の Jurassic-2 Jumbo Instruct LLM を使用して、データ要約やレポート生成などのエンタープライズデータに対する推論アクティビティを実行します。Amazon Kendra は LLM を拡張して、正確で検証可能な情報をエンドユーザーに提供します。これにより LLM のハルシネーション(データソースに含まれていない結果を出力すること)の問題が軽減されます。提案されたソリューションにより、財務アナリストは正確なデータを使用してより迅速な意思決定を行い、詳細で包括的なポートフォリオを迅速に構築できます。近い将来、このソリューションをオープンソースプロジェクトとして利用できるようにする予定です。

Kendra Chatbot ソリューションを使用すると、財務アナリストや監査人は企業データ (財務レポートや契約書) から、監査関連の質問に対する信頼できる回答を見つけることができます。Kendra ChatBotは、ソースリンクとともに回答を提供し、より長い回答を要約する機能を備えています。次のスクリーンショットは、Kendra ChatBot との会話の例を示しています。

※ 日本語環境であれば https://thinkwithwp.com/jp/solutions/partners/quantiphi-lex-kendra/ もご参考ください

アーキテクチャの概要

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

ワークフローには次のステップが含まれます。

  1. 財務書類や契約書は Amazon S3 に保存され、S3 データソースコネクタを使用して Amazon Kendra インデックスに取り込まれます。
  2. LLM は SageMaker エンドポイントでホストされます。
  3. Amazon Lex チャットボットは、Amazon Lex web UI を介してユーザーと対話するために使用されます。
  4. このソリューションでは、AWS Lambda 関数と LangChain を使用してAmazon Kendra、Amazon Lex、LLM 間のオーケストレーションを行います。
  5. ユーザーが Amazon Lex チャットボットに財務書類の回答を求めると、Amazon Lex は LangChain オーケストレーターを呼び出してリクエストを処理します。
  6. クエリに基づいて、LangChain オーケストレーターは Amazon Kendra から関連する財務記録と段落を取得します。
  7. LangChainオーケストレータは、これらの関連レコードをクエリと関連プロンプトとともにLLMに提供し、必要なアクティビティを実行します。
  8. LLM は LangChain オーケストレータからのリクエストを処理し、結果を返します。
  9. LangChain オーケストレーターは LLM から結果を取得し、Amazon Lex チャットボットを介してエンドユーザーに送信します。

使用事例 2: 医療研究者および臨床医向けの生成系 AI

臨床医や研究者は、研究の一環として、医学雑誌や政府の医療ウェブサイトからの何千もの記事を分析することがよくあります。さらに重要なのは、調査結果の検証と実証に使用できる信頼できるデータソースを求めていることです。このプロセスには、何時間もの集中的な調査、分析、データ統合が必要になり、価値とイノベーションを実現するための時間が長くなります。AWS の生成系 AI では、信頼できるデータソースに接続し、自然言語クエリを実行して、これらの信頼できるデータソースに関する洞察を数秒で生成できます。また、応答の生成に使用されたソースを確認して、その正確性を検証することもできます。

Amazon Kendra と Hugging Face の Flan-T5-XXL を使ったソリューションを選ぶ。まず、Amazon Kendra を使用して、コーパス全体の意味的に関連するドキュメントからテキストスニペットを識別します。次に、Flan-T5-XXL などの LLM の力を利用して Amazon Kendra のテキストスニペットをコンテキストとして使用し、簡潔な自然言語による回答を取得します。このアプローチでは、Amazon Kendra インデックスが RAG メカニズムのパッセージリトリーバーコンポーネントとして機能します。最後に、Amazon Lex を使用してフロントエンドを強化し、エンドユーザーにシームレスで応答性の高いエクスペリエンスを提供しています。近い将来、このソリューションをオープンソースプロジェクトとして利用できるようにする予定です。

次のスクリーンショットは、GitHub で入手可能なテンプレートを使用してソリューション用に構築された Web UI のものです。ピンク色のテキストは Amazon Kendra LLM システムからの応答で、青色のテキストはユーザーの質問です。

アーキテクチャの概要

このソリューションのアーキテクチャとソリューションワークフローは、ユースケース 1 のものと似ています。

クリーンアップ

コストを節約するには、チュートリアルの一部としてデプロイしたリソースをすべて削除してください。CloudFormation スタックを起動した場合は、AWS CloudFormation コンソールからそれを削除できます。同様に、SageMaker コンソールから作成した SageMaker エンドポイントをすべて削除できます。

結論

大規模な言語モデルを活用した生成系 AI は、人々が情報から洞察を得て適用する方法を変えています。ただし、企業のユースケースでは検索拡張生成 (RAG) アプローチを使用して回答をドメイン内に収め、ハルシネーション(誤った回答)を軽減しなければいけません。RAG アプローチでは、LLM によって生成される洞察の質は、その基となる取得情報のセマンティック関連性によって決まるため、すぐに高精度のセマンティック検索結果を提供する Amazon Kendra などのソリューションを使用する必要性が高まっています。データソースコネクタの包括的なエコシステム、一般的なファイル形式のサポート、セキュリティが組み込まれた Amazon Kendra を検索メカニズムとして使用し、エンタープライズユースケース向けの生成系 AI ソリューションをすぐに使い始めることができます。

AWS での生成系 AI の使用に関する詳細については、「Announcing New Tools for Building with Generative AI on AWS」を参照してください。このブログで説明されている方法を使用して、エンタープライズ GenAI アプリの RAG 概念実証(POC)の実験と構築を開始できます。先に述べたように、Amazon Bedrock、Amazon Bedrock を使用して RAG を構築する方法を紹介するフォローアップブログを公開します。

このブログはQuickly build high-accuracy Generative AI applications on enterprise data using Amazon Kendra, LangChain, and large language modelsを翻訳したものです


著者について

方志卓朗

Abhinav Jawadekar は、AWS の AI/ML 言語サービスチームで Amazon Kendra を専門とするプリンシパルソリューションアーキテクトです。Abhinav は AWS のお客様やパートナーと協力して、AWS でインテリジェントな検索ソリューションを構築できるよう支援しています。

Jean-Pierre Dodel

Jean-Pierre Dodelは Amazon Kendra のプリンシパルプロダクトマネージャーであり、主要な戦略的製品機能とロードマップの優先順位付けを統括しています。7 年前に Amazon に入社する前は、Autonomy、HP、検索の新興企業で主役を務めた経験があり、エンタープライズサーチと ML/AI の豊富な経験をチームにもたらしています。

Mithil Shah

Mithil Shahは AWS の ML/AI スペシャリストです。現在は、AWS で機械学習ソリューションを構築することで、公共部門の顧客が市民の生活を改善できるよう支援しています。

Mithil Shah

Firaz Akmalは AWS の Amazon Kendra のシニアプロダクトマネージャーです。彼はカスタマーアドボケイトであり、AWS で Kendra を使用して顧客が検索と生成系 AI のユースケースを理解できるよう支援しています。仕事以外では、Firazは 太平洋岸北西部 の山で時間を過ごしたり、娘 との時間を楽しんでいます。

Abhishek Maligehalli Shivalingaiah

Abhishek Maligehalli Shivalingaiahは、Amazon Kendra を中心とした AWS のシニア AI サービスソリューションアーキテクトです。Amazon Kendra、生成系 AI、NLP を使ったアプリケーションの構築に情熱を注いでいます。彼は、顧客や企業に価値をもたらすデータおよび AI ソリューションの構築に約 10 年携わってきました。彼は、自分のキャリアやプロとしての道のりに関する質問に楽しく答えてくれる(個人的な)チャットボットを構築しました。仕事以外では、家族や友人のポートレートを作るのが好きで、作品を作るのも大好きです。