RAGにおけるリトリーバーの設計とTF-IDF・ベクトル検索手法の違い、精度評価までの実践ポイント

RAGのリトリーバー精度アップや検索効率改善がすぐ試せる、実践向けのポイント集

  1. まず3種類の検索手法(TF-IDF・BM25・ベクトル検索)を2時間以内にサンプルデータで試してみて。

    どの手法が質問に強いか実感できるから―2日後、上位5件の正答率を比較すれば効果わかる。

  2. リトリーバー設定は「上位10件以内で関連度80%以上」を目安に調整してみよう。

    絞りすぎると抜け漏れ、広げすぎるとノイズ増えるし、3日後にPrecision値が10%上がるかチェックできるよ。

  3. 2025年以降はベクトル検索(特にHNSW)を10万件以上のデータに使うと体感で速さも精度もUPしやすいよ。

    似た文章もきちんと拾えるし、1分未満で上位結果が出れば合格―週末にRecall値も見てみて。

  4. 最初の評価は「Precision・Recall」を両方3日間トラッキング、片方だけ見ないように。

    バランス崩れると検索の意味がないし、5回テストで両方80%以上なら設計OK(結果を記録)。

RAG導入でLLMの正確性を高める方法を知る

リトリーバル拡張生成(RAG)ってそもそも何? …うーん、まだちょっと目が覚めきらない感じだけど、自分なりに分かりやすく話してみるね。このシリーズでは、RAGというシステムの“中の仕組み”と“活用理論”を両面から覗いてみる予定。ひとまずRAGの動作原理から順番に見て、それから後半で「どうやってもっと効率的&便利にできるか」をつまんでいこうかなと思っている。わたしなりの説明になるけど、順を追えば理解しやすくなると思う。

まず流れをざっくりまとめておこうか。
1. 運用理論―RAG内部のしくみ 
 このセクションでは主役であるリトリーバ(情報検索担当)の核心について、下記4項目を中心に考えるよ。
 ・ゴール―そもそも何が目的なの?
 ・メソッド―目標到達までに使う技術アプローチ
 ・スコアリング関数―取り出した文書はどう評価する?
 ・評価指標―検索そのものの有効さを見る軸

2. 応用理論-導入時にどう運営していくか
 次はちょっと外側――実際エンジニアさんがどんな設計判断とか選択肢に悩むかという観点だね。以下2本立てでポイント絞る予定。
 ・セットアップ―リアルな構築現場で必要な要素とか仕込み方
 ・デザイン選択肢—パフォーマンス向上にも繋がるような技術配置

こんな感じで話せば、「抽象っぽい理屈」→「手触り感ある運用例」と整理されそうかなぁ。インフラ準備とかモデル類や性能バランス調整まで網羅的にまとめるイメージ。本編Part Iは“運用側”、そして次回Part IIへ進んだら“応用(設計まわり)”へ寄った内容を予定しているよ。

────────────────────
■ はじめに

最近、大規模言語モデル(LLM)があちこちで話題になってきた印象ない? GPT-5だったりClaudeやGemini、Perplexityとか、新顔モデルが結構ハイペースで登場するし、おのおので「高精度だ!」「信頼性UP!」みたいによく宣伝されてたり。中にはハルシネーション(回答ミス誤認)の抑制だったり、「根拠表示モード」強化系もあれば、推論力重視とか個性的文体狙い型なんてものまで混在。それでも総じて現代LLMって全体的には非常〜にハイスペック機ぞろい、と見ていいかな。

とは言えベースとして、大規模言語モデル=自動補完エンジンと言ったところ。それらは学習段階で見つかったパターンにもとづいて、一番あり得そうな単語候補を延々予測生成してテキストを書く役回りなんだ。「滑らか&筋通った人間っぽ文章」…そういう特徴。ただ、一つ注意しなきゃならない点として、「とても尤もらしい文章優先」で設計されているから、本当に常時正解となる保証がなくてね。一見それっぽい受け答えでも、中身がズレたり偽情報掴まされた経験……まあ一度くらいあると思うよ? これ、“ハルシネーション”とも呼ぶタイプだけど、その生じ方もちょっと挙げたい。

具体例としては -
◦ モデル学習時点ですそもそも該当知識そのものが入っていない場合
◦ 教材データセット内自体ミス/不揃いや古さ残ったケース 等など…。

んじゃ、この流れでも大事なのは “コンテキストへの適応性”。実際、特定知識なくても新たな材料――例えばその場のプロンプト等――によって案外上手く補強推論してくれる能力持ってたり。こここそRetrieval-Augmented Generation(RAG)が成立するキモと言えるところ。

