RAG入門:AIに知識を与える技術
RAG精度改善(1):チャンキング戦略の見直し
資料には書いてあるのに、AI が見つけられない
RAG を組んで最初に来る苦情は、たいてい同じ形をしています。「その手順、マニュアルの 12 ページに書いてあるのに、AI は知らないと言う」。
資料は入っています。検索も動いています。それでも引けない。原因の多くは、切り方の側にあります。ここは Indexing に戻る話です。
切り方が悪いとき、症状は 3 つのどれかで出ます。答えが 2 つのチャンクにまたがって切れている。1 チャンクが大きすぎて、答えが余計な話に埋もれている。見出しから切り離されて、何について書かれた断片なのか分からなくなっている。
どれも検索の設定をいじっても直りません。データベースの中に、意味の通る断片が存在しないからです。
「その日までに」が、何日なのか分からなくなる
いちばん多いのが 1 つ目です。
たとえば元の文章が「プロジェクトの納期は 12 月 20 日です。その日までに全てのテストを完了させる必要があります」だったとします。文字数で機械的に切ると、後半だけが 1 つのチャンクになることがあります。このチャンクを引き当てても、「その日」がいつなのかはどこにも書いてありません。LLM は日付を答えられないか、悪くすると別のどこかから拾ってきます。
対策がオーバーラップです。隣り合うチャンクの端を少しだけ重ねて切ります。後半のチャンクの先頭に「納期は 12 月 20 日です」が残るので、どちらを引いても日付と行動がつながります。重ねる量はチャンクの 10 パーセントから 20 パーセントが目安です。
日本語の資料では、指示語がこの形で孤立しがちです。「これ」「その際」「上記の」で始まるチャンクが並んでいたら、切り方を疑ってください。切った結果を数十件そのまま並べて読むだけで、たいてい見つかります。
大きく切れば直る、わけではない
「なら大きく切ればいい」と考えたくなりますが、ここでもう 1 つの症状が出ます。
1 チャンクに 3 つの話題が入っていると、そのチャンクのベクトルは 3 つの話題の平均のような位置に着地します。どの話題で検索しても、そこそこ近いが一番ではない、という中途半端な順位になります。しかも運よく引けたとしても、LLM には関係のない 2 話題分の文章まで一緒に渡ります。
つまり小さすぎれば文脈が切れ、大きすぎれば焦点がぼやける。ここを文字数だけで詰めようとすると、いつまでも終わりません。切り方そのものを変えるほうが早い場面が多くあります。
| 切り方 | 向いている資料 | 弱点 |
|---|---|---|
| 文字数で機械的に切る | 形式のばらばらなメモ | 文の途中で切れる |
| 段落や句点を優先して切る | 報告書、記事、マニュアル | 見出しの情報が落ちる |
| 見出しや条項の構造で切る | 規程、手順書、FAQ | 資料の構造化が前提 |
まず段落や句点を優先する切り方を起点にしてください。そのうえで、資料に見出しの構造があるなら、その構造で切るほうがほぼ確実に上回ります。
3 つ目の症状には、別の手当てがあります。各チャンクの先頭に、元の見出しを付け足してから保存するのです。「第 4 章 休暇制度 第 12 条」という 1 行が付いているだけで、その断片が何の話なのかがベクトルにも反映され、LLM にも伝わります。手間の割に効きめが大きいので、最初から入れておくことをおすすめします。
復習ミニクイズ
RAGシステムにおいて「前後の文章が分割されたことで、指示語(『その日』『同プロジェクト』など)の内容がAIに伝わらず、回答精度が下がる」という問題が発生しました。この文脈の断片化を防ぐために、最も一般的に推奨される設定はどれですか?