セマンティックチャンキング
セマンティックチャンキングとは、固定の文字数やトークン数ではなく、意味の境界でテキストを分割する文書分割の手法です。エンベディングを用いて隣り合う文がいつ話題を変えるかを検知し、そこに区切りを置きます。これにより、結果として得られる各チャンクは内部的に一貫性があり、1つのまとまった考えとして検索できるようになります。
セマンティックチャンキングとは、固定の文字数やトークン数ではなく、意味の境界でテキストを分割する文書分割の手法です。エンベディングを用いて隣り合う文がいつ話題を変えるかを検知し、そこに区切りを置きます。これにより、結果として得られる各チャンクは内部的に一貫性があり、1つのまとまった考えとして検索できるようになります。
なぜ重要なのか
素朴なチャンキングは、意味を無視してNトークンごと、あるいは段落の区切りで分割します。これは1つの論旨を真っ二つに切ってしまうことが多く、前提を一方のチャンクに、結論をもう一方のチャンクに置いてしまいます。その結果、検索器は意味の通らない断片を返してしまいます。セマンティックチャンキングは、話題の変化を尊重することでこれを解決します。2024~2025年のLlamaIndexとLangChainのベンチマークレポートによると、セマンティックチャンキングはオープンドメインQAにおいて、固定サイズの分割と比べてRAGの回答品質を8~20%向上させ、長い技術文書で最大の効果を発揮します。
仕組み
1. 文に分割する: 文トークナイザーを使って、最小単位を取得します。
2. 各文をエンベディングする: 小さなエンベディングモデルが、文ごとに1つのベクトルを生成します。
3. 隣接する類似度を計算する: 文のペアごとに、エンベディング間のコサイン類似度を測定します。
4. 区切り点を見つける: 類似度がしきい値を下回った(あるいは下位のパーセンタイルに収まった)とき、それを話題の変化としてマークします。
5. 区切りの間の文をチャンクにまとめる: 各チャンクは話題的に一貫しています。
6. 任意のサイズ制限: 検索が現実的なものに保たれるよう、小さすぎるチャンクは結合し、大きすぎるチャンクは分割します。
セマンティック vs 固定サイズ vs 再帰的チャンキング
| 戦略 | 分割方法 | 一貫性 | コスト | 使いどころ |
|---|---|---|---|---|
| 固定サイズ | Nトークンごと | 低 | 無料 | プロトタイピング、ログ |
| 再帰的 | 段落 → 文 → 単語 | 中 | 無料 | 汎用のデフォルト |
| セマンティック | エンベディング類似度の境界 | 高 | エンベディングのコスト | 技術文書、長文記事 |
| エージェント型 | 文書ごとにLLMが判断 | 最高 | 非常に高 | 重要度が高く低ボリューム |
セマンティックチャンキングは、安価で単純な手法と高価で賢い手法の中間に位置します。再帰的な分割で物足りなくなったら、良いデフォルトとなります。
調整のつまみ
類似度のしきい値: しきい値を低くすると、チャンクが増え、話題の一貫性は高まりますが、コンテキストの連続性は悪くなります。しきい値を高くすると、チャンクは少なく長くなります。隣接類似度の15~25パーセンタイル付近から始めましょう。
エンベディングモデル: 安価な小さいエンベディングモデルで通常は十分です。絶対的な意味ではなく、相対的な変化を測っているからです。
最小チャンクサイズ: 非常に短いチャンク(1文)は、文脈が欠けているため検索の性能が悪くなります。下限を設けましょう。
最大チャンクサイズ: どのチャンクも下流のコンテキストウィンドウを超えないよう、上限を設けます。
オーバーラップ: 隣り合うチャンク間に少しの文のオーバーラップ(1~2文)を設けると、境界があいまいなエッジケースを救えます。
効果がない場合
短い文書: 文書全体が1つのチャンクに収まるなら、分割すること自体がオーバーヘッドです。
繰り返しの多いテキスト: ログ、商品リスト、表は自然な話題の変化が少なく、セマンティックチャンキングは固定サイズと変わらなくなります。
構造化されたコンテンツ: 表、コード、JSONは、意味ではなく構造で分割すべきです。
検索がボトルネックでないとき: ハルシネーションがプロンプト設計やリランキングに起因している場合、チャンキングを直しても役に立ちません。
Sources: