社内資料を読ませたAIチャットが的外れな回答を返しているのを見て、どこから直すか考えている開発担当者

RAGの精度が出ないときの見直し所|チャンク分割と埋め込みの詰め方

社内資料を読ませたチャットボットを作った。 デモでは、いい感じに答えてくれた。「これはいけそうですね」と言われて、現場に出した。

——そして今、「そのような情報は見つかりませんでした」と「明らかに違う資料を引っ張ってきた答え」が並んでいます。 上からは「精度、もう少し上げられない?」。悪気のない一言なのに、いちばん困る一言です。

というのも、「精度を上げる」には触れる場所が多すぎるからです。 モデルを新しくすればいいのか。プロンプトを直すのか。資料を増やすのか。ベクトルDBを変えるのか。どれも一理あって、どれも決め手に欠ける。手当たり次第に触ると、良くなったのか悪くなったのかも分からなくなる——ここがRAGのいちばんしんどいところだと思います。

先に言っておきたいのは、精度が出ないのは設計が下手だったからではないということです。RAG(社内資料などをAIに参照させて答えさせる仕組み。詳しくはRAGとは)は、デモが通りやすく、現場で崩れやすい。これは仕組みの性質で、ほぼ誰もが通る道です。

結論:RAGの精度が出ないときは、モデルやプロンプトを触る前に、「検索が正しい資料を拾えているか」を見ます。手順は、①失敗した質問で検索結果の上位を実際に目で見る→②正解の資料が入っていなければ検索側(チャンク分割・検索方式)の問題、入っているのに答えを間違えたなら生成側(プロンプト・モデル)の問題、と仕分ける。経験上、詰まりの多くは検索側にあります。そして検索側でまず効くのは、チャンク分割の見直しハイブリッド検索(キーワード検索の併用)の2つです。

この記事では、その切り分けから順番に整理していきます。全部を一度にやる必要はありません。今日は「検索結果を目で見る」ところまでで十分です。

まず切り分ける:検索が悪いのか、生成が悪いのか

RAGの処理を質問・検索・生成・回答の4段階に分け、精度が出ないときは検索と生成のどちらでつまずいたかを切り分けることを示した図

RAGは、ざっくり2つの工程でできています。

  1. 検索:質問に関係のありそうな資料を、社内文書の山から探してくる
  2. 生成:探してきた資料をプロンプトに入れて、AIに答えを書かせる

精度が出ないとき、このどちらでつまずいたのかを先に決める。ここを飛ばすと、生成側(プロンプトやモデル)ばかり触って、実は検索が正解を拾えていなかった、という空振りが起きます。

切り分けはとても簡単で、こうします。

正解が書いてある資料を、あなたが手で見つけて、そのままプロンプトに貼り付けて聞いてみる。

拍子抜けするほど原始的ですが、これがいちばん速い。そして多くの場合、前者になります。資料を目の前に置けばAIはちゃんと答えられる。ただ、その資料にたどり着けていない。

つまり、RAGの精度問題は、その多くが検索の問題です。ここが腑に落ちると、触る場所がぐっと減ります。

明日いちばん最初にやること:検索結果を目で見る

切り分けの次にやることは、ひとつだけです。

失敗した質問について、検索が拾ってきた資料の上位5件を、そのまま画面に出して読む。

これは、驚くほど多くの現場で飛ばされている工程です。RAGは検索結果を裏でプロンプトに詰めてしまうので、開発している側からも見えない。見えないまま「精度が悪い」とだけ言い合うことになります。

やり方は、大げさなものでなくて構いません。

そのうえで、失敗した質問を10個ほど集めて、1件ずつこう見ていきます。

見るところ判定
上位5件に、正解が書かれた資料が入っているか入っていない → 検索の問題
入っているが、順位が低い(4〜5位)並び順の問題(リランキングで改善余地)
入っているのに答えが違う生成の問題
そもそも正解の資料が社内に存在しない資料の問題(AIでは直せない)

この表を10行埋めるだけで、次に何を触るかが決まります。逆に、ここを埋めずに手を動かすと、ほぼ確実に迷子になります。

最後の行——そもそも書いていない——は、思っているより頻繁に起きます。「AIが答えられない」と報告が上がってきた質問が、実は社内のどこにも明文化されていなかった。この場合、RAGをいくら詰めても答えは出ません。それは仕組みの失敗ではなく、発見です。「この質問には資料がありません」と分かること自体に価値があるので、堂々と報告して大丈夫です。

