query-adaptive-weight-ja

ハイブリッド検索を行う際に、キーワード検索 (BM25) と密ベクトル検索のスコアへ、それぞれどのような重みを付けるべきかを、日本語の検索クエリから予測するモデルです。

"MDR-EX255"                     → キーワード 0.78 : ベクトル 0.22
"汁物を入れても漏れないタッパー"   → キーワード 0.33 : ベクトル 0.67

ハイブリッド検索のスコア重みを、固定値からクエリ単位の可変値に変えるために使います。重みを 1 つの値に固定すると、性質の異なるクエリのどちらかが必ず不利になります。「MDR-EX255」のような型番は文字列の一致が決め手になり、「汁物を入れても漏れないタッパー」のように用途を説明する文では、同じ語が文書に書かれている保証がありません。

入力は検索クエリの文字列だけです。意味を表す埋め込みは使わず、文字種の割合や語の珍しさなど 22 個の数値から判断するため、パラメータは 6,145 個しかありません。

クエリに応じて検索の手掛かりの重みを学ぶ Multi-Field Adaptive Retrieval の考え方をベースに、キーワード検索と密ベクトル検索の 2 つのスコアへの重み付けに絞って作りました。

使い方

from transformers import AutoModel

model = AutoModel.from_pretrained("mahiyama/query-adaptive-weight-ja", trust_remote_code=True)

for row in model.predict(["MDR-EX255", "汁物を入れても漏れないタッパー"]):
    print(row)
# {'query': 'MDR-EX255', 'w_bm25': 0.7763, 'w_dense': 0.2237}
# {'query': '汁物を入れても漏れないタッパー', 'w_bm25': 0.3316, 'w_dense': 0.6684}

出力される w_bm25 はキーワード検索側の重み、w_dense は 1 − w_bm25 です。 両方式のスコアを同じ範囲へそろえたうえで、この比率で足し合わせて並べ替えます。 スコアの合成を自分で行える検索エンジンやアプリであれば、実装は問いません。

代表的な出力

クエリ 種類 w_bm25 w_dense
MDR-EX255 型番 0.7763 0.2237
B082J5ZMQ7 商品 ID 0.8240 0.1760
ソニー ブランド 0.7615 0.2385
ユ・スンホ 固有名詞 0.8902 0.1098
汁物を入れても漏れないタッパー 用途の説明 0.3316 0.6684
ゆったりと座れるやつ 曖昧な表現 0.2468 0.7532

型番・商品 ID・ブランド・固有名詞はキーワード側、用途の説明や曖昧な表現は密ベクトル側に振れます。

出力の意味

w_bm25 と w_dense は、次の式で各スコアに掛ける重みです。

融合スコア = w_bm25 x キーワード検索のスコア + w_dense x 密ベクトル検索のスコア

したがって w_bm25 = 0.8 は「キーワード検索が 80 パーセント正しい」という意味ではありません。 キーワード検索のスコアを 0.8 倍、密ベクトル検索のスコアを 0.2 倍して足す、というだけです。 重みが同じでも、掛ける相手のスコアの作り方 (正規化の方法や候補の取り方) が変われば、検索結果への影響は変わります。

モデルの構成

表層特徴 22 次元 (学習集合の平均・標準偏差で標準化)
  → 全結合層 (22 → 256) → GELU → Dropout 0.1 (学習時のみ)
  → 全結合層 (256 → 1) → sigmoid
  → w_bm25

学習対象のパラメータは 6,145 個です。内訳は 22 × 256 + 256 + 256 + 1 です。

22 個の表層特徴

順序は config.json の feature_names に固定されています。

# 特徴名 内容
1 n_chars 正規化後の文字数
2 n_tokens トークン数
3 n_spaces 空白文字数
4 ratio_ascii_alpha ASCII 英字の比率
5 ratio_digit 数字の比率
6 ratio_hiragana ひらがなの比率
7 ratio_katakana カタカナの比率
8 ratio_kanji 漢字の比率
9 ratio_symbol 空白を除く、上記以外の文字の比率
10 is_all_ascii 全文字が ASCII なら 1
11 has_hyphen ASCII ハイフンがあれば 1
12 longest_alnum_run 連続する ASCII 英数字の最長長さ
13 n_identifier_like 単位や寸法を除いた型番候補の数
14 n_particles 助詞文字「のをにがでとはへも」の出現数
15 ends_with_colloquial 指定した口語表現で終われば 1
16 idf_max トークン IDF の最大値
17 idf_mean トークン IDF の平均値
18 idf_min トークン IDF の最小値
19 idf_sum トークン IDF の合計
20 frac_oov 文書頻度が 0 のトークン比率
21 frac_rare 文書頻度が 5 以下のトークン比率
22 frac_common 文書頻度が 10,000 以上のトークン比率

