Instructions to use mahiyama/query-adaptive-weight-ja with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use mahiyama/query-adaptive-weight-ja with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("feature-extraction", model="mahiyama/query-adaptive-weight-ja", trust_remote_code=True)# pip install -U transformers accelerate # Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("mahiyama/query-adaptive-weight-ja", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
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 として扱います。
推論時の処理
- NFKC 正規化と空白の正規化
- fugashi と unidic-lite でトークン化
- 22 次元の表層特徴を計算
- config.json の平均・標準偏差で標準化
- 多層パーセプトロンで 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 件でした。
- 評価に使った正解の一部は大規模言語モデルによる関連性判定で、すべてを人が確認したものではありません。また本モデルは商品検索のデータだけで学習・評価しており、他分野への適用は確認していません。
参考文献
- 手法の土台: Multi-Field Adaptive Retrieval (Li et al., ICLR 2025)
- 検索対象と実際の検索語: Amazon ESCI (Shopping Queries Dataset) の日本語部分
- Downloads last month
- 23