今日のRAGソリューションをより深く理解するために、RAG Cookbookの詳細をご覧ください

Watson for Customer Careリードスペースをベースとして使用して色を変更したリードスペース。
概要

Webクロールとドキュメント・インデックスの分野では、検索の性能と関連性を最適化するために、効果的なチャンク化の手法が不可欠です。HTML WebページやPDFを扱う場合、採用するストラテジーは検索アプリケーションの効率と精度に大きく影響する可能性があります。ここでは、特にElasticsearchをベクトル・ストアとして使用する場合において、さまざまな状況に応じた効果的なチャンク化の手法に関する包括的なガイドを提供します。

 

文書セグメンテーション

Webページのサイズや構造は多岐にわたります。効率的な処理を実現するには:

  • HTML解析:HTMLタグ(例えば、段落には<p>、セクションには<div>)に基づいて、HTMLページを管理しやすいチャンクに分割します。
  • コンテンツ抽出:メイン・テキスト、見出し、構造化データなど、意味のあるコンテンツの抽出に重点を置きます。
チャンク化戦略
  • URLごと:各URLを個別の文書として扱います。この方法は簡単で、各ページが比較的小さく、自己完結型のWebサイトに便利です。
  • ページ・セクションごと:意味のあるセクション(記事、ブログ投稿など)ごとに文書をセグメント化します。このアプローチは、長いコンテンツや、多様なコンテンツ・タイプを持つサイトに有益です。
  • コンテンツの長さ:非常に大きなチャンクは避けてください。検索の関連性の粒度とパフォーマンスとの間のバランス。チャンクが小さいと、検索精度は向上しますが、処理オーバーヘッドが増加する場合があります。
処理パイプライン
  • Webスクレイピングには、Beautiful SoupやScrapyなどのライブラリーを使用します。
  • HTMLタグを削除し、エンコーディングの問題を処理することで、テキストを正規化します。
  • 言語固有のアナライザー(ステミング、ストップワードなど)を適用して、検索精度を向上させます。
古いHTMLコードに関する課題

Webクロールに古いHTMLコードが含まれる場合、Elasticsearchでインデックスを作成するために抽出されるチャンクの品質に大きな影響を与える可能性があります。主な課題とその軽減策は以下の通りです。

構造的不整合

非標準タグと属性:

  • 古いHTMLコードでは、最新のパーサーでは正しく処理できない、または完全には理解できない非標準タグや属性が使用されている場合があります。
  • これにより、特にクローラーが標準のHTML解析ライブラリーに依存している場合は、コンテンツ・チャンクの抽出が不完全または不正確になる可能性があります。

ネストされ、非推奨の要素:

  • 古いHTMLには、ネストされた要素や、<font>、<center>、<strike>などの非推奨のタグが含まれることが多く、これらは最新のHTMLパーサーでは適切に解析されない可能性があります。
  • その結果、これらの要素に基づくコンテンツ・セグメンテーションでは、断片化されたチャンクや、不適切に構造化されたチャンクが生成される可能性があります。

コンテンツの品質と関連性

インライン・スタイルとフォーマット:

  • 古いHTMLは、インライン・スタイルや書式設定タグ(<font>、<b>、<i>など)に大きく依存している場合があり、これらにより抽出されたテキストが乱雑になり、インデックス化されたチャンクの品質が低下する可能性があります。
  • Elasticsearchがこれらのチャンクを分析してインデックス化すると、検索品質が低下し、検索結果の関連性に影響を与える可能性があります。

一貫性のない文書構造:

  • 古いHTMLページでは標準化されたドキュメント構造がないため、チャンクサイズやコンテンツ・セグメントに一貫性がない可能性があります。
  • この不一致により、意味のあるコンテンツ・セクション間に明確な境界を確立することが困難になり、チャンクの粒度と検索の関連性に影響を与えます。

技術的な課題

エンコーディングと文字の問題:

  • 古いHTMLページには、誤った文字セットやエンティティー(&nbsp;、&lt;)などのエンコーディングの問題がある可能性があり、テキスト抽出時に適切な処理が必要です。
  • これらを正しく処理しないと、テキストの誤りや、インデックス化されたチャンク内のコンテンツの誤った表現になる可能性があります。

スクリプトと動的コンテンツ:

  • 古いHTMLページに埋め込まれた動的要素やスクリプト(JavaScript、Flashなど)は、基本的なWebクローラーでは効果的に処理されない可能性があります。
  • これにより、コンテンツの不完全な抽出や、動的に生成されたテキストの省略につながる可能性があり、インデックス化されたチャンクの包括性に影響を与える可能性があります。

