ドキュメントコンバーター
LangChainのドキュメントコンバーターは、主にテキストのコンテンツをセグメント化し、大きな記事を複数のより小さいコンテンツフラグメントに分割する機能を持っています。これは、大規模なモデルでは通常プロンプトの長さに制限があり、すべてのコンテンツをAIに供給することができないためです。一部の大規模なモデルで非常に大きなプロンプト長を許可しているとしても、コストの観点から長いコンテンツをAIに渡すことは実用的ではありません。なぜなら、コンテンツが長くなればAPIの呼び出しコストも高くなるからです(ローカルに展開されたオープンソースモデルでも、長いコンテンツはより多くのGPUメモリが必要で推論が遅くなります)。合理的なアプローチは、関連するコンテンツフラグメントをバックグラウンド情報として連結してAIモデルを要求する際のプロンプトとして使用することです。
LangChainには、ドキュメントコンテンツを簡単に分割、結合、フィルタリングするための多数の組み込みドキュメントコンバーターがあります。
テキスト分割器
大量のテキストを扱う際には、テキストをチャンクに分割する必要があります。これは単純なように聞こえますが、潜在的な複雑さが多く存在します。理想的には、意味のあるテキストセグメントを一緒に保つことが望ましいです。ここでの「意味のある関連」は、テキストの種類に依存する場合があります。
テキスト分割器の動作は次のようになります。
- テキストを小さく、意味のあるブロック(通常は文章)に分割する。
- これらの小さなブロックを特定のサイズに到達するまで結合し始め、それが達成されるとブロックを独自のテキストセグメントとして扱い、一定のオーバーラップを持つ新しいテキストブロックを作成して(ブロック間の文脈を保つために)再開する。
このため、テキスト分割器を以下の2つの軸に沿ってカスタマイズできます。
- テキストの分割方法
- ブロックのサイズを測定する方法
例
デフォルトで推奨されているテキスト分割器はRecursiveCharacterTextSplitterです。このテキスト分割器は文字のリストを受け取ります。最初の文字に基づいてブロックを作成しようとしますが、ブロックが大きすぎる場合は次の文字に進みます。デフォルトでは、分割しようとする文字は["\\\\n\\\\n", "\\\\n", " ", ""]
です。
分割可能な文字を制御するだけでなく、以下の問題にも対処できます。
-
length_function
: ブロックの長さをどのように計算するか。デフォルトでは文字数のみがカウントされますが、トークンカウンターがここでしばしば渡されます。 -
chunk_size
: ブロックの最大サイズ(長さ関数によって測定されます)。 -
chunk_overlap
: ブロック間の最大オーバーラップ。ある程度のオーバーラップを保つことで、ブロック間の連続性を維持することができます(例:スライディングウィンドウの実行)。 -
add_start_index
: メタデータに各ブロックの開始位置を含めるかどうか。
with open('../../state_of_the_union.txt') as f:
state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 100,
chunk_overlap = 20,
length_function = len,
add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
page_content='..無視されるテキスト..' metadata={'start_index': 0}
page_content='..無視されるテキスト..' metadata={'start_index': 82}
その他の変換:
冗長なドキュメントのフィルタリング、ドキュメントの翻訳、メタデータの抽出など
ドキュメントの分割だけでなく、ドキュメントコンテンツに他の変換も行うことができます。EmbeddingsRedundantFilter
を使用することで類似したドキュメントを特定し、冗長なコンテンツをフィルタリングすることができます。doctranなどの統合を通じて、ドキュメントを他の言語に翻訳したり、必要なプロパティを抽出してメタデータに追加したり、会話をQ/A形式のドキュメントに変換したりすることができます。