IDF は Amazon ESCI 日本語部分の商品 339,059 件のタイトルから作った表を同梱しており、209,828 トークンを収録しています。計算式は Lucene BM25 と同じ ln(1 + (N − df + 0.5) / (df + 0.5)) で、未知語は文書頻度 0 として扱います。

推論時の処理

  1. NFKC 正規化と空白の正規化
  2. fugashi と unidic-lite でトークン化
  3. 22 次元の表層特徴を計算
  4. config.json の平均・標準偏差で標準化
  5. 多層パーセプトロンで w_bm25 を出力

ニューラルネットワークによる文章の埋め込みは発生しません。必要なのは形態素解析と IDF 表の参照だけです。

学習データと方法

Amazon ESCI の日本語部分 (商品 339,059 件) を題材に、8 種類のクエリ 301,241 件を用意しました。型番・商品 ID・ブランド・固有名詞は商品情報に実在する文字列から作り、用途の説明・言い換え・曖昧な表現は Qwen3.5-27B で生成しています。学習には 259,197 件、条件選択に 13,027 件、評価に 29,017 件を使いました。

教師信号は、クエリごとに重みを 0 から 1 まで 0.05 刻みの 21 点へ振って測った MRR@10 の曲線です。モデルが出した重みの位置で曲線を区分線形補間し、その値を最大化します。曲線が平らで方向を学べないクエリにだけ、種類から期待される方向 (識別子系は 0.8、用途の説明などは 0.2) へ寄せる補助損失を加えています。補助損失の効き具合は曲線の平らさで調整するため、検索品質に影響しない範囲でのみ方向が明瞭になります。

最適化は AdamW、weight decay 1e-4、バッチ 256、40 エポックです。

評価

8 種類を各 300 件ずつ集めた 2,400 件について、実際に検索して測った結果です。検索エンジンは Elasticsearch を使い、両方式の上位 100 件をそれぞれ最小最大正規化してから重み付きで合成しました。

条件 MRR@10 Recall@10
キーワード検索のみ 0.7247 0.5574
ベクトル検索のみ 0.5293 0.3467
等重み (w = 0.50) 0.7761 0.6187
このモデル 0.8461 0.6501
クエリごとに最良の重みを選んだ場合 0.8733 0.6313

等重みに対して +0.0700 です。等重みからクエリごとの最良までの改善余地のうち、72.0 パーセントを回収しています。

種類別

MRR@10 に加えて、モデルが出した w_bm25 の平均も並べています。 0.5 より大きければキーワード検索寄り、小さければ密ベクトル検索寄りに判断したことを示します。

種類 等重みの MRR@10 このモデルの MRR@10 平均 w_bm25
商品 ID 0.779 1.000 0.813
型番 0.774 0.894 0.808
ブランド 0.844 0.926 0.740
固有名詞 0.878 0.917 0.611
実際の検索語 0.614 0.615 0.511
言い換え 0.768 0.800 0.335
用途の説明 0.823 0.865 0.325
曖昧な表現 0.728 0.751 0.315

8 種類すべてで等重みを上回りました。改善が大きいのは商品 ID (+0.221)、型番 (+0.120)、ブランド (+0.082) です。

平均 w_bm25 は、商品 ID や型番の 0.81 から曖昧な表現の 0.32 まで単調に下がります。方向を指示していない実際の検索語が、ちょうど中間の 0.51 に落ち着いています。

制限

  • 評価集合は 8 種類を均等にした構成であり、実際の検索語の分布を再現したものではありません。実際の検索で商品 ID の直接入力が少なければ、その大きな改善が全体平均へ与える影響も小さくなります。均等評価に含まれる実際の検索語 300 件での改善は +0.001 でした。
  • トークン化について、学習時の特徴量は検索索引の kuromoji (Elasticsearch の日本語解析器) で作りました。この配布版は検索エンジンへの接続なしで動かすため、fugashi と unidic-lite で近似しています。8 種類から各 25 件を取った 200 件で両者を比べると、w_bm25 の平均絶対差は 0.025、83.5 パーセントが 0.05 以内に収まり、0.5 の境界を跨いで向きが変わったのは 9 件でした。差が出るのは日本語の文で、kuromoji が助詞を除去し基本形へそろえるためです (「入れ」→「入れる」、「タッパー」→「タッパ」)。商品 ID と型番は分割が一致するため差が出ません (平均絶対差 0.000000 と 0.000248)。もっとも影響が大きいのは固有名詞で、平均絶対差 0.056、向きが変わったのは 25 件中 4 件でした。
  • 評価に使った正解の一部は大規模言語モデルによる関連性判定で、すべてを人が確認したものではありません。また本モデルは商品検索のデータだけで学習・評価しており、他分野への適用は確認していません。

参考文献

Downloads last month
23
Safetensors
Model size
6.15k params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Paper for mahiyama/query-adaptive-weight-ja