軽減ストラテジー

Elasticsearchのインデックス作成のためにWebクロールする際、古いHTMLコードがチャンクの品質に与える影響を軽減するには、次のストラテジーを検討してください。

  • 堅固な解析ライブラリーを使用する:さまざまなHTMLバージョンや非標準要素を処理できる高度なHTML解析ライブラリーを使用します。
  • テキストの正規化:抽出されたテキストを前処理してフォーマットを正規化し、不要なタグや属性を削除します。
  • コンテンツのクレンジング:抽出処理中に無関係な要素や非推奨の要素を除外し、インデックス化されたチャンクの品質を向上させます。
  • 抽出ロジックの適応:古いHTMLページの特定の不具合を処理するカスタム・ロジックを開発し、意味のあるコンテンツ・チャンクへのより正確なセグメンテーションを実現します。
  • 定期的な更新:クローラー・ロジックと解析ライブラリーを維持し、時間の経過に伴うWeb標準とHTML手法の変化に適応します。

これらの課題に事前に対処することで、古いHTMLページから抽出されるコンテンツ・チャンクの品質を向上させ、Elasticsearchベースの検索アプリケーションの全体的な有効性と関連性を向上させることができます。

PDFのインデックス作成

PDFコンテンツ抽出

  • 見出し、段落、表などの要素を考慮して、PDFからテキストを抽出します。
  • メタデータ(タイトル、作成者、日付)はインデックス作成用に個別に処理します。

チャンク化戦略

  • ドキュメント別:各PDFファイルを単一のドキュメントとして扱い、インデックスを作成します。
  • ページ単位:または、必要に応じてページまたは論理セクションに基づいてPDFをチャンクに分割します。
  • テキストブロック:コンテンツの自然な切れ目(段落など)に基づいて、大きなチャンクを小さな単位に分割します。

テキスト抽出の課題、事実、俗説

  • 事実:PDFには画像やスキャンされた文書が含まれている場合があり、テキスト抽出にはOCR(光学式文字認識)が必要となります。watsonx DiscoveryにはOCR機能があるため、これは簡単ではありません。
  • PDF特有のテキストのエンコーディングやフォーマットの問題(ハイフネーション、改行など)を処理します。

インデックス・パイプライン

  • 特殊文字を削除し、ハイフネーションを処理することで、抽出されたテキストを正規化します。
  • 処理済みテキストに言語固有のアナライザーを適用して、検索機能を強化します。
検討事項

一般的な考慮事項

  • 性能:効率的なインデックス作成とクエリー性能を実現するためにチャンクサイズのバランスをとります。
  • 関連性:正確な検索結果を得るために、チャンクが意味のあるコンテンツ・セグメントをキャプチャできるようにします。
  • インデックス作成のオーバーヘッド:大量のデータのインデックス作成のオーバーヘッドを考慮します。 Elasticsearchでのインデックス作成設定とシャード割り当てを最適化します。
  • 検索品質:検索クエリーをテストし、改良することで、チャンク化されたドキュメント全体で関連性の高い結果が得られるようにします。

チャンク化方法の選択

  • コンテンツの特性:短いメッセージの場合は、文レベルのチャンク化で十分な場合があります。長い文書の場合は、コンテンツに応じたチャンク化を検討するか、チャンクサイズの混合で異種チャンク化を検討します。
  • アプリケーション要件: 計算効率が最優先の場合は、固定サイズのチャンク化が良い出発点となる可能性があります。コンテキストリッチな検索が重要な場合は、コンテンツに応じたチャンク化がより良い選択肢です。

要約すると、WebクロールまたはPDFインデックスでElasticsearchを使用する最適なチャンク化ストラテジーには、インデックス作成とクエリー作成の粒度と効率性のバランスを取るコンテンツを管理しやすい単位(ドキュメント、ページ、セクション)に分割することが含まれます。コンテンツソースの性質(WebページとPDFなど)と検索アプリケーションの特定の要件に基づいてストラテジーを調整します。これらの方法論を実装することで、検索エンジンのパフォーマンスと精度を高め、より関連性が高く正確な結果をユーザーに提供できます。

チャンク化手法の比較

メリット シンプルさ、管理が容易

 

ユースケース:


  • <b style=" font-family: inherit; ">小さな自己完結型ページを持つWebサイト:<span style=" font-family: inherit; "> 各URLを個別の文書として簡単に管理できます。
  • 各URLが個別の文書を表す状況:文書処理の明確さと単純さを確保します。
メリット 粒度の向上、検索クエリーの関連性の強化

 

ユースケース:

長文コンテンツのWebサイト:大きな記事や投稿をセグメント化することで、検索の関連性を高めます。