結果的には「RAG」はユーザー質問とLLM回答との橋渡し役を引き受ける存在になっているよ!つまり外部コンテキスト――データベースやドキュメントストア、企業内ナレッジ群なんかね――それらから欲しい部分のみ抽出して並行供給、それによって「応答内容を現状基準まで鋭敏化&正確化」に繋げられてるのさ。

RAGの基本構成要素と仕組みを理解する

RAG(Retrieval-Augmented Generation)って何だろう――実は、医療や法律、企業向けナレッジシステムみたいに「絶対に事実ミスしたくない」現場で、大規模言語モデル(LLM)単体と比べてハルシネーションを大幅減少させるためのアプローチとして有名になってきています。ポイントは、「LLMの記憶ベースだけを頼りにしない」ということなんですよ。つまり、領域別で信頼性バッチリのデータも追加投入できるから安心感がかなり違う感じです。

要はどういうことかと言うと――LLMだけの場合、とても流暢でそれっぽい文章を作るのは得意なんですが、やっぱり根拠が曖昧なハルシネーションがどうしても混ざるんです。一方でRAG構成なら、リアルタイムで新しい・信憑性高いデータにもアクセス可能だから文脈にもぴったり沿いつつ正確さもぐっとアップする、というわけ。

じゃあRAGって何をどうやって動かしている仕組みなの?と思ったので、一度分解しながら書いてみます。まず基本中の基本になるのが「ナレッジベース(KB)」です。これは…例えば自社資料とか最新の医療報告書など、とにかく特定ドメイン専用で詳しい情報を詰め込んだ“倉庫”的なもの。もしこれが無かったらRAGそのものが成立しません。

それから各パーツ同士は下記みたいにつながっています。
1. 「リトリーバー」がナレッジベース内からその時もっとも重要そうな情報をサクッと探してピックアップします。
2. この集めた情報をユーザーから来た元々のお題(プロンプト)へ加えます。この付加作業、自分的には「オグメンター」と呼びたいところ。ただ実際には独立した部品というより、多くの場合リトリーバー自身が追加取得→合成までまとめてやりますね。
3. 最後に、こうやって補強された知識ごとLLMへ送り込んで、新しく返答文を生成してもらう形になります。

この流れ自体こそまさにRetrieval(検索)-Augmented(補強)-Generation(応答)の頭文字になっています。「まずリトリーブ」「それにオグメント」「あとはジェネレート!」そんなイメージでもいいかも。

ちなみに昔ながらの手法だと、「ユーザープロンプト→LLM→一応最善っぽい答え」という直線構造です。この方法だとモデル自身が記憶として学習済だった内容のみ的確になる一方、それ以外では予想外の創作とかハルシネーションにつながったりもしちゃうわけですね。

けれどRAG導入後なら、
ユーザープロンプト → RAG(リトリーバー+オグメンター)→ LLM → 根拠ある回答
…みたいなフローへ生まれ変わります。ふいっとこのワンステップ増えるだけで、その都度領域特化型・ちゃんと確認済みソースまで参照OKになっちゃう。それゆえ最近では医療問合せへのフィードバックとか法律ドキュメントまとめ機能、それから企業検索・案内にもよく使われていますよ。

まぁ総括すれば結局、RAGはRetriever—Augmenter—Generatorという三本柱のおかげで成立している仕掛けだと言えるでしょう。ま、いいか。

RAGの基本構成要素と仕組みを理解する

リトリーバーの役割と検索目標を設定するには

RAG(Retrieval-Augmented Generation)システムで一番大事な心臓部って、結局リトリーバだと思うんですよね。眠気まじりに言うと、どの情報を生成モデルに「見せて」あげるか決めてくれる存在で、この役割の精度がシステム全体の賢さにもろに響いてきたりします。ぶっちゃけ、リトリーバ次第な面も多い…たぶん。

何をやるかというと、クエリとナレッジベース内の文書を照合する時、「どんな似てる感覚に重きを置くか?」みたいな方針を設定している感じですね。広い意味で見れば、大まかには次の3タイプが主流です。
- キーワードベース検索:クエリとドキュメントで同じ単語を軸に突き合わせていく感じ。
- セマンティック検索:埋め込み的な表現やニュアンスなど“意味”で似たもの同士を結び付けるスタイル。
- メタデータ検索:著者やタイトル、作成年月日みたいな構造化された情報から探すタイプ。

