RAGデータパイプラインの品質を向上

この記事では、データパイプラインの変更を実装する際の実用的な観点から、データパイプラインの選択肢を拡張する方法について説明します。

データパイプラインの主要コンポーネント

データパイプラインと品質ノブの図。

非構造化データを扱うあらゆる RAG アプリケーションの基盤は、データパイプラインです。 このパイプラインは、RAG アプリケーションで効果的に利用できる形式で非構造化データを準備する役割を担います。 このデータパイプラインは任意に複雑になる可能性がありますが、RAG アプリケーションを最初に構築するときに考慮する必要がある主要なコンポーネントは次のとおりです。

  1. コーパスの構成:特定のユースケースに基づいて適切なデータソースとコンテンツを選択します。

  2. 解析:適切な解析手法を使用して生データから関連情報を抽出します。

  3. チャンキング: 解析されたデータを、より小さく管理しやすいチャンクに分割して、効率的に取得します。

  4. 埋め込み: チャンク化されたテキストデータを、そのセマンティックな意味を捉える数値ベクトル表現に変換します。

コーパスの構成

適切なデータ コーパスがなければ、RAG アプリケーションはユーザーのクエリに回答するために必要な情報を取得できません。 適切なデータは、アプリケーションの特定の要件と目標に完全に依存するため、利用可能なデータのニュアンスを理解するために時間を費やすことが重要です (これに関するガイダンスについては、「 要件収集」セクション を参照してください)。

たとえば、顧客サポートボットを構築する場合は、次の内容を含めることを検討します。

  • ナレッジベース文書

  • よく寄せられる質問 (FAQ)

  • 製品マニュアルと仕様

  • トラブルシューティング ガイド

プロジェクトの初期段階からドメインの専門家や関係者を巻き込み、データコーパスの品質とカバレッジを向上させる可能性のある関連コンテンツを特定してキュレーションします。 ユーザーが送信する可能性のあるクエリの種類に関する知見を提供し、含める最も重要な情報の優先順位付けに役立ちます。

パージング

RAG アプリケーションのデータソースを特定したら、次のステップは、生データから必要な情報を抽出します。 このプロセスは解析と呼ばれ、非構造化データをRAGアプリケーションで効果的に利用できる形式に変換します。

使用する特定の解析手法とツールは、操作するデータの種類によって異なります。 例えば:

  • テキスト ドキュメント (PDF、Word ドキュメント): unstructuredPyPDF2などの既成のライブラリは、さまざまなファイル形式を処理し、解析プロセスをカスタマイズするためのオプションを提供できます。

  • HTML ドキュメント: BeautifulSoupなどの HTML 解析ライブラリを使用して、Web ページから関連するコンテンツを抽出できます。 それらを使用すると、HTML構造をナビゲートし、特定の要素を選択し、目的のテキストまたは属性を抽出できます。

  • 画像とスキャンしたドキュメント: 光学式文字認識 (OCR) 技術は、通常、画像からテキストを抽出するために必要です。 人気の OCR ライブラリには、 TesseractAmazon TextractAzure AI Vision OCRGoogle クラウド Vision APIなどがあります。

データの解析に関するベスト プラクティス

データを解析するときは、次のベスト プラクティスを考慮してください。

  1. データクリーニング:抽出されたテキストを前処理して、ヘッダー、フッター、特殊文字などの無関係な情報やノイズの多い情報を削除します。 RAG チェーンが処理する必要がある不要な情報や不正な情報の量を減らすことに留意してください。

  2. エラーと例外の処理: エラー処理とログ記録のメカニズムを実装して、解析プロセス中に発生した問題を特定して解決します。 これにより、問題をすばやく特定して修正できます。 そうすると、ソース データの品質に関する上流の問題が指摘されることがよくあります。

  3. 解析ロジックのカスタマイズ:データの構造と形式に応じて、最も関連性の高い情報を抽出するために解析ロジックをカスタマイズする必要がある場合があります。 前もって追加の作業が必要になる場合がありますが、必要に応じて時間を費やすことで、多くの場合、下流の品質問題の多くを防ぐことができます。

  4. 解析品質の評価: 出力のサンプルを手動で確認して、解析されたデータの品質を定期的に評価します。 これは、解析プロセスの問題や改善すべき領域を特定するのに役立ちます。

チャンキング

ベクトルインデックス用にチャンク化される文書データの図。

生データをより構造化された形式に解析した後、次のステップはそれをチャンクと呼ばれるより小さく管理しやすい単位に分割することです。 大きなドキュメントを、意味的に集中した小さなチャンクに分割することで、取得したデータが LLM のコンテキストに適合し、気を散らす情報や無関係な情報が含まれることが最小限に抑えられます。 チャンク化に関する選択は、LLM に提供される取得データに直接影響し、RAG アプリケーションにおける最適化の最初のレイヤーの 1 つになります。

