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

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

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

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

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

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

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

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

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

コーパス構成

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

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

  • ナレッジベースドキュメント

  • よくある質問 (FAQ)

  • 製品マニュアルと仕様

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

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

パージング

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

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

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

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

  • 画像とスキャンしたドキュメント: 光学式文字認識(OCR)技術は、通常、画像からテキストを抽出するために必要です。 人気のあるOCRライブラリには、TesseractAmazon TextractAzure AI Vision OCRGoogle Cloud 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 の RecursiveCharacterTextSplitterchunk_size=100chunk_overlap=20を使用した固定サイズのチャンクの例 ChunkViz は、Langchainのキャラクタースプリッターを使用して、さまざまなチャンクサイズとチャンクオーバーラップ値が結果のチャンクにどのように影響するかを視覚化するインタラクティブな方法を提供します。

埋め込みモデル

セマンティックな意味に基づいてデータ チャンクをベクトル化する方法の図。

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

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

  • モデルの選択: 各埋め込みモデルには微妙な違いがあり、利用可能なベンチマークではデータの特定の特性を捉えていない可能性があります。 エクスペリメントは、 MTEBのような標準的なリーダーボードで下位にランクされている可能性のあるものも含めて、さまざまな既製の埋め込みモデルを備えています。 考慮すべきいくつかの例を次に示します。

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

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

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