こういう「目的」が、そのマッチングに何を求めているか? という疑問への答えにもなっています。いや~面白いですよね。

反対に、「方法」の方は「どうやったら効率よく関連した文書が見つけられるか?」への細かいレシピとなります。当然、求める目的によって選ばれる道筋も変わってきます。

まあ、典型的なやり方だけ挙げておきますね。

■ 方法1: キーワード検索
これはもう文字通りですが、ユーザーが打ち込んだキーワードと同じ単語が入ったドキュメントを探し出すアプローチになります。有名どころだとTF–IDFやBM25あたり。本節ではTF–IDFについて先に触れてみます。

1.1 TF–IDF: 昔からある王道のキーワード手法
TF–IDFというのは、“Term Frequency - Inverse Document Frequency”(単語頻度−逆文書頻度)の頭文字ですね。その根本となる考え方はざっくり2つ:
- TF(Term Frequency):特定の単語がひとつのドキュメント中でいっぱい出てくれば、その文書の重要ワードと言える傾向。
- IDF(Inverse Document Frequency):逆に、多くのドキュメントに頻繁に登場する単語ほど識別力が薄まるので控えめ評価する感覚。

この2つを合わせることで、「この文書だけやたら多いけど他にはレア」みたいな“通好み”な単語にも注目できちゃう、と。

具体的な計算としては、
- Term Frequency(TF)はwという単語がdという文書内に現れた回数(count(w))÷その文書自体の長さ。この式のおかげで極端に長い文章だけ有利になる弊害も減らせます:

TF(w, d) = count(w) / length of d

ここで、
w = 単語
d = ドキュメント

- Inverse Document Frequency(IDF)は、全体N件ある中でwが含まれるDF(w)件数にもとづき算出されます。対数log()計算になってる理由は急激な差分にならないよう重み調整してるためです。

IDF(w) = log(N / DF(w))

ここで、
N = コレクション中の総文書数
DF(w) = 単語wを含む文書数

- 最後はTF × IDFの掛け算でもって仕上げ:

TF-IDF(w, d) = TF(w,d) x IDF(w)

1.1.1 クイック例:宇宙機関ナレッジベース
例えば、ごく簡易的に宇宙ミッション関連を書いた3つのナレッジベースドキュメントだけが手元にあったとして -

Doc 1: NASA launched the Apollo mission to the Moon.

ま、いいか。こんな感じかなあ。(ほかにも続き例を書く場合、その都度って付け足せば大丈夫そう。)

キーワード検索TF-IDF・BM25手法の違いを比較する

TF–IDFは、たとえば「space agency with a successful yet cheapest moon mission?」みたいなクエリを与えられた時に、その関連度を測る古典的な方法のひとつだよね。ざっくり言うと、まずクエリの中身を「space」「agency」「successful」「cheapest」「moon」「mission」みたいな単語群に分けてから、それぞれが各文書にどれだけ含まれているか数えていく。今回サンプルとして、Doc 1は「nasa launched the apollo mission to the moon」(全8語)、Doc 2は「isro achieved the cheapest successful moon mission chandrayaan」(8語)、Doc 3は「esa operates many space projects across europe」(7語)なんて感じ。

次に、それぞれの単語が3文書中何本出現するか調べる。「space」は1文書、「agency」はゼロ、「successful」は1本、「cheapest」も1本。「moon」と「mission」だけ2つずつ顔を出しているって具合。あとはスムーズIDFというややこしい公式(idf(w) = ln((N + 1) / (DF(w) + 1)) + 1)が出てきて、例えばidf(space) ≈ 1.693147とかidf(agency) ≈ 2.386294になる。

ここで終わらず、実際にはそれぞれの文書内で該当単語がどんな頻度で現れているか(TF)も掛け合わせる。その積がいわゆるTF–IDFスコアになるんだけど、例えばDoc 2には「successful」「cheapest」「moon」「mission」がぜんぶ含まれていて、最終的に0.745207という値になった。他よりダントツ高いっぽい。このことから、高頻度×希少性が光るDoc 2――つまりISROによるChandrayaanミッション――が一番問いへの関連性あり!となっている。要は、「最安値で月面到達&成功した宇宙機関」を探すなら、この事例ってワケだね。

続いて紹介されているBM25って手法もけっこう使われ始めてる。ざっと言うと、TF–IDFの基本思想そのままだけど頻度増加への減衰とか文書長補正も組み込むので不公平感少なめ。不自然な長文バイアスを防ぐし、多く登場する用語ほど貢献値が早く頭打ちになったりするよう微調整されている。BM25流IDFではlog((N - DF(w) + 0.5)/(DF(w)+0.5)+1 )なる独自式で計算するし、他にも各要素について明示的にチューニングできたり便利。それなりに複雑化しているおかげで実運用でもバランス良く働くらしいよ。

