使い方・開発 中級
チャンク分割
Chunking
長い文書を、検索や処理に適した小さな断片(チャンク)に区切る作業のことです。RAGではどこでどの大きさに区切るかが、検索の精度と回答の質を大きく左右します。区切り方の工夫が、回答の質を支えます。
別の呼び方文書分割、テキスト分割
例マニュアルを見出しごとに約500字のチャンクに分け、前後50字を重ねて保存した。
詳しく
チャンク分割とは、長い文書を、検索や処理に適した大きさの断片(チャンク)に区切る作業です。RAG(検索拡張生成)で社内文書などを検索対象にするとき、最初に必ず必要になる下ごしらえです。
なぜ必要なのか
文書を丸ごと1つのまとまりとして埋め込み(ベクトル)に変換すると、内容が混ざり合い、特定の質問に合う部分を見つけにくくなります。また、検索結果をそのままプロンプトに入れる場合、長すぎる文書は文脈長を圧迫し、費用も増えます。そこで、1つの話題がおさまる程度の大きさに分けて保存し、質問に近い断片だけを取り出して使います。
代表的な分け方
- 固定長で分ける:文字数やトークン数(例:500〜1000字程度)で機械的に切る。実装が簡単ですが、文の途中で切れることがあります。
- 区切りを意識して分ける:段落、見出し、改行、文末記号など、文書の構造に沿って切る。意味のまとまりが保たれやすくなります。
- オーバーラップを付ける:隣のチャンクと数十字〜数百字を重ねる。境目で文脈が切れる問題を和らげます。
- 意味で分ける:話題が変わる箇所を埋め込みの類似度などで見つけて切る。手間は増えますが、まとまりの良い断片になりやすい方法です。
- 構造を活かす:Markdownの見出し、表、コードブロックなどを壊さないように分ける。
具体例
ある会社の就業規則(数十ページ)を検索対象にするとします。固定長で機械的に切ると、「第12条 休暇」の見出しと本文が別のチャンクに分かれ、「有給休暇は何日?」という質問に対して、見出しのない本文だけが出てくるかもしれません。条ごとに区切り、各チャンクに章タイトルを付け足しておけば、この問題を避けやすくなります。
使うときの注意
- 小さすぎても大きすぎても問題が起きます。 小さすぎると文脈が足りず、答えに必要な情報が欠けます。大きすぎると関係のない内容が混ざり、検索の精度が下がり、トークンも無駄になります。
- 最適なサイズは文書の種類と質問の傾向で変わります。 万能の数字はないため、実際の質問を用意して、検索で正解の断片が上位に来るかを測りながら調整します。
- メタデータを一緒に保存します。 元の文書名、ページ、章タイトル、更新日などを付けておくと、出典の表示や絞り込みに役立ちます。
- 表や図は別扱いが必要です。 表を文字として切ると意味が壊れやすいので、表ごと保存する、説明文に変換するなどの工夫をします。
関連する考え方
分割後の断片は埋め込みでベクトルに変換され、ベクトルデータベースに保存されます。取り出した候補の並べ替えにはリランキングを使うことがあります。RAGの回答が期待外れのとき、モデルを変える前にチャンク分割を見直すと改善することが多くあります。
あわせて知りたい言葉
- RAG(検索拡張生成)質問に関係する文書を検索で取り出し、それを LLM に渡してから回答させる仕組みです。モデルが学習していない社内資料や、最新の情報にもとづいた回答ができるようになります。
- 埋め込み文章や画像などを、意味の近さが距離として表れる数値の並び(ベクトル)に変換したものです。言葉が違っても意味の近い文書を探す検索や、分類、RAG の土台に使われます。
- ベクトルデータベース文章や画像を数値の並び(埋め込み)にして保存し、意味の近いものを高速に探せるデータベースです。RAG で関連する文書を探す部分に、とてもよく使われています。仕組みを知ると選びやすくなります。
- 文脈長モデルが1回の処理で扱えるトークン数の上限です。入力(指示・会話履歴・資料)と出力の合計がこの範囲に収まる必要があり、長いほど多くの資料を一度にまとめて渡せます。
- リランキング検索で取り出した候補を、質問との関連度でもう一度精密に並べ替える処理のことです。RAGで本当に役立つ資料を上位に残し、最終的な回答の質を高めるために使われます。