Webクロールとドキュメント・インデックスの分野では、検索の性能と関連性を最適化するために、効果的なチャンク化の手法が不可欠です。HTML WebページやPDFを扱う場合、採用するストラテジーは検索アプリケーションの効率と精度に大きく影響する可能性があります。ここでは、特にElasticsearchをベクトル・ストアとして使用する場合において、さまざまな状況に応じた効果的なチャンク化の手法に関する包括的なガイドを提供します。
Webページのサイズや構造は多岐にわたります。効率的な処理を実現するには:
Webクロールに古いHTMLコードが含まれる場合、Elasticsearchでインデックスを作成するために抽出されるチャンクの品質に大きな影響を与える可能性があります。主な課題とその軽減策は以下の通りです。
非標準タグと属性:
ネストされ、非推奨の要素:
インライン・スタイルとフォーマット:
一貫性のない文書構造:
エンコーディングと文字の問題:
スクリプトと動的コンテンツ:
Elasticsearchのインデックス作成のためにWebクロールする際、古いHTMLコードがチャンクの品質に与える影響を軽減するには、次のストラテジーを検討してください。
これらの課題に事前に対処することで、古いHTMLページから抽出されるコンテンツ・チャンクの品質を向上させ、Elasticsearchベースの検索アプリケーションの全体的な有効性と関連性を向上させることができます。
要約すると、WebクロールまたはPDFインデックスでElasticsearchを使用する最適なチャンク化ストラテジーには、インデックス作成とクエリー作成の粒度と効率性のバランスを取るコンテンツを管理しやすい単位(ドキュメント、ページ、セクション)に分割することが含まれます。コンテンツソースの性質(WebページとPDFなど)と検索アプリケーションの特定の要件に基づいてストラテジーを調整します。これらの方法論を実装することで、検索エンジンのパフォーマンスと精度を高め、より関連性が高く正確な結果をユーザーに提供できます。
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を使用することで、このストラテジーは、一貫性がありコンテキストに適しているだけでなく、モデルの目標と意図に沿ったテキストチャンクを生成することを目指しています。
強み:
制限:
では、どうすればこれらの手法の一部を実装してドキュメンテーションをチャンク化できるのでしょうか。これらのアルゴリズムやチャンク化技術を実行するためのオープンソース・ライブラリーは数多く存在します。LangChainテキスト・スプリッターを使用することから始めるのが良いでしょう。利用可能な特定のテキスト・スプリッターについては、次のドキュメンテーションを参照してください。https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/