Re Reference AI

技術

チャンキングとは

Chunking / チャンク分割

長い文書を、検索や埋め込み生成に適した大きさのチャンクへ分割する処理

RAG検索

ひとことで言うと

長い文書を、扱いやすい大きさに区切る作業のこと。

概要

チャンキングとは、RAG等のパイプラインにおいて、長い文書を検索・埋め込み生成に適した大きさのチャンクへ分割する前処理。 一定の文字数・トークン数で機械的に区切る固定長チャンキングのほか、段落や見出しといった文書構造を尊重して分割する構造ベースの手法、文同士の意味的な連続性を考慮して分割点を決めるセマンティックチャンキング等、様々な手法が存在する。 チャンキングの粒度と方法は後段の検索精度に直接影響するため、RAGシステムの性能を左右する重要な設計要素の1つとされる。 隣接するチャンク同士を一部重複させて分割する「オーバーラップ」を設けることで、チャンク境界をまたぐ文脈の欠落を軽減する工夫もよく用いられる。

背景

文書をそのまま1つの単位として埋め込みベクトル化すると検索精度が下がりやすいため、目的に応じた単位へ分割する必要がある。 一方で単純に文字数だけで区切ると、文の途中や意味のまとまりを無視した位置で分割され、検索結果の質を落とす原因になることがある。 チャンキング手法の工夫は、この分割位置の質を高めるために発展してきた。

アーキテクチャ

固定長チャンキングでは、一定のトークン数・文字数ごとに分割しつつ、チャンク間で一部を重複させる(オーバーラップ)ことで、分割点をまたぐ文脈の断絶を緩和することが多い。 構造ベースやセマンティックチャンキングでは、見出し・段落・文の埋め込み類似度等を手がかりに、意味的にまとまりのある単位で分割する。

ワークフロー

文書を読み込む → チャンキング手法(固定長・構造ベース・セマンティック等)を選択 → 文書をチャンクへ分割(オーバーラップを設定) → 各チャンク埋め込みモデルでベクトル化 → ベクトルデータベースへ格納。

コード例

LangChainで固定長・オーバーラップ付きのチャンキングを行う

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,  # チャンク境界の文脈欠落を軽減する
    separators=["\n\n", "\n", "。", " "],
)

chunks = splitter.split_text(long_document_text)

利点

  • 文書構造や意味的なまとまりを考慮したチャンキングにより、検索精度を高められる
  • チャンクサイズやオーバーラップを調整することで、精度とコストのバランスを取れる
  • 文書の種類に応じて固定長・構造ベース・セマンティック等の手法を使い分けられる

欠点

  • 最適なチャンキング手法・パラメータは文書の種類やタスクによって異なり、試行錯誤を要する
  • セマンティックチャンキング等の高度な手法は、追加の計算コストがかかる
  • 分割位置を誤ると、文や段落の途中でチャンクが切れて文脈を失うことがある

比較

  • チャンクチャンキングは、チャンクを生成する分割処理そのものを指す
  • RAGチャンキングの質は、RAGの検索精度に直接影響する

関連用語

チャンクRAGEmbedding

よくある質問

チャンク同士を重複させる(オーバーラップ)理由は?

分割の境界付近の文脈が失われるのを防ぐため。 チャンクの末尾と次のチャンクの先頭を一部重複させることで、境界をまたぐ情報も検索で拾えるようにする。

セマンティックチャンキングとは?

隣接する文同士の埋め込み類似度を計算し、意味的なつながりが薄くなる箇所を分割点とする手法。 固定長分割より計算コストは高いが、話題の一貫性を保ちやすい。

参考文献

関連Zenn記事