チャンクとは
Chunk
RAGなどで文書を検索・処理しやすい単位に分割した、テキストの断片
ひとことで言うと
長い文章を検索しやすいように区切った、ひとまとまりの断片。
概要
チャンクとは、RAG等のシステムで長い文書を扱う際に、検索や埋め込み生成に適した大きさへ分割したテキストの断片。 LLMのコンテキストウィンドウには上限があり、埋め込みモデルも一度に処理できる長さの制約があるため、文書全体をそのまま扱うのではなく、段落や一定の文字数・トークン数を目安に分割したチャンク単位で埋め込みベクトル化し、検索の最小単位として扱う。 チャンクの大きさを小さくしすぎると文脈が失われて検索精度が落ち、大きくしすぎると1チャンクに複数の話題が混在してベクトルの意味がぼやけるため、対象文書の性質に応じたサイズ設計が求められる。 各チャンクにはメタデータ(出典ファイル名・ページ番号等)を付与しておくことが多く、検索結果の出典表示や、後述のメタデータフィルタによる絞り込みにも活用される。
背景
長い文書をそのまま1つの埋め込みベクトルに圧縮すると、文書内の特定の話題や事実が他の内容に埋もれてしまい、検索精度が下がりやすい。 文書をチャンクへ分割することで、より粒度の細かい、話題の一貫した単位で検索・取得できるようにする狙いがある。
ワークフロー
文書をチャンキング処理により分割 → 各チャンクに出典等のメタデータを付与 → 埋め込みモデルでベクトル化 → ベクトルデータベースへ格納し、検索時の最小単位として扱う。
コード例
LangChainで文書をチャンクへ分割する
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_text(long_document_text)
print(len(chunks), "個のチャンクに分割")利点
- 文書内の特定の話題や事実を、より的確に検索・取得しやすくなる
- 埋め込みモデルやLLMの入力長の制約に収まる単位でテキストを扱える
欠点
- チャンクが小さすぎると、文脈が失われ意味を正しく捉えられなくなる場合がある
- チャンクを大きくしすぎると無関係な情報を含みやすくなり、検索精度が低下しやすい
- 最適なチャンクサイズは文書の性質やタスクによって異なり、調整を要する
比較
関連用語
よくある質問
チャンクのサイズはどれくらいが適切?
明確な正解はなく、数百トークン程度を目安にすることが多いが、文書の構造やタスクに応じて実験的に調整するのが一般的。
1つのチャンクに複数の話題を含めてもいい?
推奨されない。 複数の話題が混在すると埋め込みベクトルの意味がぼやけ、検索精度が低下しやすいため、できるだけ話題の一貫した単位で分割するのが望ましい。
参考文献
- DocumentationLangChain: Text Splitters