データをチャンク化するときは、次の要因を考慮してください。

  1. チャンキング戦略: 元のテキストをチャンクに分割するために使用する方法。 これには、文、段落、特定の文字数/トークン数による分割などの基本的な手法から、より高度なドキュメント固有の分割戦略までが含まれます。

  2. チャンク サイズ:チャンクが小さいほど、特定の詳細に焦点が当てられる可能性がありますが、周囲の情報が失われる可能性があります。 チャンクが大きいほど、より多くのコンテキストをキャプチャできますが、無関係な情報も含まれる可能性があります。

  3. チャンク間の重複:データをチャンクに分割するときに重要な情報が失われないようにするには、隣接するチャンク間に重複を含めることを検討してください。 オーバーラップにより、チャンク間での継続性とコンテキストの保持を確保できます。

  4. 意味の一貫性:可能な場合は、意味的に一貫性のあるチャンクを作成することを目指します。つまり、関連する情報を含み、意味のあるテキスト単位として独立して存在できるチャンクを作成します。 これは、段落、セクション、トピックの境界など、元のデータの構造を考慮することで実現できます。

  5. メタデータ:ソース ドキュメント名、セクション見出し、製品名などの関連するメタデータを各チャンク内に含めると、検索プロセスが改善されます。 チャンク内のこの追加情報は、検索クエリをチャンクに一致させるのに役立ちます。

データチャンク戦略

適切なチャンク化方法を見つけることは、反復的であり、コンテキストに依存します。 万能のアプローチはありません。最適なチャンクサイズと方法は、特定のユースケースと処理するデータの性質によって異なります。 大まかに言えば、チャンキング戦略は次のように見なすことができます。

  • 固定サイズのチャンク化:テキストを、固定数の文字またはトークンなどの事前に決定されたサイズのチャンクに分割します (例: LangChain CharacterTextSplitter )。 任意の数の文字/トークンで分割すると、セットアップが迅速かつ簡単になりますが、通常は意味的に一貫したチャンクにはなりません。

  • 段落ベースのチャンク: テキスト内の自然な段落境界を使用して、チャンクを定義します。 段落には関連情報が含まれることが多いため、この方法はチャンクの意味の一貫性を維持するのに役立ちます (たとえば、 LangChain RecursiveCharacterTextSplitter )。

  • 形式固有のチャンク: マークダウンや HTML などの形式には、チャンク境界 (マークダウン ヘッダーなど) を定義するために使用できる固有の構造があります。 この目的には、LangChain のMarkdownHeaderTextSplitterや HTML ヘッダー/ セクションベースのスプリッターなどのツールを使用できます。

  • セマンティックチャンク: トピックモデリングなどの手法を適用して、テキスト内の意味的に一貫性のあるセクションを特定できます。 これらのアプローチでは、各ドキュメントの内容または構造を分析し、トピックのシフトに基づいて最も適切なチャンク境界を決定します。 より基本的なアプローチよりも複雑ではありますが、セマンティック チャンキングは、テキスト内の自然な意味の区分とより一致するチャンクを作成するのに役立ちます (この例については、 LangChain SemanticChunkerを参照してください)。

例: 固定サイズのチャンク化

ドキュメントの固定サイズのチャンク化の例を示す画像。

LangChain のRecursiveCharacterTextSplitter をchunk_size=100chunk_overlap=20とともに使用する固定サイズのチャンク化の例。 ChunkViz は、Langchainの文字スプリッターによるチャンクサイズとチャンクのオーバーラップ値の違いが、結果のチャンクにどのように影響するかを視覚化するインタラクティブな方法を提供します。

埋め込みモデル

セマンティックな意味に基づいてデータ チャンクがどのようにベクトル化されるかを示す図。

データをチャンク化した後、次のステップは、埋め込みモデルを使用してテキスト チャンクをベクトル表現に変換することです。 埋め込みモデルは、各テキストチャンクを、そのセマンティックな意味をキャプチャするベクトル表現に変換するために使用されます。 チャンクを密なベクトルとして表現することで、埋め込みは、取得クエリとのセマンティックな類似性に基づいて、最も関連性の高いチャンクを高速かつ正確に取得できます。 クエリ時に、データパイプラインにチャンクを埋め込むために使用されたのと同じ埋め込みモデルを使用して、取得クエリが変換されます。

埋め込みモデルを選択するときは、次の要素を考慮してください。

  • モデルの選択: 埋め込みモデルにはそれぞれ微妙な違いがあり、利用可能なベンチマークではデータの特定の特性を捉えられない場合があります。 MTEBなどの標準リーダーボードで下位にランクされているものも含め、さまざまな既製の埋め込みモデルを実験します。 考慮すべき例としては、次のようなものがあります。

  • 最大トークン:選択した埋め込みモデルの最大トークン制限に注意してください。 この制限を超えるチャンクを渡すと、切り捨てられ、重要な情報が失われる可能性があります。 たとえば、 bge-large-en-v1.5の最大トークン制限は 512 です。

  • モデル サイズ:埋め込みモデルが大きいほど、一般的にパフォーマンスは向上しますが、より多くの計算リソースが必要になります。 特定のユースケースと利用可能なリソースに基づいて、パフォーマンスと効率のバランスをとります。

  • ファインチューニング: RAG アプリケーションがドメイン固有の言語 (社内の頭字語や用語など) を扱う場合は、ドメイン固有のデータに対する埋め込みモデルのファインチューニングを検討してください。 これにより、モデルが特定のドメインのニュアンスや用語をより適切に捉えるのに役立ち、多くの場合、検索パフォーマンスの向上につながる可能性があります。