「宿泊費」と書かれた規程を「ホテル代」で探すと、語が一致しないので当たりません。利用者は規程の言葉づかいを知らないまま聞いてきます。
言い換えで聞いた5問で測ったところ、語の検索だけの適合率は40.0%でした。「レポートの提出期限」に至っては0%です。
言い換えで聞いた5問で実際に測りました。語の検索だけは40.0%、補うと53.3%、混ぜても53.3%です。
ハイブリッド検索が何を救うのかを、言い換えで聞いた問いで測りました。用意したのは文書中の語と違う言葉で聞いた問い5件です。
検索は本当に実行しています。ただし意味の近さは同義語の辞書で模しており、埋め込みによる検索ではありません。語が違っても当たる仕組みを置いた形です。
function rrf(listA, listB, k = 60) {
// 順位の逆数を足して混ぜる(Reciprocal Rank Fusion)
const score = new Map();
listA.forEach((x, r) => score.set(x.i, (score.get(x.i) || 0) + 1 / (k + r + 1)));
listB.forEach((x, r) => score.set(x.i, (score.get(x.i) || 0) + 1 / (k + r + 1)));
return [...score.entries()].map(([i, s]) => ({ i, s })).sort((a, b) => b.s - a.s);
}
問い 語の検索だけ 言い換えを補う 両方を混ぜる ホテル代の限度額 33% 67% 67% 出張手当は日帰りだと 67% 67% 67% 仮払の申請 67% 67% 67% 消耗品の購入 33% 33% 33% レポートの提出期限 0% 33% 33% 上位3件の適合率 語の検索だけ: 40.0% 言い換えを補う: 53.3% 両方を混ぜる: 53.3% 元の語で聞いた場合(比較) 語の検索だけ: 46.7%
最後の行が0%です。「レポートの提出期限」で聞くと、上位3件に正解が1件も入りません。文書には「報告書」と書いてあるためです。
比較のために、元の語で聞いた場合も測りました。46.7%が40.0%に落ちています。
利用者は文書の言葉づかいを知りません。「宿泊費」と書いてあっても「ホテル代」と聞きます。この落ち込みは、実運用では常に起きています。
言い換えを補うと53.3%まで戻りました。0%だった問いも33%になっています。語が一致するようにしてやれば、あとは同じ計算で当たります。
実際の構成では、この役割を意味の近さで探す仕組みが担います。埋め込みの検索が、言い換えを吸収する形です。
正直に書いておくと、混ぜる方式も53.3%で、補う方式と同じでした。この規模では差が出ていません。
混ぜる価値が出るのは、片方が外した問いをもう片方が拾う場面です。今回は補う側が一貫して強かったので、混ぜても順位が変わりませんでした。
利用者は文書の言葉づかいを知らない。そこが落ちる。
Reciprocal rank fusion (RRF) is a method for combining multiple result sets with different relevance indicators into a single result set.原文Elasticsearch Reference「Reciprocal rank fusion」 この内容の有効期限2027-02-18
性質の違う検索を2つ以上走らせ、結果をまとめます。語で当てる仕組みと、意味で当てる仕組みが典型です。
ハイブリッド検索は、性質の違う検索を複数走らせて、結果を1つにまとめる方式です。語で当てる検索と、意味で当てる検索を組み合わせる形が典型になります。
組み合わせる理由は、それぞれ当てられる問いが違うためです。語の検索は型番や固有名詞に強く、意味の検索は言い換えに強くなります。
前の節では、言い換えの問いで語の検索が0%になりました。逆に、型番のような珍しい語では語の検索のほうが確実です。
問題は、点数の尺度が違うことです。語の検索の点と、意味の検索の点は、そのまま足せません。
そこで順位を使います。Elasticsearchはこれを、関連度の指標が違う複数の結果を1つにまとめる方法だと説明しました。調整が要らず、指標どうしが関係している必要もない、という但し書きも付いています。
同じ文書では、並べ替えには最低2つの検索が必要だと明記されています。3つ以上を混ぜることもできます。
増やせば当たる範囲は広がりますが、その分だけ検索の回数も増えます。1回の問い合わせで走る検索の数を数えておいてください。
測ってみて有効だったのは、言い換えで聞いた問いだけを集めて測ることでした。全体の平均では46.7%と40.0%で、6ポイントの差にしか見えません。問いを分けると、0%の問いが1件あることが見えます。
RRF requires no tuning, and the different relevance indicators do not have to be related to each other to achieve high-quality results.原文Elasticsearch Reference「Reciprocal rank fusion」 この内容の有効期限2027-02-18
まず語の検索だけで測り、落ちている問いを特定します。混ぜるのはそのあとです。
ハイブリッド検索は組む前に、今の検索がどの問いで落ちているかを掴んでおく必要があります。落ちていないなら混ぜる意味がありません。
4番目を避けてください。最初から混ぜると、混ぜたことの効果が測れません。前の節でも、混ぜる方式は補う方式と同じ53.3%でした。
混ぜるということは、1回の問い合わせで検索を2回以上走らせるということです。応答時間も費用も、その分だけ増えます。
意味の検索を足す場合は、問いを埋め込みに変える処理も加わります。語の検索だけなら不要だった工程です。
混ぜると順位が変わります。混ぜる前にそれぞれ1位だったものが、混ぜた後に3位になることもあります。
ですから混ぜる前後の順位を並べて確かめてください。順位の評価はnDCGの記事で扱っています。
落ちている問いを掴んでから混ぜる。順序が逆だと効果が測れない。
A minimum of two child retrievers is required for ranking.原文Elasticsearch Reference「Reciprocal rank fusion」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る