さらにもうひとつ。最近よく耳にするセマンティックサーチ(ベクトル検索)の話にも言及されてたね。これまで主流だったキーワードマッチじゃなく、“意味”そのもの(語彙・文章)の内容へ焦点あてて、それらを埋め込みモデル経由でベクトル化し似た意図や概念レベルでも関連文書探せるという仕組み。ただ、その場合でもまず問い合わせクエリ→埋め込み→ベクトル比較...というプロセス自体は結局存在する、と理解してOKだと思う。ま、いいか。

キーワード検索TF-IDF・BM25手法の違いを比較する

セマンティックサーチがRAGで重要な理由を学ぶ

知識ベースのドキュメントも、クエリと同じように「埋め込み(embedding)」へ変換されるんですよね。これがいつやるかは場合によって違って、最初から保存しておくこともあるし、検索のたび計算するやり方もあったりします。その後でk-NNとかANNみたいな手法で、「今調べたい内容」のベクトルに一番近いドキュメントを探し出すんです。その見つかった情報がRAGパイプラインを通って、質問文に上手く盛り込まれ、大規模言語モデル(LLM)へ送られていく感じ。この流れだと“単語が一致したからOK”みたいな雑な判断じゃなくて、数学的な距離として意味の近さをちゃんと測ってる――ここ大事。

埋め込み自体についてもう少し話すと、セマンティックサーチの基盤になってる考え方なんですよ。つまり、「単語」とか「文」や「文章」が、その意味を反映した数値ベクトルになるわけですね。超高次元空間――例えば768次元とか1536次元――で、それぞれの点として存在しています。同じ意味っぽい単語は自然と近づいて配置されて、お互い関係ないものは離れる。ちょっと例出します:
- 「happy」と「glad」みたいな同義語
- 「pizza」「pasta」などジャンル似ている食べ物
- 「car」と「truck」の機能的類似

この高次元空間そのものは人間には可視化できません。ただ理屈としては幾何学みたいに距離で表現できて、“遠ければ違うもの・近ければ似たもの”というイメージ。「space」「cosmos」はかなり近い位置、「space station」と「ice cream」は明らかに距離ある感じになります。

では、なんでRAG(Retrieval-Augmented Generation)構築時に埋め込み技術が欠かせないかという話ですが…やっぱ堅牢なリトリーバー設計するなら、この仕組みへの理解抜きでは厳しいと思います。

押さえておいたほうがいい注意点として
・同一モデル:ドキュメント用もクエリ用も必ず同じ埋め込みモデル使うこと
・領域特有性:一般向けの埋め込みだけじゃ医療とか法律など専門領域だと精度落ちるケースあり
・次元数バランス:より多い次元なら繊細なニュアンス拾える一方、処理効率悪化するので縮約することも結構あります

さて…続きではセマンティック検索で具体的にどう探すの?というところを見ていきます。

2.1 k-NN: ブルートフォース型セマンティック検索
代表的なのがk-Nearest Neighbours(kNN)。機械学習でもよく聞くワードだけど、この場面だと“全件チェックしてトップk件返却”タイプ――要するに地味だけど全部比べちゃう豪快方式です(笑)

流れをざっくり説明すると、
- まずドキュメント:知識ベース内すべての記事や文書それぞれn次元ベクトル化→共通モデルで管理
- ユーザー入力:質問テキスト(クエリ)も同様に変換

という具合になります。ま、いいか。

k-NN・HNSWなどベクトル検索手法の選び方

k-NN(いわゆるk-近傍法)って、まあ端的に言うとクエリのベクトルをコサイン類似度とかユークリッド距離とかで全ドキュメントベクトルと比べて、その中から距離が近い順にソートし、最も近しいk件だけ返してくれる手法です。アルゴリズム的には意外とシンプルだから実装の敷居も低め。それにちゃんと厳密な検索結果を期待できるのは魅力ですね。でも正直「スケーラビリティ」の面でけっこう悩まされるかも、って感触があります。

と言うのも、この方式だと1回クエリを投げるたびN個すべてのドキュメントと比較することになりがちなので、どうしても計算量はO(N)になりますよね。もしN=10³くらい、つまり数千規模ならほぼ問題なし。ただしN=10⁹(十億件!)レベルになってしまうと、一度のクエリごとに十億回もの比較・計算…うーん、リアルタイム応答なんて夢のまた夢でしょう。この規模だと遅延やらマシン負荷やら色々大変そうです。というわけで巨大コレクション向きじゃない、と正直思います。

