Late Chunking
レイトチャンク化では、長いコンテキストに対応したモデルでドキュメント全体を埋め込み、その後、チャンクごとにトークンベクトルをプーリングするため、各チャンクの埋め込みにドキュメントのコンテキストが保たれます。
レイトチャンク化は、長いコンテキストに対応する埋め込みモデルが文書全体を先にエンコードし、その結果得られたトークンベクトルをチャンク境界で分割して平均プーリングし、チャンクごとに1つの埋め込みを作る方法です。プーリング時には各トークンが文書全体をすでに参照しているため、「交換する必要があります」と書かれたチャンクにも、「それ」が何を指すかという情報が残ります。Jina AIの研究者は、追加学習なしで既存の埋め込みモデルに適用するこの手法を、2024年の論文レイトチャンク化:長文コンテキスト埋め込みモデルを用いた文脈的チャンク埋め込みで発表しました。
チャンク埋め込みで文脈が失われる理由#
検索拡張生成 (RAG)システムでは、各ベクトルが焦点の絞られた文章を表し、検索したテキストがモデルのコンテキストウィンドウに収まるよう、文書をチャンクに分割します。従来のチャンク化では各チャンクを個別に埋め込むため、前のテキストとのつながりがすべて失われます。マニュアルから続く2文を例にします。「XR-12ポンプは、プレスラインに冷却液を循環させます。」「稼働時間が10,000時間に達したら交換する必要があります。」2文目だけを埋め込むとXR-12ポンプに言及していないため、答えが含まれているにもかかわらず、ポンプの交換に関する質問はベクトル検索でほとんど一致しません。
Late chunkingの仕組み#
文書全体をトークン化し、各チャンクのトークン範囲を記録します。境界の設定には、固定サイズやセマンティックチャンク化など、あらゆる分割方法を使用できます。続いて、トークンシーケンス全体をTransformer埋め込みモデルに通します。このモデルでは、自己注意によってすべてのトークンの情報が相互に混合されます。最後に、各範囲内のトークンベクトルを平均して、そのチャンクの埋め込みを作ります。Jinaのjina-embeddings-v2モデルの8,192トークンのように、モデルの入力上限を超える文書は、重なり合うマクロチャンクに分けてエンコードします。論文ではこれを長文レイトチャンク化と呼んでいます。
以下の例では、小規模なSentence Transformersモデルを使ってポンプに関する文を2通りの方法で埋め込み、それぞれを質問と比較します。
import torch
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
chunks = [
"The XR-12 pump circulates coolant through the press line.",
"It must be replaced after 10,000 operating hours.",
]
query = model.encode("When should the XR-12 pump be replaced?", convert_to_tensor=True)
# 従来のチャンク化:2つ目のチャンクだけを単独で埋め込みます
naive = model.encode(chunks[1], convert_to_tensor=True)
# レイトチャンク化:文書全体をエンコードしてから、2つ目のチャンクのトークンだけを平均プーリングします
tokens = model.encode(" ".join(chunks), output_value="token_embeddings")
start = len(model.tokenizer(chunks[0])["input_ids"]) - 1 # [CLS]とチャンク1のトークン
late = tokens[start:-1].mean(dim=0) # 最後の[SEP]を削除します
for name, emb in [("naive", naive), ("late", late)]:
print(name, round(torch.cosine_similarity(query, emb, dim=0).item(), 3))個別に埋め込んだチャンクの質問とのスコアは0.382です。同じ文をレイトチャンク化した場合のスコアは0.62になります。これは、プーリング前にそのトークンが「XR-12ポンプ」を参照していたためです。
物体検出でも2015年に同様の変化が起きました。R-CNNは、切り出した各領域候補に畳み込みネットワークを個別に実行していました。Fast R-CNNでは画像全体に一度だけ実行し、共有する特徴マップから各領域をプーリングしました。その結果、VGG16バックボーンを使ったテスト時の検出が213倍高速になりました。Ultralytics YOLO26も画像全体にバックボーンを一度だけ実行し、共有特徴からすべてのバウンディングボックスを予測するため、孤立した切り抜きから検出することはありません。
レイトチャンク化と関連手法の比較#
- 文脈的検索:インデックス化の前に、LLMが作成したメモを各チャンクの先頭に追加します。チャンクごとにLLMの呼び出しが1回必要ですが、追加される文脈がテキストであるためキーワード検索にも役立ちます。
- ColBERTのレイトインタラクション:トークンごとに1つのベクトルを保持し、検索時にクエリと比較します。レイトチャンク化はチャンクごとに1つのベクトルへプーリングするため、一般的なベクトルインデックスで利用できます。
- チャンクのオーバーラップ:隣接するチャンク間で数文を重複させます。保持できるのは近隣の文脈だけで、インデックスのサイズも大きくなります。
- リランカー:最初の検索後に、より強力なモデルで検索候補の順序を並べ替えます。レイトチャンク化と組み合わせることもできます。
レイトチャンク化が有効な場面#
チャンクが先行テキストに依存する場合、たとえば代名詞、一度だけ定義された略語、報告書やマニュアルのような文章では、効果が最も大きくなります。商品タイトルのような短く独立した記録では、効果は小さくなります。この手法には、トークンを平均してプーリングする埋め込みモデルと、トークン単位の出力にアクセスできることが必要です。また、文書の一部が変更されるたびに全文書を再エンコードする必要があります。レイトチャンク化で得られたチャンクベクトルは、通常のベクトルデータベースにそのまま格納できます。Jinaの埋め込みAPIでは、連続するチャンクのリストを1つの文書として埋め込むlate_chunkingパラメーターでこの手法を利用できます。