多様なコンテンツ・タイプのサイト:さまざまなコンテンツをより適切に整理して取得できます。

 

メリット 粒度とパフォーマンスのバランス、検索精度の向上

 

ユースケース:

コンテンツの多いWebサイト:チャンクが大きすぎないようにし、検索精度とパフォーマンスを向上させます。

非常に大きなチャンクが望ましくないWebサイト:詳細なインデックス作成の必要性と性能のバランスを取ります。

メリット 計算効率、予測可能なパフォーマンス

 

ユースケース:

高い計算効率を求めるアプリケーション:予測可能なパフォーマンスとリソース使用。

標準化されたデータ処理タスク:均一なチャンクサイズが有益な環境に適しています。

メリット コンテンツのきめ細かな制御、関連性の高い検索結果

 

ユースケース:

 

ショート・メッセージのインデックス:短いテキストでの正確な検索と取得に最適です。

テキスト解析アプリケーション:短いセグメントの詳細な分析と理解を可能にします。

メリット 文脈に応じたチャンク化により、検索の関連性を強化

 

ユースケース:

さまざまな内容の長い文書:チャンクが意味のあるコンテキストを確実に保持できるようにします。

詳細なコンテンツ分析:文脈を維持することで検索成果の質を向上させます。

メリット 論理的なセグメンテーション、可読性の向上

 

ユースケース:

PDFインデックス:各ページを論理的な単位として扱い、読みやすさと検索性を向上させます。

各ページが個別の単位になっているドキュメント:ページベースのコンテンツの整合性を維持します。

 

メリット コンテンツの自然な中断、構造化コンテンツの処理の改善

 

ユースケース:

段落が明確な大きな文書:読み取りと処理が容易になります。

構造化ドキュメントのインデックス作成:意味のあるセクションは個別にインデックス化されます。

IBMソリューション

watsonxでのチャンク化

IBM watsonxプラットフォームは、RAGパターンの実装を実現して加速し、ドキュメントのチャンク化と理解を可能にします。watsonx Orchestrateとwatsonx Discoveryを組み合わせると、ローコード/ノーコードからよりカスタム・ソリューションの実装まで、ドキュメントのチャンク化が可能になります。

記載されている方法は、RAGユースケースで実装するチャンク化手法に関する一般的な考慮事項です。watsonxではハイブリッド技術を利用して、精度と速度を向上させます。全体的なプロセスでは、文書を文ごとに分割し、意味のある粒度を確保します。次に、LLMを使用して文をチャンクにグループ化します。LLMは、文の文脈がチャンクに適合するかどうかを評価し、適合しない場合は新しいチャンクが開始されます。そのチャンクから、LLMを使用して意味のあるメタデータが抽出されます。これには、タイトル、ID、概要が含まれます。

この方法の詳細については、次のIBMブログを参照してください:https://developer.ibm.com/articles/awb-enhancing-llm-performance-document-chunking-with-watsonx/

オープンソースツール

構文チャンク化

構文チャンク化では、構造のガイド付きアプローチで、文書の書式に基づいてテキストを分離します。最も一般的かつ当然のことですが、セクションの見出しはセパレーターとして使用されます。ただし、エンコードされた情報のないドキュメント形式(PDF)では、フォントサイズをチャンクを分離するためのマーカーとして使用できます。

強み:

  • 実装が簡単

制限:

  • アルゴリズムは情報階層を前提としています。したがって、構文マーカーが見逃される可能性があります

構文チャンク化は、文書のトポロジー構造が予測可能で、パーティショニングに向けてクリーンにフォーマットされている状況で有益です。

固定サイズチャンク化

固定サイズのチャンク化では、インプットデータが等しいサイズのチャンクに分割されます。この方法では、多くの場合、トークンの数に基づいてテキストを事前に定義されたサイズに分割します。この方法は実装と理解が簡単なので、インプットデータが一貫して予測可能なサイズを持つタスクに適しています。

強み:

  • 実装しやすく、理解しやすい
  • 計算効率が高い

制限:

  • 硬直していて、テキストの文脈に合わせて調整できない
  • 重要なコンテキスト情報をテキストで省略する可能性がある

固定サイズのチャンク化は、インプットデータが予測可能で、詳細なコンテキストを必要としない場合に最適です。

from langchain.text_splitter import CharacterTextSplitter

# Example text
text = "The quick brown fox jumps over the lazy dog."

# Create a splitter for fixed size chunks
splitter = CharacterTextSplitter(chunk_size=10, chunk_overlap=0)

# Split the text
chunks = splitter.split(text)