そんな時登場するのがApproximate Nearest Neighbour(ANN:近似最近傍探索)。「完全一致は求めないから、とにかく速くして!」みたいな割り切った発想です。ちょっとだけ精度を犠牲にしつつ、代わりに桁違いなレスポンス・コスト削減を狙います。

ざっくりまとめておくと、k-NNは意味的にクエリへ最も似た文書群を見つけられて、小規模データセットなら冗談抜きで力を発揮。ただし数が増えてきた時点で速度面などネックになりがちなので、「ほぼ同じ結論」が超高速&低コストで取れるANNへのニーズが高まります。

ANN系にはいろんなタイプがあります――NSWとかHNSWなんかが代表的ですね。それぞれ速度・精度・メモリ消費など「一長一短」でバランス感覚が問われます。特にHNSWについて言えば最近有名サービスやフレームワーク(FAISS, Milvus, Weaviate, Pineconeなど)が好んで採用している印象強いです。

じゃあ、そのHNSWとは何ぞや?という話なんですが、簡単に言えばHierarchical Navigable Small World Graphs(階層型ナビゲーブル小世界グラフ)の略称。これ自体グラフ構造型アルゴリズムでして、各ドキュメントベクトルをノード化→ノード間をエッジで繋ぎ合せて近傍ネットワーク構築、というイメージです。その上、「普通のNSW」と違って複数層からなる階層ヒエラルキーになっているので効率アップ&スケールメリットまで両立できるという仕掛けになっています。

HNSW検索処理のおおよその流れを書いてみますね。
まず一番上層から入って、ごちゃごちゃした密集じゃなく疎なノード間移動だけで広範囲をざっくり絞ります。そのまま徐々に下層(中間→最下層)へ降りながらどんどん絞り込み精度アップさせつつ、最後は全ノード網羅済みな一番下の層へ着地。その段階になると候補集合が少なくなっているので集中して比較評価→最終的な解答集合確定…みたいな「多段ステップ」の戦略となってます。ま、いいか。

k-NN・HNSWなどベクトル検索手法の選び方

メタデータ検索でドキュメントを効率的に絞り込むコツ

検索が最下層に辿り着く頃には、もうアルゴリズム側で探索する空間は大幅に削減されています。この仕組みのおかげで、ものすごい規模でもサブ秒レベルの応答速度ってわけですね。何となくイメージしやすい表現を使うと──

> **k-NN(k近傍法)の場合、「どのドキュメントが一番近い?」という疑問をひとつずつ全部確認します。
> **HNSW(階層型近傍グラフ)は階段みたいな多層的ネットワークを通して、本当に目的に近そうな道筋からゴールへズバッと突き進むやり方です。**

結局得られる内容自体はかなり似ています。でも体感的には本気でびっくりするくらい早いため、大規模なナレッジベース──数十億単位の規模でも、実運用現場で問題なしってなるわけ。

## 方法3: メタデータ検索

メタデータ検索は非常に素朴とも言える方式なんですよね。本体そのものではなく、付随する構造化属性、つまり**メタデータ**(タイトルとか著者名・作成日/公開日・分類種別やパーミッション範囲:たとえばpublic/paidとか、地域・部門みたいな情報)が主役です。
タグやラベルって呼ばれたりもして、それぞれのドキュメントが背負う“外枠”部分がこのフィルター処理では軸になります。検索時は **ブーリアン形式** たとえば _author = "Smith" AND year = 2023_ みたいなのを当てて切り出し。

**特徴ピックアップ:**

> _**とても手軽&高速:**_ メタデータ基準だと、一瞬で対象が狭まるので悩まず済む印象。
> _**外形依存:**_ 本文内容そのものまでは全然チェックしないため、枝葉だけ追いかける感じです。
> _**関連性順位レス:** 条件一致したらはい終わりという割切設計なので「セマンティック類似」「キーワード度合」みたいな順位要素は入らないですね。

**気になる実務上ポイント:**

> フィルター機能自体「ドキュメント単位」でのみ動きます。そのせいで仮に1セクション分しかメタ情報記載がない時も、そのエリア丸ごと小分け「ドキュメント」として取り扱わざるを得ません。
> このことから“どれくらい細かく分割=チャンク化”するべきか?粒度設計こそ肝要だよ、とされます。

## 方法4: ハイブリッドサーチ