検索が拾えていないとき(1)チャンク分割を見直す

検索側が原因と分かったら、最初に見るのはチャンク分割です。

チャンクとは、資料を検索できる単位に切り分けた、その一切れのことです。RAGは資料を丸ごと扱わず、小さく切ってから検索します。この切り方が、検索の精度をかなり左右します。

切り方でよくある詰まり

「この機能は管理者のみ利用できます」だけが切り出されても、「この機能」が何なのか分かりません。検索でも当たらないし、当たっても答えに使えない。

1ページ丸ごとを1チャンクにすると、いろんな話題が混ざります。混ざったものをベクトル(意味を数値化したもの)にすると、どの話題にも中途半端に近い平均的な点になり、結果としてどの質問にもうまく当たらなくなります。

「500文字ごと」のような固定長で切ると、見出しと本文が分断されたり、表の途中でぶつ切りになったりします。

まず試す設定

絶対の正解はありませんが、日本語の社内文書なら、この辺りから始めると外しにくいです。

最後のひとつは、地味ですが効きます。たとえばチャンクの頭に

【出典】経費精算規程 v3 > 第4章 交通費 > 4-2 上限額(2026-04-01改訂)

と付けておくだけで、検索でも当たりやすくなり、AIが答えるときも「いつ・どの文書の話か」を踏まえてくれます。改訂版と旧版が混在している社内資料では、この一行が効きます。

近年は、チャンクを保存する前にそのチャンクが文書全体の中でどういう位置づけかを一文足しておくやり方(文脈付きチャンク)も広く使われています。「この記述は、経費精算規程のうち交通費の上限を定めた箇所である」といった一文を、AIに生成させて先頭に足しておくイメージです。前処理のコストは増えますが、「それ」「本項」といった指示語だらけの社内文書ではよく効きます。手を出す前に、まずは素直な見出し単位+出典付与から始めるのがおすすめです。

検索が拾えていないとき(2)ベクトル検索だけに頼らない

チャンクを直しても当たらない場合、次に見るのは検索のやり方です。

RAGの検索は、多くの場合ベクトル検索(意味の近さで探す方法)で作られています。「有給の残りって何日?」と聞くと「年次有給休暇の残日数」の記述を、言葉が違っても意味で拾ってくれる。ここがベクトル検索の強みです。

ただ、この方式には苦手があります。

「E4021のエラー」「TX-300の設定」のような、意味を持たない文字列。ベクトルにすると似た番号同士が近くなってしまい、狙った1件を当てにくい。

ユーザーは「経費っていくらまで出る?」と口語で聞き、文書には「旅費交通費の支給限度額は次の通りとする」と硬く書いてある。人間には同じ意味でも、ベクトル上では思ったほど近くならないことがあります。

そこで効くのがハイブリッド検索です。難しい話ではなく、ベクトル検索と、昔ながらのキーワード検索を両方走らせて、結果を混ぜるというだけのものです。

この2つは弱点が噛み合っているので、混ぜると素直に精度が上がります。社内文書のRAGでは、ハイブリッド検索が入っているだけでかなり景色が変わることが多く、最初に検討する価値があります。多くのベクトルDB・検索基盤が標準機能として持っているので、自前で実装しなくて済むことがほとんどです(お使いの基盤のドキュメントで、現時点の対応状況をご確認ください)。

そのうえで、まだ足りなければ次の手があります。

渡す件数(top-k)も一度は疑う

AIに渡す資料の件数も、地味に効きます。少なすぎれば正解が漏れ、多すぎればノイズに埋もれて、肝心の記述が薄まります。

まず3〜5件あたりで始めて、検索結果を見ながら決めるのが無難です。「増やせば増やすほど良い」ではないことだけ、頭の隅に置いておいてください。

それでも直らないとき:資料そのものを疑う

検索も生成も詰めたのに、どうしても答えが安定しない。そういうときは、AIの外側——資料そのものに原因があることがあります。

とくに。テキストとして抜き出すと、行と列の対応が崩れてただの数字の羅列になっていることがあります。人間が見れば読める表が、機械には意味不明になっている。実際に抽出後のテキストを一度目で見てみると、驚くことが多いです。

改訂前と改訂後の規程が両方インデックスにあり、AIが古いほうを引いてくる。これは検索の性能では防げません。取り込む段階で古い版を外すのが正解です。

前述のとおり。これは仕組みの問題ではありません。

