Semantic Chunking
セマンティックチャンク化は、隣接する文の埋め込み類似度を測定し、トピックが変わる箇所で文書を分割します。これにより、各チャンクに1つのアイデアがまとまります。
セマンティックチャンク分割は、文字数やトークン数を固定して区切るのではなく、隣接する文の埋め込みを比較してトピックの変化点を見つけ、検索拡張生成(RAG)や検索向けに文書を分割します。各チャンクが一つのアイデアを扱うため、ベクトルデータベース内の単一ベクトルでその内容を適切に表現でき、検索されたチャンクから大規模言語モデル(LLM)に一つのまとまった考えを渡せます。セクション末尾と次のセクション冒頭が混在することもありません。
セマンティックチャンク分割の仕組み#
Greg Kamradtのテキスト分割チュートリアルによって広く知られ、LangChainのSemanticChunkerとして実装された一般的なアルゴリズムは、4つのステップで構成されます。まずテキストを文に分割し、各文を、ノイズを抑えるために隣接する文とグループ化することも多い方法で、埋め込みに変換します。連続する各文の組のコサイン類似度を距離に変換します。しきい値を使って距離が通常より大きい箇所を分割点とします。LangChainのデフォルトは文書内のすべての距離の95パーセンタイルで、標準偏差、四分位範囲、勾配に基づくしきい値も利用できます。分割点の間にある文が一つのチャンクを構成します。LlamaIndexのセマンティックスプリッターも同じパーセンタイルによる分割点を使います。
import numpy as np
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
"The XR-12 coolant pump circulates water through the press line.",
"Inspect the XR-12 pump seals for leaks every week.",
"A worn pump bearing grinds loudly before it fails.",
"The staff cafeteria now opens for breakfast at 7:00.",
"The cafeteria menu adds vegetarian lunches in May.",
]
# 各文とその次の文とのコサイン距離
embeddings = model.encode(sentences, normalize_embeddings=True)
distances = 1 - np.sum(embeddings[:-1] * embeddings[1:], axis=1)
# 距離が95パーセンタイルを超える箇所で新しいチャンクを開始
threshold = np.percentile(distances, 95)
chunks = [[sentences[0]]]
for sentence, distance in zip(sentences[1:], distances):
if distance > threshold:
chunks.append([])
chunks[-1].append(sentence)
print(np.round(distances, 2))
print(*[" ".join(chunk) for chunk in chunks], sep="\n")隣接する文の距離は0.56、0.64、0.98、0.62です。そのため、ポンプのベアリングから食堂へ話題が移る0.98の箇所だけが分割点となり、XR-12ポンプについての3文のチャンクと、食堂についての2文のチャンクが出力されます。
チャンク分割戦略の比較#
- 固定サイズ分割: 通常は隣接するチャンクを一部重ねながら、Nトークンごとに分割します。高速で予測しやすい一方、トピックの境界は考慮しません。
- 再帰的分割: 段落の区切り、次に改行、次に文の順に使い、各部分がサイズ上限に収まるまで分割します。LangChainは汎用テキストに対して、再帰的な文字分割器を推奨しています。
- 構造を考慮した分割: 見出し、Markdownのセクション、HTML要素、またはPDFのページレイアウトに沿って分割します。
- セマンティックチャンク分割: 意味の変化に沿って分割しますが、インデックス作成時にすべての文を埋め込みに変換する必要があり、チャンクのサイズにも大きなばらつきが生じます。そのため、実装では最小長と最大長を設けます。
- レイトチャンク分割とコンテキスト検索: 先行するチャンクに指示対象がある代名詞など、文書全体の文脈を欠くチャンクに対処します。また、上記のいずれの境界設定方法とも組み合わせられます。
ロボティクスにおけるアクションチャンク分割は、名称が同じだけで別の手法です。ここではポリシーが、将来のモーターコマンド列を一つの単位として予測します。
テキスト以外のセマンティックチャンク分割#
音声テキスト変換システムの文字起こしには段落区切りがないため、埋め込みベースの分割点は、会議やポッドキャストの話題の変化を特定する一般的な方法です。動画も内容に沿って分割できます。そのため、動画理解やマルチモーダルRAGでは、任意の10秒区間ではなく、各クリップに一つの出来事を収められます。Ultralytics YOLO26は、人や車両が映るシーンの境界を提供します。トラッキングモードでは、検出した各物体にフレーム間で一貫したIDが付与されるため、新しいIDがシーンに入ったときにクリップを開始し、追跡中のIDがすべてシーンから退出したときにクリップを終了するパイプラインを構築できます。
セマンティックチャンク分割は検索性能を向上させるか#
文字起こし、スクレイピングしたウェブページ、連結したメモのように、見出しなしで無関係な話題が並ぶ場合、トピックに基づく境界が最も重要になります。また、セマンティックチャンクは埋め込みモデルとしきい値に依存するため、どちらかが変わると同じ文書でも異なるチャンクに分割されます。どちらも実際のクエリに対する再現率を基準に調整する必要があります。研究論文Is Semantic Chunking Worth the Computational Cost?(2024年)は、文書検索、根拠検索、検索ベースの回答生成でセマンティック分割と固定サイズ分割を比較し、セマンティック分割の追加計算によって固定サイズのチャンクを一貫して上回る改善は得られないと報告しました。