ハイブリッドサーチになるとうん、多手法ガチ合わせ技。普通、「キーワード検索」だけじゃなく「セマンティック」「メタデータ検索」…全部パイプライン状につなげちゃいます。

**なんで混ぜるの?理由ちょっと羅列しておくね:**

> _**キーワード(TF–IDF, BM25):**_ ガチ厳密マッチの点で強さ抜群
> _**セマンティック(k-NN, ANN):**_ 言葉表現ブレても意味合いごとキャッチできる
> _**メタデータフィルター:**_ とにかく絞込爆速

これそれぞれ「穴」を補完して掛け算的メリット出せるというノリです。

【流れざっくり想像図】

> _【同時処理】:_ キーワード×セマンティック両方走らせてあと統合。
> _【重みスコア混ぜ】:_ 決め打ち配分例70%意味・30%語句型として加重
> _【事前限定】:_ 最初にザクッとメタ情報による切込み→次順位付けへ

【代表的特色】

> _バランス志向:_ 意味直球+文字列厳密マッチ両輪併用だから拾える幅広!

ハイブリッド検索で精度と柔軟性を両立させるポイント

ハイブリッド検索って、ひとつの手法だけにこだわらず、複数の方法を組み合わせることで領域特有の事情(たとえば法務、医療、それから金融など)にも柔軟に対応できるのが強みなんだよね。でも当然だけど、その分だけ計算コストは増えちゃうし、スコア調整はなかなか繊細な作業になるんだなぁ。このへんはまあ、「何でどっちか片方を選ばなきゃダメなの?」って素朴に問い直して、だったら両方ミックスして使ったほうがいいんじゃない?っていう発想に近い気もする。実際その結果として、精度・再現性・効率、この3つをバランス良く満たすタフな情報検索が実現できるし、生産環境でRAGシステム作りたいときにはいちばん現実的って評価されることが多いみたい。それで結局のところ、キーワードベース(TF–IDFとかBM25)、セマンティック(kNNとかANN系)、メタデータベース、それとハイブリッドという4タイプの主要な情報検索方式について話してきた形になるね。

## スコアリング関数

スコアリング関数というのはリトリーバー本体に組み込まれていて単独で動くものじゃない。ただ、本質的には「どれが一番関連ある文書か」決めている仕掛けなので、この見えにくい部分を明確化しておく意味はあると思う。厳密には、スコアリング関数とはクエリと各候補文書とのあいだで数値的な類似度や距離スコアを割り振る仕組みなんだ。それぞれの検索方式ごとに、この関数自体も微妙に異なるよ。

## SF 1:キーワードベース検索

もっともプリミティブな関連判定って、とりあえずキーワードがどれくらい正確に一致したかをカウントするやり方かな。言葉そのものの意味までは直接見てないけど、一致単語が多ければまだまだ普通に役立つ場面は多い。

### 1.1 TF–IDF スコア
語 w と文書 d のそれぞれについて TF(w,d) × IDF(w) の式で算出される。
> _**TF–IDF が高いケース**_:その文書内ですごく重要で、しかも全体でもめったに出ない言葉(つまりレアワード)がたくさん含まれている状況。
> _**低めの場合**_:その語句自体ほかにも頻繁登場する(低IDF)とか、その文書中でも回数少ない(低TF)感じかな。

### 1.2 BM25 スコア
TF–IDF よりもうちょっと進化版。「文章長の正規化」と「同じ単語ばっか出てくる効果薄れ」の点まで配慮した方式。BM25(w,d) = IDF(w)⋅TFBM25 (w,d) みたいな計算になるよ。
> _**BM25 が高得点の場合**_:クエリ単語とのマッチ率良好かつ文章長や収穫逓減への補正もちゃんとなされている時。
> _**逆に低い場合**_:レアワードなし/凡庸すぎるワード連発/文章長によるペナルティなどが原因っぽい。

## SF 2:セマンティック検索ベース

セマンティック検索ではクエリや文書全部をベクトル化して高次元空間内で「どれぐらい近づいているか」から関連度を見る方法だね。主だった指標は以下:

### **2.1 コサイン類似度**
二つのベクトル間角度=方向一致感(要するに意味重複)の尺度として機能。
> _**範囲:**_ [−1,1](だけど普通は0以上[0,1]帯域のみ)。
> 高値→内容的にも近そう。
> 低値→意味バラバラ感増し増し。

### **2.2 内積(ドット積)**
片方ベクトル上へ他方成分どれぐらい重なる?という見方。
> 多くの場合、正規化済み埋め込み同士使う。
> 数値大→類似強調モード。