RAGの精度は、資料の整い具合を映す鏡のようなところがあります。逆に言えば、RAGを詰めていく作業は、社内のドキュメントの弱点を洗い出す作業でもあります。「AIの精度が上がらない」ではなく「この資料が機械から読めない状態でした」と報告できると、話が前に進みやすくなります。

精度は「感想」ではなく「数」で見る

ここまで直したら、最後にもうひとつだけ。

「なんとなく良くなった気がする」で進めると、次の変更で悪くなったことに気づけません。かといって、本格的な評価基盤をいきなり作る必要もありません。

質問と正解の資料をセットにしたリストを、20〜30件、スプレッドシートで持つ。これで十分に始められます。

質問正解が書いてある資料検索で拾えたか回答は正しいか
経費の上限は?経費精算規程 4-2
E4021の対処は?障害対応手順書 3-1××

変更を入れるたびにこれを流して、○の数を見る。それだけで「良くなった/悪くなった」が言葉ではなく数で言えるようになります。上に説明するときも、「体感で改善しました」より「30問中18問→24問になりました」のほうが、ずっと落ち着いて話ができます。

この数を作っておくと、「精度100%にして」と言われたときにも、「今24/30です。残り6問はこういう性質のもので、うち3問はそもそも社内に資料がありません」と、事実で返せます。期待値の調整は、数字があるといちばん静かに進みます

明日やること(この順番で)

一度に全部やらなくて大丈夫です。上から順に、今日できるところまでで十分です。

  1. 失敗した質問を10個集める(現場から上がってきた「答えられなかった」を拾う)
  2. 検索結果の上位5件をログに出して、目で読む(ここがいちばん大事)
  3. 「正解が入っていたか」に○×をつける→ 検索の問題か、生成の問題か仕分ける
  4. 検索の問題なら → チャンク分割(500字前後・見出し単位・出典の一行)を見直す
  5. それでも当たらなければ → ハイブリッド検索(キーワード検索の併用)を入れる
  6. 正解は入っているのに順位が低ければ → リランキングを検討する
  7. 質問と正解のリストを20〜30件作って、変更のたびに流す

3番まで進めば、もう「どこを触ればいいか分からない」状態からは抜けています。

チェックリスト

そのままコピーして、手元のメモやチケットに貼って使ってください。

【切り分け】
- 正解の資料を手で貼れば、AIは正しく答えられるか(=生成は無事か)
- 失敗した質問について、検索結果の上位5件を実際に目で見たか
- 上位に正解の資料が入っていたか/入っていなかったか、記録したか
- そもそも正解が社内資料に存在するか、確認したか

【チャンク分割】
- 1チャンクは300〜800字程度に収まっているか
- 見出し・セクションの構造に沿って切れているか(固定長のぶつ切りになっていないか)
- チャンク同士に1〜2割の重なりがあるか
- チャンクの先頭に、文書名・見出し・更新日など出典の情報が付いているか
- 指示語(「この機能」「本項」)だけのチャンクになっていないか

【検索】
- ベクトル検索だけになっていないか(キーワード検索を併用しているか)
- 固有名詞・型番・エラーコードで、狙った資料が拾えるか
- AIに渡す件数(top-k)は3〜5件あたりから調整したか
- 埋め込みモデルは日本語を扱えるものか(採用時点の最新情報を確認したか)

【資料】
- PDFから抽出したテキストを、一度目で見て確認したか(とくに表)
- 改訂前の古い版が、インデックスに残っていないか

【評価】
- 質問と正解のセットを20〜30件、リストにしてあるか
- 変更のたびにそれを流して、数で良し悪しを見ているか

最後に

RAGの精度が出ないとき、いちばんつらいのは、どこを触ればいいか分からないまま「精度を上げて」と言われることだと思います。触る場所が多すぎて、何をしても手応えがない。あの感じは、本当に消耗します。

検索結果のログを確認して原因の見当がつき、表情が明るくなった開発担当者

でも、検索結果を10問分だけ目で見れば、霧はだいたい晴れます。 「検索が拾えていない」のか「拾えているのに答えを間違えている」のか。それが分かるだけで、触る場所は数分の一に減ります。

デモで動いたRAGが現場で崩れるのは、あなたの設計が甘かったからではありません。社内の資料は、もともと機械に読ませる前提で書かれていないからです。それを機械が読める形に整えていく仕事は、地味ですが、AIの精度以上に長く効きます。

今日はまず、ログを1行足すところから。それだけで、明日の「精度を上げて」は、ずっと答えやすい問いになります。

よければ、こちらも

関連用語