Databricks Certified Generative AI Engineer Associate 教科書
第2章 データ準備(Data Preparation, 14%)
🎯 この節の学習目標
抽出したテキストをそのまま1文書=1レコードで埋め込み・索引化することは、通常しません。文書を適切な大きさの断片(チャンク)に分割する工程がチャンキングです。必要な理由は3つあります。
つまりチャンクは「検索の単位」であり「LLMに渡す文脈の単位」です。この二役を意識すると、以降の戦略の良し悪しが判断できるようになります。
図:データ準備パイプラインの全体像。チャンキングは抽出・クリーニングの後、埋め込みの前に位置します。
最も基本的な戦略が、文字数またはトークン数で機械的に区切る固定長チャンキングです(例:500トークンごと)。実装が簡単で、どんな文書にも一律に適用でき、チャンクサイズが揃うため運用も予測しやすいのが長所です。
欠点は、文や段落の途中でも容赦なく切れることです。「解約金は当社が定める料金表に基づき/(チャンク境界)/10万円とする」のように、意味の連続した情報が2つのチャンクに泣き別れすると、どちらのチャンク単体でも質問に答えられなくなります。
この境界問題を緩和する定番がオーバーラップ(重複)です。隣接チャンクの末尾と先頭を一定量(例:チャンク500トークンに対し50〜100トークン)重複させることで、境界をまたぐ文脈がどちらかのチャンクには完全な形で含まれる可能性を高めます。代償はチャンク数と保存・埋め込みコストの微増です。
# LangChainでの固定長+オーバーラップの例
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # チャンクの最大サイズ
chunk_overlap=100, # 隣接チャンクとの重複量
)
chunks = splitter.split_text(document_text)
固定長の「機械的に切れる」欠点を改善する方向に、いくつかの戦略があります。
| 戦略 | 仕組み | 長所 | 短所 |
|---|---|---|---|
| 再帰的分割(Recursive) | 段落(\n\n)→文→単語の順に「自然な区切り」を探し、サイズ内に収まるよう再帰的に分割 | 実装容易なまま、文・段落の切れ目を極力尊重できる。汎用のデフォルトとして最有力 | 意味の変化までは見ていない |
| 文単位・段落単位 | 文または段落を最小単位として結合しチャンクを作る | 文の途中で切れない | 文・段落の長さ次第でサイズが不揃いになる |
| 構造ベース | MarkdownやHTMLの見出し(セクション)単位で分割 | 書き手が意図した意味のまとまりを保てる。見出しをメタデータ化できる | 構造情報が抽出時に保持されている必要がある(2-2)。セクション長のばらつきが大きい |
| セマンティックチャンキング | 文ごとの埋め込みを計算し、意味が大きく変化する点を境界として分割 | 話題のまとまりに忠実 | 埋め込み計算のコストがかかり、パイプラインが複雑になる |
「高度なほど良い」わけではありません。整った見出し構造を持つ文書なら構造ベースが素直で安価に効きますし、構造のないプレーンテキストの雑多なコーパスなら再帰的分割+オーバーラップが堅実です。セマンティックチャンキングは品質要求が高く前処理コストを許容できる場合の選択肢です。
📝 試験のポイント
各戦略の名前と特徴の対応がそのまま問われます。「文の途中で切れる問題を簡単に緩和する→オーバーラップ」「段落・文の区切りを優先しつつサイズ制御→再帰的分割」「意味の変化点で分割し、埋め込み計算が必要→セマンティックチャンキング」「見出し単位→構造ベース」という対応を即答できるようにしておきましょう。
チャンキング戦略の選択は、突き詰めると「ユーザーの質問に答えるための情報のまとまりは、この文書ではどの単位か」という問いです。文書タイプごとの定石を示します。
| 文書タイプ | 情報のまとまり | 推奨戦略 |
|---|---|---|
| FAQ | 1つのQ&Aペア | Q&A単位で1チャンク。複数のQ&Aを混ぜない |
| 契約書・規程 | 条・項 | 条項単位の構造ベース分割。条番号をメタデータに残す |
| マニュアル・技術文書 | セクション(見出し配下) | 見出し単位の構造ベース。長大なセクションはさらに再帰的分割 |
| チャットログ・議事録 | 話題のまとまり | 発言単位の結合、またはセマンティックチャンキング |
| 構造のないプレーンテキスト | 段落 | 再帰的分割+オーバーラップ(汎用デフォルト) |
💼 例:FAQを固定長で切ってはいけない
200件のQ&Aからなる社内FAQを、固定長500トークンで機械的に分割したとします。すると「Q:経費精算の締め日は? A:毎月25日です」というペアの途中で境界が入り、質問文だけのチャンクと回答文だけのチャンクに分かれることが起こります。質問文チャンクはユーザーの質問と高い類似度でヒットしますが、肝心の回答が含まれていないため、LLMは答えられません。FAQは「1つのQ&Aペア=1チャンク」が定石であり、この場合チャンクサイズの調整よりも分割単位の変更が正しい対処です。
実務・試験の双方で使える判断手順をまとめます。
✅ この節のまとめ
問1. 固定長チャンキングを採用したところ、重要な説明が文の途中でチャンク境界により分断され、検索されたチャンク単体では回答に必要な文脈が欠けるケースが多発した。実装を大きく変えずにこの問題を緩和する最も適切な方法はどれか。
正解:B
境界をまたぐ文脈の断絶には、隣接チャンクを一部重複させるオーバーラップが定番の緩和策です。Aはチャンクを小さくするため境界がむしろ増え、問題が悪化します。Cは分割の問題であり埋め込みモデルでは解決しません。Dは埋め込み上限・検索粒度の観点で非現実的です。
問2. 「段落の区切り、次に文の区切り、それでも収まらなければ単語の区切り」という順序で自然な分割点を探しながら、指定サイズ以内のチャンクを作る戦略はどれか。
正解:C
区切り文字の優先順位(段落→文→単語)をたどりながら再帰的に分割するのが再帰的分割で、LangChainのRecursiveCharacterTextSplitterが代表例です。Aは区切りを考慮せず一定サイズで切ります。Bは埋め込みを用いて意味の変化点で切る手法、Dは見出しなど文書構造の単位で切る手法です。
問3. 数百件のQ&Aからなる社内FAQコーパスをRAG化する。チャンキング戦略として最も適切なのはどれか。
正解:B
FAQでは「質問+回答のペア」が自己完結した情報のまとまりであり、これを1チャンクにするのが定石です。Aは固定長の境界がQ&Aペアの途中に入り、質問と回答が泣き別れするリスクがあります。Cのページは複数の無関係なQ&Aを混在させます。Dは意味を成さない断片になり、埋め込みも検索も機能しません。
問4. 整った見出し階層を持つMarkdown形式の技術マニュアルをチャンク化する。書き手が意図した意味のまとまりを最も安価に活かせる戦略はどれか。
正解:A
Markdownの見出しは書き手自身が付けた意味の区切りであり、これを分割単位に使う構造ベースが最も素直で、追加の計算コストもかかりません。Bでも良い分割は得られますが、埋め込み計算のコストがかかり、構造が既にある文書に対しては過剰です。Cは構造を無視して意味のまとまりを壊し、Dは埋め込み上限と検索粒度の点で不適切です。