### **2.3 ユークリッド距離**
埋め込み空間中ふた点間直線距離から見るパターン。
> 距離小さめ→かなり近しい印象。
> 距離大きめ→関連薄そう…?

## SF 3: メタデータベース検索

場合によっちゃ本文より日付とか著者名、それからタグ等構造化された属性自体こそ決定打になったりもします。ま、いいか。

ハイブリッド検索で精度と柔軟性を両立させるポイント

各種スコアリング関数で関連文書をランキングする流れ

これらの場合、メタデータフィルタリングはスコア付けというよりも、バイナリ的な通過ルールで動いてますね。つまり、「一致(Match)」なら1、「不一致(No match)」は0になるだけ。ランクづけそのものが存在せず、「このドキュメントは条件をパスできるか?」だけが判断されている感じです。

## SF 4: **ハイブリッド検索の考え方**

ハイブリッド型ってのは、複数ソース――具体的にはキーワードとセマンティック両方――からのスコアを一緒くたに計算してる方式なんですよね。

Final Score = α⋅Semantic Score + (1−α)⋅Keyword Score
> ここで重みパラメータ**α**を調整します(例えば「意味重視」なら0.7、「キーワード推し」なら0.3みたいな配分)。
> こうやってキーワード一致によるピンポイント精度と、意味近さベースの広いカバー範囲、その両方の良さ取りを図れます。

**ざっくり言えば:**
> **キーワード手法:** キーワード命!で直接ランク決定。
> **セマンティック手法:** 意味的な近さで並び替え。
> **メタデータ:** 属性フィルター機能しか担わない、そもそも順位つけ自体やらない。
> **ハイブリッド:** キーワードも意味シグナルも色々集めて、一発総合スコアで決めるイメージ。

## **評価指標のおさらい**

Retrieval-Augmented Generation(RAG)環境でも重要なのは「どう評価するか」。ただモデルやアルゴリズムを作ればOKって話じゃないので。数値として比較できる「評価指標」は欠かせません。このあたりは情報検索界隈では結構古典ですが、今もRAG的ワークフロー全体でバッチリ使われています。

## **EM 1: Precision と Recall**

最初に押さえたい2大基本が**Precision**(適合率)と**Recall**(再現率)。

**正式な数式表現:**
Precision = TP / (TP + FP)

Recall = TP / (TP + FN)

※TP=当たりの数、FP=外れの数、FN=漏れた当たりの数

**直感で捉えると:**
Precision = 引っかかった中で実際役立つ割合

Recall = ナレッジ内の役立つ全体からどれだけ引っぱれたか比率

**両方気にしないと…:**
> _**Recallばっか追うと?**_ 全関連文書引き出すことに躍起になって件数超盛り→ごちゃ混ぜ&関係ないドキュメントだらけ、結果としてPrecisionだだ下がり。
> _**Precision偏重パターンでは?**_ 「これは間違いなく必要!」って極小選別になっちゃうので実際得られる量そのものが激減→見逃し多発=Recallガクッとなります。
> 強力な検索って、高め合ったRecallとPrecisionの共存が大事。まあ夢の高次元トレードオフ…。

## EM 2: Precision-Recall カーブとは?

閾値――取れる文書多め/少なめ、その塩梅をチューンすると…Precision・Recall両軸のバリエーション描写になるんです。それぞれいろんな「どこまで広く拾うvsどこまで外さない」って感じかな。このグラフがまんまシステム調整や評価診断にもなるから興味深いところですね。

## EM 3: Precision@k・Recall@k

最近の情報検索&RAG事情じゃ、「上位○件(例:Top-5やTop-10)」だけ扱う形が主流なので、これらもk件目までに特化した定義になります:

Precision@k = (上位k本中 relevant 文書)÷ k

Recall@k = (上位k本中 relevant 文書)÷ (ナレッジ内 relevant 本全部)

### 3.1 クイックサンプル

