検索の結果を、別の基準でもう一度並べ直す工程があります。粗く取った候補を、より丁寧な基準で見直す形です。
実際にやってみたところ、nDCGが77.5%から69.8%に下がりました。並べ直せば良くなる、とは限りません。
BM25で粗く取ってから語の近さで並べ直しました。nDCG@3は77.5%から69.8%に下がり、適合率は変わりません。
リランキングが常に効くのかを、実際に並べ直して測りました。用意したのは文書13件と問い5件で、BM25で上位6件を取ってから並べ直しています。
並べ直しは本当に実行しています。ただし基準は語の近さで、実際の製品が使う仕組みとは別物です。
// BM25は語の位置を見ないので、そこを補う基準にしてみた
function proximityScore(docText, qs) {
const qw = [...new Set(bigrams(qs))].filter((w) => docText.includes(w));
if (qw.length < 2) return qw.length;
const pos = qw.map((w) => docText.indexOf(w)).sort((a, b) => a - b);
const span = pos[pos.length - 1] - pos[0] + 2;
// 語がそろっているほど高く、離れているほど低い
return qw.length + qw.length / span;
}
問い 並べ直し前 並べ直し後 nDCG前 nDCG後
宿泊費の上限は 1,5,12 1,12,5 100% 92%
日帰りの日当 3,9,12 3,9,12 100% 100%
前払の申請期限 12,4,6 12,4,6 63% 63%
備品の購入 12,7,0 12,7,0 63% 63%
報告書の提出期限 11,9,12 12,9,11 61% 31%
平均 nDCG@3 前: 77.5% → 後: 69.8%
適合率@3 前: 46.7% → 後: 46.7%
最後の行が大きく落ちています。「報告書の提出期限」で61%から31%。正解の11番が1位から3位に押し下げられました。
代わりに1位になったのは12番、あらゆる語を少しずつ含む長い総則です。語の近さという基準では、総則のほうが高く出ました。
総則には「報告書の提出」という並びがそのまま入っています。語としては近い。ところが期限は書かれていません。基準が捉えたかった「関連の深さ」とはずれています。
適合率@3は46.7%のまま変わりませんでした。上位3件に入る顔ぶれは同じで、順番だけが入れ替わったためです。
順位を見る指標では下がり、件数を見る指標では変わらない。片方だけを見ていると、この劣化に気づけません。指標の違いはnDCGの記事で扱っています。
もうひとつ押さえておきたいのが、並べ直しの守備範囲です。粗く取った件数が、直せる範囲の上限になります。
上位6件を取ったなら、7位以下にある正解は絶対に上がってきません。取りこぼしは並べ直しでは直りません。
基準が合わなければ、並べ直しは順位を下げる工程になる。
This technique makes sense on a small top-k result set, as one of the final steps in a pipeline.原文Elastic Docs「Semantic reranking」 この内容の有効期限2027-02-18
検索で粗く絞った候補を、より丁寧な基準で並べ直します。全件には掛けられない基準を、少数にだけ掛ける形です。
リランキングは、検索で取った候補を、別の基準でもう一度並べ直す工程です。検索の後段に置きます。
丁寧な基準は重いためです。全件に掛けると時間がかかりすぎるので、粗い基準で少数に絞ってから掛けます。
Elasticの説明でも、この手法は小さな上位の結果集合に対して意味があり、処理の流れの最後のほうの段として使うとされています。
実際の製品では、問いと文書を同時に読む仕組みが使われます。同じ文書では、問いと文書の両方を同時に処理するので関連度をよりよく推し量れ、並べ直す役として有効になると説明されています。
検索の段では、文書を先に処理して数値にしてあります。問いを見ながら文書を読み直すことはできません。そこが並べ直しの段との違いです。
検索の直後に置きます。語の検索と意味の検索を混ぜている場合は、混ぜた後の一覧に対して掛けるのが素直です。混ぜ方はハイブリッド検索の記事で扱っています。
実装してみて痛感したのは、並べ直しの前の順位を保存しておかないと、良し悪しを判定できないということでした。入れた後の数字だけを見ても、上がったのか下がったのか分かりません。前の節の77.5%も、並べ直す前に測っておいたから比べられます。
Because a cross-encoder model simultaneously processes both query and document texts, it can better infer their relevance, making it more effective as a reranker than a bi-encoder.原文Elastic Docs「Semantic reranking」 この内容の有効期限2027-02-18
入れれば良くなると思い込むことです。基準が合わなければ、前の節のように下がります。
リランキングは工程が増えるぶん、入れたこと自体が改善だと思われがちです。前の節の結果は、そうではないことを示しています。
下がったことに気づけるかどうかが分かれ目です。適合率だけを見ていれば、46.7%のまま変わらないので何も起きていないように見えます。
利用者から見ると、上位3件の1位と3位が入れ替わっただけです。苦情になるほどではないが、確実に使いにくくなっているという状態になります。
並べ直しには計算が要ります。問いと文書を同時に読む仕組みを使うなら、候補の件数だけ処理を回すことになります。
6件なら6回、20件なら20回です。応答時間にそのまま乗るので、粗く取る件数を増やすほど遅くなります。
3番目が改善につながります。前の節でも、上がってきたのが長い総則だと分かったので、基準の問題だと判断できました。
入れた後の数字だけでは、上がったか下がったか分からない。
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る