# Print the chunks
for chunk in chunks:
 print(chunk)

意味論的チャンク化

意味論的チャンク化は、コンテキストに基づいてテキストを分離し、アルゴリズム技術を使用して意味のある構成要素をグループ化します。意味論的チャンク化は、法的文書など、回答を考え出す上でコンテンツの意味が不可欠な場合に重要です。

強み:

  • 検索データの精度と関連性が向上
  • チャンク化で維持されるナレッジベースの一貫性

制限:

  • 高度なアルゴリズムを使用した複雑な実装
  • 計算範囲がより広い

例:

from langchain.text_splitter import RecursiveCharacterTextSplitter

# Example text
text = "Steve Jobs was born in California. He co-founded Apple in 1976."

# Create a splitter for semantic chunking
splitter = RecursiveCharacterTextSplitter(chunk_size=50, chunk_overlap=10)

# Split the text
chunks = splitter.split(text)

# Print the chunks
for chunk in chunks:
 print(chunk)

ハイブリッド・チャンク化は、固定サイズのチャンク化と意味論的チャンク化の強みを組み合わせて、コンテキスト情報と構造情報の両方を使用します。この方法は、企業のナレッジベースなど、さまざまな形式や資料が含まれる複数のユースケースにまたがる大量のデータ・コーパスがある状況に最適です。

強み:

  • ナレッジベースの構造とコンテキストに基づく柔軟なチャンク化技術で最適な精度と速度を実現

制限:

  • リソース要件が厳しいため、保守や実装作業が増加

例:

from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter

# Example text
text = "Steve Jobs was born in California. He co-founded Apple in 1976."

# Fixed-size splitter
fixed_size_splitter = CharacterTextSplitter(chunk_size=50, chunk_overlap=10)
fixed_size_chunks = fixed_size_splitter.split(text)

# Semantic splitter
semantic_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
semantic_chunks = semantic_splitter.split(text)

# Print the fixed-size chunks
print("Fixed-size chunks:")
for chunk in fixed_size_chunks:
 print(chunk)

# Print the semantic chunks
print("\nSemantic chunks:")
for chunk in semantic_chunks:
 print(chunk)

エージェントによる細分化

このチャンク化ストラテジーでは、大規模言語モデル(LLM)を使用して、使用されるコンテキストに基づいてテキストのチャンクの適切な長さと内容を決定します。このストラテジーは、未加工のテキストからスタンドアロンのステートメントを抽出する提案の概念に基づいています。

このアプローチを実装するために、このストラテジーでは、Langchainが提供する提案検索テンプレートを使用して、テキストから提案を抽出します。これらの提案はLLMベースのエージェントに送られ、各提案を既存のチャンクに含めるか、新しいチャンクを作成するかを決定します。

LLMベースのエージェントは、提案と現在のチャンクとの関連性、チャンクの全体的な一貫性、モデルの目標と意図など、さまざまな要因を使用してこの決定を行います。このようにLLMを使用することで、このストラテジーは、一貫性がありコンテキストに適しているだけでなく、モデルの目標と意図に沿ったテキストチャンクを生成することを目指しています。

強み:

  • 自律性:LLMは、人間の介入なしに、どの提案をチャンクに含めるか、新しいチャンクをいつ作成するかを決定できるため、より効率的でスケーラブルなテキスト生成が可能になります。
  • 一貫性:LLMは、一貫性があり、文脈に適したテキストを生成するように設計されているため、生成されたチャンクが意味があり、理解しやすいものになることが保証されます。

制限:

  • 計算量が多い:LLMを使用してテキストを生成すると、特に大規模または複雑なモデルの場合、計算コストが高くなる可能性があります。これにより、特定のアプリケーションでのLLMの使用の拡張性と実用性が制限される可能性があります。
  • ハルシネーション:これは、モデルが、実際のデータやコンテキストではなく、独自の内部バイアスや仮定に基づいてテキストを生成した場合に発生する可能性があります。

では、どうすればこれらの手法の一部を実装してドキュメンテーションをチャンク化できるのでしょうか。これらのアルゴリズムやチャンク化技術を実行するためのオープンソース・ライブラリーは数多く存在します。LangChainテキスト・スプリッターを使用することから始めるのが良いでしょう。利用可能な特定のテキスト・スプリッターについては、次のドキュメンテーションを参照してください。https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/

次のステップ

IBMから最新のテクノロジー・パターン、ソリューション・アーキテクチャー、およびアーキテクチャーに関する出版物を入手してください。

  1. IBM Architecture Centerに移動
寄稿者

ハニーン・バクバクルーク・メジャー

更新日:2024年11月15日