上位3件(k=3)拾った状況として、
ナレッジベース上 relevant が {D1, D3, D5

Precision・Recall等の評価指標でRAG性能を測定する

検索システムって、実はスコア(例えばBM25とかコサイン類似度とか)に基づいてドキュメントを順位付けしてリストで返す仕組みなんですよね。この「ランキング」ってのは、ざっくり言うとそのドキュメントがどれくらい上の方に出てきたか、その位置を示します(ランク1=一番最初の結果)。しかも、「関連性」について考えると、単純に候補リストに含まれてるだけじゃなくて、どれくらい早い段階で登場するかがすごく大事になってくるわけです。

**なぜ重要なのか?**
RAGとか色んな応用タスクの場合、多くはユーザーや後続AIモデルがリストの上からしか見ません。だから、「できるだけ関連文書を高い位置で見せられるシステム」の方が評価されやすい。もし下のほうに埋まってたら結構ダメージ大きめなんですよ。その背景も踏まえて、**MAP・MRR・nDCG**みたいな「順位への感度が高い評価指標」をここで導入することになります。

## EM 4: 順位を加味した評価指標(通称:Mファミリー)

ただ精度(Precision)や再現率(Recall)を見るだけじゃなくて、情報検索分野では「そもそも何位まで出てきた?」にも注目した評価軸があります。それってつまり、「ちゃんと関連ドキュメント引っ張れてるか」+「なるべく高順位に載せているか」を合わせ技で測ろうとしている感じ。代表格としてよく名前出てくるのは:

> _**MAP**_(Mean Average Precision, 平均適合率)
> _**MRR**_(Mean Reciprocal Rank, 平均逆数順位)
> _**nDCG**_(Normalised Discounted Cumulative Gain, 正規化割引累積利得)

※ MAPやMRRやnDCGは本当なら別々で語られること多いですけど、この説明だと効率優先なのでまとめちゃいます。

### 4.1 Mean Average Precision (MAP)

MAP説明行く前に、一旦「Average Precision (AP)」というものから。これは1つのクエリごとに計算する値です。

AP = (1 / R) × Σ [P(k) × rel(k)]

where,
R = 関連文書全体の個数
P(k) = ランクkまで取得した場合の精度
rel(k) = ランクkドキュメントが関連していたら1・違えば0

そしてMAPは複数クエリ分まとめた時、その平均になります:

MAP = (1 / Q) × Σ AP(q)

where,
Q = クエリ数

> MAPという指標は「全体的な関連文書並べ替え力」を測ります。高順位になるほど嬉しいですが、中位以下でもちゃんと役立ちます。

### 4.2 Mean Reciprocal Rank (MRR)

こちらは特に「最初に正解が何位だったか?」そこだけ凝視します。例えるなら即答勝負みたいな使われ方ですね。

MRR = (1 / Q) × Σ (1 / rankᵢ)

where,
Q = クエリ数
rankᵢ = i番目クエリで初登場した正解ドキュメントの順位

仮に2位で最初の正解発見ならReciprocal Rank=1/2=0.5。その数字を全体平均します。

> MRRはズバッと1つ目ゲット型です。「速さ重視」にピッタリ向いてますね。一発目ゲット成功=点数爆上げです。

### 4.3 Normalised Discounted Cumulative Gain (nDCG)

これだけちょっと毛色変わりまして、nDCGはいわゆるグレード型ラベル—つまり段階的な「関係強さ」を柔軟に扱えます。(例えば超有用→まあまあ→微妙...等々)

#### ステップ1: DCG@k の計算

割引累積利得:まずこの式

DCG@k = Σ [(2^relᵢ − 1) / log₂(i + 1)]

where,
relᵢ = ランクi番目ドキュメントへの関係スコア
i = 順位番号

※ 下位ほどlog補正で価値減少=あんまり下だと貢献度小。

#### ステップ2:正規化

続いて nDCG@k は理想的ソート時(IDCG)との比率計算します:

nDCG@k = DCG@k ÷ IDCG@k

where,
IDCG@k: 「最適ソート」(一番関係強いやつから順…)
> nDCGならトップ配置重要性も加味しつつ、その後ろも多少スコア反映できたりします。一括バランス系と言えそうかなぁと思います。

---

【まとめ】

> _**MAP:**_ クエリいっぱい×全順位検証による平準化された精度。「幅広&総合配置センス」が光ります。
>
> _**MRR:**_ 初ヒット速度一本勝負型。「即レス」に向いてて人気高め。
>
> _**nDCG:**_ 段階ラベル×ランキング両対応。「めっちゃ有用ものほど上/次点以降もちょびっと点付与」な便利設計です。

## 結論

こんな感じで、この章ではレトリーバー系システム内核ロジック―主なアルゴ構造・典型的採点方法、それぞれリアル運用型メトリックまで順々追いました。この流れをベースとして第II部へ進もうかな、と。そちらでは **RAG 応用編(Application Theory of RAG)** ―要するになんとなく実装組立時パーツ連携手法とか品質&効率や実際利用可能性へのインパクト分析など扱う予定なので、お楽しみに~。

Related to this topic:

Comments