0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

決算書のRAGで埋め込みをやめたら精度が15.7%から58.8%へ

0
Posted at

780ページある州政府の決算書のなかに「1,234」という数字が現れたとして、それが10万単位(lakh)なのか1000万単位(crore)なのかは、そのままでは判別できない。単位はたいてい表のヘッダー側に書かれていて、数値からの距離は中央値で13行、90パーセンタイルだと26行も離れている。文書を数百文字ごとに切ってベクトル埋め込みするふつうのRAGでは、数値と単位ヘッダーが同じチャンクに収まらない。結果として、桁が2つズレた答えを、それらしい自信とともに返す。

この「埋め込み検索は構造化文書で構造的に壊れる」という主張を、実データで測った論文が8月6日にarXivへ出ている。Sagar Tamangらの Beyond Top-K: Replacing Black-Box Retrieval with Interpretable Agentic Operations(arXiv:2608.06305)だ。結論を先に言うと、埋め込みをまるごと捨てた素朴な手法のほうが、精度で大きく上回った。

なぜ埋め込みは決算書で溺れるのか

一般的なRAG(Retrieval-Augmented Generation、検索で拾った文脈をLLMに渡す仕組み)は、文書をチャンクに割り、各チャンクをベクトルに変換し、質問ベクトルに近い上位k件を返す。意味の近さで引くこの方式は、言い換えや同義語には強い。だが今回の対象文書(Gujarat Finance Accounts 2024–25、780ページ、19,198行)は、非空行の86.8%が表の行だった。

問題は数字そのものにある。文書中の58,791個の数値トークンは、実際には15,960種類の値へ収束する。同じような数字が埋め込み空間にひしめき、質問と「意味的に近い」チャンクが大量に競合してしまう。企業名・勘定科目・桁揃えされた数値といった、決算書でいちばん効く手がかりは、埋め込みがもっとも均してしまう情報だ。表計算のシートをコピー機で薄く印刷して、罫線も桁も滲んで読めなくなる状態に近い。それが埋め込みが数値に対してやっていることだ。

READ:grepと行番号読みだけのエージェント

提案手法 READ(Reliable Embedding-free Agentic Document-search)は、埋め込みを一切使わない。代わりに、決定的な3種類の操作をエージェントに渡す。正規化した字句検索、見出し構造の把握、行番号で範囲を指定した読み出しだ。これらは Model Context Protocol(MCP、ツールをLLMへ標準化された形で公開する仕組み)のサーバとして、次の道具立てで実装されている。

memory_grep(pattern, context=0..10)  # 行単位の検索。前後の文脈行を指定可
memory_outline(file)                 # 見出しと、その行・ページ範囲を返す
memory_read(a, b)                    # a行目からb行目を読む(1回400行まで)
memory_list(dir)                     # ファイル列挙

エージェントはまずgrepで数値やラベルの在処を探し、outlineで自分が文書のどこにいるかを掴み、証拠の位置を見てから読む範囲を決める。ポイントは、単位ヘッダーを取り込むために範囲を上方向へ広げられることだ。しかも全操作が「文書と引数の純粋関数」なので、同じ手順を再実行すれば同じ結果が出る。類似度スコアという不透明な数字ではなく、再生可能な監査ログが残る。ここは実務でかなり効く。なぜその行を引いたのかを、後から人間が追える。

素朴なほうが勝ち、しかも本命はBM25

評価は、文書から人手で作った51問(単純参照・算術・集計・ナビゲーション・回答不能など6カテゴリ)で行われた。バックエンドのLLMはGemini-2.5-pro。主な結果はこうなった。

手法 正答率 補足
READ(4操作) 58.8% 埋め込みなし
READ(naive-grep版) 66.7% 正規化なしの素のgrep
BM25 51.0% 疎な字句検索
Dense(最良調整) 35.3% 2000字・k=16
Hybrid(RRF+リランカー) 29.4% dense+BM25融合
Agentic RAG 27.5% ベクトル検索ツール付き
Dense(既定) 15.7% 2000字・k=8

READはk=8のdense検索に対して統計的に明確な差(McNemar検定、Holm補正後 p=2×10⁻⁵)をつけた。だが本当に興味深いのはBM25との比較だ。READ 58.8%に対しBM25 51.0%、その差は有意ではない(p=1.00)。正規化を外した素のgrep版はむしろ66.7%まで上がる。つまりこの結果は「エージェントが賢いから勝った」のではなく、「埋め込みをやめたから勝った」と読むのが正しい。著者自身がそう明言している。ベクトルDBを立てて、融合して、リランカーまで足したHybridが、素のBM25に負けているのが象徴的だ。

この方向性は独立した研究とも符合する。Akarsuらの From BM25 to Corrective RAG(arXiv:2604.01733)は、7,318件の財務文書・23,088クエリという桁違いの規模で10種の検索手法を比較し、「BM25が最新のdense検索を財務文書で上回る」と報告した。ただし両者で食い違う点もある。Akarsuらの総合勝者はHybrid+ニューラルリランカー(Recall@5=0.816)だったのに対し、READの単一文書ではHybridがBM25に負けた。ここから引き出せるのは、「dense単独が数値・表データの弱点」という部分は再現性が高く、その先(素の字句検索で十分か、Hybrid+良質なリランカーが要るか)は文書とパイプライン次第、という現実的な結論だ。

どこまで真に受けるか、そして何を試すか

冷静に見ると、READの実験には弱点が多い。文書1本・LLM1種・51問という小ささで、しかもベンチマークを作ったのが評価対象システムの著者本人だ。回答の根拠一致率(groundedness)はREAD 58.0%と、BM25の67.3%より低い。多く読むぶん、拾った本文にない数字を口走る隙が増えるからだ。コストとレイテンシもREADが不利(1問あたり$0.058対BM25の$0.020、31.4秒対dense12.7秒)。だからこれは「決着」ではなく強い信号だ。

それでも、現場のエンジニアが持ち帰れる指針ははっきりしている。埋め込みは意味の近さを引く道具であって、正確な数値や識別子の照合には向いていない。表と数字が主体のコーパスに、反射的にベクトルDBを立てる前に、まずgrepと行範囲読みを試す価値がある。監査ログが残り、単価も安く、実装も軽い。「とりあえず全部embedして top-k」という既定路線を、少なくとも構造化文書では一度疑ってみる。今回いちばん学びになったのは、精度を上げたのが高度なモデルではなく、余計な抽象化を一枚はがしたことだった、という点だ。

※本記事は一次情報の調査をAIが行い、事実確認のうえ執筆・公開しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?