「HaystackパイプラインとAmazon SageMaker JumpStartを使用して、LLMsを用いたエンタープライズ検索のための本番用ジェネレーティブAIアプリケーションを構築する」
HaystackパイプラインとAmazon SageMaker JumpStartを使用して、エンタープライズ検索のための本番用ジェネレーティブAIアプリケーションを構築する
このブログ記事は、deepsetのTuana Çelikと共同で執筆されています。
エンタープライズ検索は、文書のデジタル化と知識管理を通じた組織の効率性の重要な要素です。エンタープライズ検索では、デジタルファイルなどの文書の保存、検索のための文書のインデックス作成、およびユーザーのクエリに基づいて関連する結果を提供します。大規模な言語モデル(LLM)の登場により、ユーザーに結果を提供するための対話型体験を実装することができます。ただし、LLMが企業データに対して応答を制限することで、モデルの幻覚を軽減する必要があります。
この記事では、HaystackパイプラインとAmazon SageMaker JumpStartおよびAmazon OpenSearch ServiceのFalcon-40b-instructモデルを使用して、エンタープライズ検索のためのエンドツーエンドの生成AIアプリケーションを構築する方法を紹介します。この記事で紹介されているサンプルのソースコードは、GitHubリポジトリで利用できます。
ソリューションの概要
企業データのみに制限した生成AIアプリケーションの応答を実現するには、Retrieval Augmented Generation(RAG)と呼ばれる技術を使用する必要があります。RAGアプローチを使用するアプリケーションは、ユーザーの要求に最も関連性の高い情報をエンタープライズの知識ベースやコンテンツから取得し、プロンプトとしてユーザーの要求とともにコンテキストとしてバンドルし、それをLLMに送信して応答を取得します。LLMは、入力プロンプトの最大単語数に制限がありますので、エンタープライズ内の数千または数百万のドキュメントから適切なパッセージを選択することは、LLMの正確性に直接的な影響を与えます。
- このAIニュースレターは、あなたが必要とするすべてです#60
- 「Amazon SageMaker 上での LLM を使用した多言語対応の知識型ビデオおよび音声の質疑応答システム」
- 「AmazonショッピングがAmazon Rekognitionコンテンツモデレーションを使用して商品レビューの有害な画像を確認する方法」
RAG技術は、エンタープライズ検索においてますます重要になっています。この記事では、SageMaker JumpStartを活用してFalcon-40b-instructモデルを展開し、Haystackを使用してリトリーバルを補完した質問応答パイプラインを設計および実行するワークフローを紹介します。最終的なリトリーバルの補完ワークフローは、次の高レベルのステップをカバーします。
- ユーザーのクエリは、リトリーバーのコンポーネントに使用され、ベクトル検索を実行してデータベースから最も関連性の高いコンテキストを取得します。
- このコンテキストは、LLMに対してプロンプトとしてデザインされたプロンプトに埋め込まれ、提供されたコンテキストのみを考慮して回答を生成するように指示します。
- LLMは、受け取ったプロンプトに埋め込まれたコンテキストのみを考慮して元のクエリに対する応答を生成します。
SageMaker JumpStart
SageMaker JumpStartは、テキスト、ビジョン、オーディオ、埋め込みのユースケースに対して、幅広い深層学習モデルをカプセル化したモデルハブとして機能します。500以上のモデルがあり、そのモデルハブにはAI21、Stability AI、Cohere、LightOnなどのAWSのパートナーから提供される公開およびプロプライエタリモデルが含まれています。また、AlexaTMなど、Amazonが独自に開発した基盤モデルも提供しています。モデルの一部には、独自のデータでファインチューニングする機能も備わっています。SageMaker JumpStartは、一般的なユースケースのインフラストラクチャを設定するためのソリューションテンプレートや、SageMakerでの機械学習(ML)のための実行可能なサンプルノートブックも提供しています。
Haystack
Haystackは、deepsetによって開発されたオープンソースのフレームワークであり、モデル、ベクトルDB、ファイルコンバータ、その他数多くのモジュールなど、さまざまなコンポーネントで構成されるLLMアプリケーションをオーケストレーションすることができます。Haystackは、検索、質問応答、対話型AIなどのさまざまなユースケースのためのLLMアプリケーションを設計するための2つの強力な構造であるパイプラインとエージェントを提供しています。最先端のリトリーバル手法と堅牢な評価指標に重点を置いており、信頼性のある信頼性のあるアプリケーションを提供するために必要なすべてを提供します。パイプラインをYAMLファイルにシリアライズし、REST APIを介して公開し、ワークロードに柔軟にスケーリングすることで、プロトタイプの段階から本番環境にアプリケーションを移行することが容易です。
Amazon OpenSearch
OpenSearch Serviceは、AWS CloudでOpenSearchを展開、拡張、および運用するための完全に管理されたサービスです。OpenSearchは、Apache 2.0ライセンスの下でライセンスされた、スケーラブルで柔軟かつ拡張可能なオープンソースのソフトウェアスイートであり、検索、分析、セキュリティモニタリング、観測アプリケーションに適用されます。
最近では、検索の強化のためにML技術がますます人気を集めています。その中には、埋め込みモデルの使用も含まれます。埋め込みモデルは、大量のデータをn次元空間にエンコードし、各エンティティをベクトル、つまりその空間内のデータポイントとしてエンコードし、類似のエンティティが近くに配置されるように組織化することができるモデルの一種です。ベクトルデータベースは、k-NNインデックスなどの専門のインデックスを提供することで、効率的なベクトル類似性検索を提供します。
Amazon OpenSearchのベクトルデータベースの機能を活用することで、セマンティック検索、LLMを用いたRAG、レコメンデーションエンジン、およびリッチメディア検索を実装することができます。この記事では、RAGを使用して、通常はベクトルエンコードされた知識記事で構築される外部知識ベースを生成的LLMと補完するためのRAGを使用します。
アプリケーションの概要
以下の図は、最終的なアプリケーションの構造を示しています。
このアプリケーションでは、Haystackインデックスパイプラインを使用してアップロードされたドキュメントを管理し、ドキュメントをインデックス化し、Haystackクエリパイプラインを使用してインデックス化されたドキュメントから知識を検索します。
Haystackインデックスパイプラインには、次の高レベルの手順が含まれます:
- ドキュメントをアップロードする。
DocumentStore
を初期化し、ドキュメントをインデックス化する。
私たちは、DocumentStoreとしてOpenSearchを使用し、Haystackインデックスパイプラインを使用してファイルをクリーンアップし、OpenSearchにファイルを準備してインデックス化します。 Haystack FileConvertersおよびPreProcessorを使用すると、自然言語処理(NLP)パイプラインと選択した言語モデルが扱える形状と形式になるように、元のファイルをクリーンアップおよび準備することができます。ここで使用したインデックスパイプラインでは、sentence-transformers/all-MiniLM-L12-v2
も使用して、各ドキュメントの埋め込みを作成し、効率的な検索に使用しています。
Haystackクエリパイプラインには、次の高レベルの手順が含まれます:
- RAGパイプラインにクエリを送信する。
- EmbeddingRetrieverコンポーネントは、インデックス化されたドキュメントから最も関連性の高い
top_k
ドキュメントを取得するフィルターとして機能します。このために、クエリとドキュメントの両方(インデックス時)を埋め込むための埋め込みモデルを選択します。 - 取得したドキュメントは、Falcon-40b-instructモデルにプロンプトとして埋め込まれます。
- LLMは、取得したドキュメントに基づいた応答を返します。
モデルの展開には、SageMaker JumpStartを使用しています。これにより、ボタンを押すだけでモデルを簡単に展開できます。この例ではFalcon-40b-instructを使用しましたが、SageMakerで利用可能なHugging Faceモデルを使用することもできます。
最終的なソリューションは、haystack-sagemakerリポジトリで利用可能であり、OpenSearchウェブサイトおよびドキュメント(OpenSearch 2.7用)を使用して、リトリーバル増強型質問応答を実行するための例データとして使用します。
事前条件
AWSのサービスを使用する前に、AWSアカウントにサインアップして作成する必要があります。その後、管理ユーザーとグループを作成する必要があります。両方の手順の詳細については、「Amazon SageMakerの前提条件の設定」を参照してください。
Haystackを使用するためには、必要な依存関係を持つfarm-haystack
パッケージをインストールする必要があります。これを行うには、GitHubリポジトリ内のrequirements.txt
ファイルを使用して、pip install requirements.txt
を実行します。
OpenSearchにドキュメントをインデックス化する
Haystackは、データベースに接続するためのいくつかのコネクタであるDocumentStores
を提供しています。このRAGワークフローでは、OpenSearchDocumentStore
を使用します。例のリポジトリには、OpenSearchウェブサイトおよびドキュメントページからクロールしたドキュメントを含むインデックスパイプラインとAWS CloudFormationテンプレートが含まれています。
しばしば、本番用途のNLPアプリケーションを動作させるためには、データの準備とクリーニングについて考える必要があります。これは、Haystackインデックスパイプラインでカバーされており、独自のデータ準備ステップを設計し、最終的に選択したデータベースにドキュメントを書き込むことができます。
インデックスパイプラインには、ドキュメントの埋め込みを作成するステップも含まれる場合があります。これは検索ステップに非常に重要です。この例では、sentence-transformers/all-MiniLM-L12-v2を埋め込みモデルとして使用しています。このモデルは、インデックス化されたすべてのドキュメントだけでなく、クエリの埋め込みもクエリ時に作成するためです。
OpenSearchDocumentStore
にドキュメントをインデックス化するには、例のリポジトリのREADMEで詳細な手順が2つ用意されています。ここでは、AWS上に展開されたOpenSearchサービスにインデックスを作成する手順について説明します。
OpenSearchサービスの起動
提供されたCloudFormationテンプレートを使用して、AWS上にOpenSearchサービスを設定します。以下のコマンドを実行することで、空のOpenSearchサービスが作成されます。その後、提供された例データをインデックス化するか、Haystackインデックスパイプラインを使用して自分自身のデータを使用するかを選択できます。なお、これによりインターネットに公開されるインスタンスが作成されますが、本番環境では推奨されません。
```bash
aws cloudformation create-stack --stack-name HaystackOpensearch --template-body file://cloudformation/opensearch-index.yaml --parameters ParameterKey=InstanceType,ParameterValue=r5.large.search ParameterKey=InstanceCount,ParameterValue=3 ParameterKey=OSPassword,ParameterValue=Password123!
```
スタックの起動には約30分程度かかる場合があります。進行状況はAWS CloudFormationコンソールのスタックページで「HaystackOpensearch」という名前のスタックを確認することで確認できます。
OpenSearchにドキュメントをインデックスする
実行中のOpenSearchサービスがあるため、OpenSearchDocumentStoreクラスを使用して接続し、ドキュメントを書き込むことができます。
OpenSearchのホスト名を取得するには、次のコマンドを実行します。
```bash
aws cloudformation describe-stacks --stack-name HaystackOpensearch --query "Stacks[0].Outputs[?OutputKey=='OpenSearchEndpoint'].OutputValue" --output text
```
まず、以下をエクスポートします:
```bash
export OPENSEARCH_HOST='your_opensearch_host'
export OPENSEARCH_PORT=443
export OPENSEARCH_USERNAME=admin
export OPENSEARCH_PASSWORD=Password123!
```
その後、提供されたデモデータを前処理してインデックスするためにopensearch_indexing_pipeline.py
スクリプトを使用できます。
独自のデータを使用する場合は、必要なFileConverterとPreProcessorのセットアップ手順を含むopensearch_indexing_pipeline.py
のインデックス作成パイプラインを変更してください。
検索増強型質問応答パイプラインの実装
OpenSearchにデータをインデックスしたので、これらのドキュメントで質問応答を実行できます。このRAGパイプラインでは、SageMaker JumpStartにデプロイしたFalcon-40b-instructモデルを使用します。
Jupyterノートブックからモデルをプログラム的にデプロイするオプションもあります。手順については、GitHubリポジトリを参照してください。
-
SageMaker JumpStartでFalcon-40b-instructモデルを検索します。
-
SageMaker JumpStartでモデルをデプロイし、エンドポイント名をメモしてください。
-
以下の値をエクスポートします:
```bash export SAGEMAKER_MODEL_ENDPOINT=your_falcon_40b_instruc_endpoint export AWS_PROFILE_NAME=your_aws_profile export AWS_REGION_NAME=your_aws_region ```
-
python rag_pipeline.py
を実行します。
これにより、ユーザーの質問を待つコマンドラインユーティリティが開始されます。たとえば、「OpenSearch cliをインストールする方法は?」と聞いてみましょう。
この結果は、Haystack PromptTemplateでプロンプトを次のように定義しているためです:
```python
question_answering = PromptTemplate(prompt="Given the context please answer the question. If the answer is not contained within the context below, say 'I don't know'.\n"
"Context: {join(documents)};\n Question: {query};\n Answer: ", output_parser=AnswerParser(reference_pattern=r"Document\[(\d+)\]"))
```
さらなるカスタマイズ
以下の要素に対してさまざまなカスタマイズを行うことができます:
- データ – オープンサーチのドキュメンテーションとウェブサイトのデータを例として提供しています。独自のデータを使用する場合は、
opensearch_indexing_pipeline.py
スクリプトを必要に応じて変更してください。 - モデル – この例では、Falcon-40b-instructモデルを使用しました。SageMakerで他のHugging Faceモデルをデプロイして使用することもできます。ただし、モデルを変更すると、それに対応するようにプロンプトを適切に調整する必要があります。
- プロンプト – この投稿では、提供されたコンテキストに基づいて質問に答えるようモデルに指示する
PromptTemplate
を作成しました。コンテキストに関連情報が含まれていない場合は、「わかりません」と回答するようにしています。Falcon-40b-instructで異なるプロンプトを試すために、このプロンプトを変更することもできます。また、PromptHubからいくつかのプロンプトを簡単に取得することもできます。 - 埋め込みモデル – 検索ステップでは、軽量な埋め込みモデルであるsentence-transformers/all-MiniLM-L12-v2を使用しています。ただし、必要に応じてこれを変更することもできます。また、
DocumentStore
で予想される埋め込み次元も適切に変更してください。 - 取得するドキュメントの数 – 各クエリに対して
EmbeddingRetriever
に取得を依頼するドキュメントの数を調整することもできます。このセットアップでは、これはtop_k=5に設定されています。この数値を変更してみて、より多くのコンテキストを提供することが結果の精度向上にどのような影響を与えるかを試してみることができます。
プロダクションの準備
この投稿で提案されているソリューションは、プロジェクト開発プロセスの価値の実現時間を短縮することができます。AWS Cloud上のセキュリティとプライバシー環境でスケーラブルなプロジェクトを構築することができます。
セキュリティとプライバシーのために、OpenSearchサービスはアイデンティティとアクセス管理、クロスサービス混乱プロキシ防止機能を提供します。細かいユーザーアクセス制御を使用して、ユーザーがアクセスを許可されたデータのみにアクセスできるようにすることもできます。さらに、SageMakerはアクセス制御、データ保護、ログ記録と監視のための設定を柔軟に行うことができます。AWS Key Management Service(AWS KMS)キーを使用して、データを静止状態および転送中に保護することもできます。また、Amazon CloudWatchを使用してSageMakerモデルの展開またはエンドポイントへのアクセスのログを追跡することもできます。詳細については、Amazon CloudWatchでAmazon SageMakerを監視するを参照してください。
OpenSearchサービスの高いスケーラビリティには、OpenSearchサービスドメインのサイズ調整や運用上のベストプラクティスの採用などがあります。また、SageMakerエンドポイントの自動スケーリングを活用することもできます。トラフィックが増加した場合やリソースが使用されていない場合に、SageMakerモデルを自動的にスケーリングしてエンドポイントを調整することができます。
クリーンアップ
コストを節約するために、この投稿の一部として展開したすべてのリソースを削除してください。CloudFormationスタックを起動した場合は、AWS CloudFormationコンソールから削除することができます。同様に、SageMakerコンソールから作成したSageMakerエンドポイントも削除できます。
結論
この投稿では、HaystackパイプラインとSageMaker JumpStartおよびOpenSearchサービスからのFalcon-40b-instructモデルを使用して、エンタープライズ検索のためのエンドツーエンドの生成AIアプリケーションを構築する方法を紹介しました。RAGアプローチはエンタープライズ検索において重要であり、生成される応答がドメインに関連しているため、幻覚を軽減する役割を果たします。Haystackパイプラインを使用することで、モデルやベクトルデータベースなどの異なるコンポーネントで構成されるLLMアプリケーションを組み立てることができます。SageMaker JumpStartはLLMのデプロイにワンクリックでソリューションを提供してくれますし、OpenSearchサービスはインデックスされたデータのベクトルデータベースとして使用しました。この投稿で概説した手順とGitHubリポジトリで利用可能なソースコードを使用して、エンタープライズ生成AIアプリケーションのRAGの概念実証を試すことができます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles