導入
第2章では固定長・オーバーラップ付き・意味の区切りという3つのチャンク分割を学びました。実務ではここからさらに一歩進んで、チャンクの切り方そのものの見直しと、メタデータを活用した検索範囲の絞り込みで精度を上げていきます。
説明
- チャンクサイズ/オーバーラップの調整:万能な正解値はありません。コードのチャンクは関数やクラスの単位で切ったほうが自然ですし、論文なら段落単位、チャットログなら発言単位というように、対象とする文書の性質に合わせてサイズとオーバーラップを調整します。
- 親子チャンク(コンテキスト拡張):検索そのものは小さいチャンク(子チャンク)で行い、ヒットしたらLLMに渡すときはその前後を含む大きめのチャンク(親チャンク)に差し替える、という工夫です。小さいチャンクは検索の的中率が高い一方、それだけをLLMに渡すと文脈が足りません。「検索は精密に、生成には十分な文脈を」という役割分担です。
- メタデータ付与とフィルタリング:チャンクに日付・部署・出典URL・タグなどのメタデータを付けておくと、検索時に
department = "sales" AND year >= 2024のような条件で絞り込んでから検索できます(第3章で扱ったベクトルDBが、まさにこのメタデータフィルタをサポートしています)。全文書を対象に検索するより、関係ない部署や古い年度をあらかじめ除外できるので、精度も速度も上がります。
メタデータ付きチャンクの構造は、たとえばこのような形になります。
# メタデータ付きチャンクの例(掲示のみ)
chunk = {
"text": "2024年度の有給休暇は入社日から半年後に10日付与される。",
"metadata": {
"source_url": "https://example.com/hr/leave-policy",
"department": "hr",
"year": 2024,
"tags": ["有給休暇", "就業規則"],
},
}
# 検索時にメタデータでフィルタしてから、その範囲内でベクトル検索する
results = vector_db.search(
query="有給休暇は何日もらえる?",
filter={"department": "hr", "year": {"$gte": 2024}},
k=5,
)
filter で先に「人事部・2024年度以降」に絞り込んでから検索しているので、他部署の古い文書がノイズとして混ざる心配がありません。チャンク分割は「どう切るか」、メタデータは「どう絞り込むか」――この2つを組み合わせることで、検索対象そのものを賢く小さくできます。
まとめ
- チャンクサイズ・オーバーラップは対象文書の性質に合わせて調整する。万能な正解値はない。
- 親子チャンク(コンテキスト拡張)は、検索は小さい単位で精密に、LLMに渡すときは前後を含む大きい単位で文脈を補う工夫。
- メタデータ(日付・部署・出典など)を付与し、検索前にフィルタで探索範囲を絞ることで精度と速度が上がる。