Closed3

情報検索のための質問文作成モデル「query-crafter-japanese」を試す

kun432kun432

https://x.com/hotchpotch/status/1919926638613049653

https://secon.dev/entry/2025/05/07/100000-query-crafter-japanese/

情報検索で利用する、ベクトル検索・リランカーなどのニューラルネットワークモデルの学習には、質問文と回答文がペアで必要です。回答文章はなんでも良い(もちろん質が高い文章や、独自ドメインのデータなどが高品質なモデル作成につながるのですが)のですが、学習にはその回答に関連がある質問文が必要になってきます。

しかし、合成データセットを作成して広く公開したい場合、OpenAIやGeminiなどの商用LLMでは、利用規約によってライセンスの問題が発生します。また、大量の文章を処理したい場合は時間・費用もかなりかかります。

そのため、1.7B〜4B という小型サイズのモデルで高速に動作しながらも、DeepSeek-R1で生成した質問文と同レベルの情報検索用の質問文(クエリ文)を自動作成でき、さらに出力ライセンスに制限がないquery-crafter-japanese モデルを作成しApache 2.0ライセンスで公開しました。

モデルは以下の2つ(記事には3つとあるが、1つは見当たらなかった)

https://huggingface.co/hotchpotch/query-crafter-japanese-Qwen3-1.7B

https://huggingface.co/hotchpotch/query-crafter-japanese-Qwen3-4B

なお、作者のhotchpotchさんのオススメは1.7Bのほうみたい( ⭐️:👆速度・性能の面でおすすめです とある)

kun432kun432

Colaboratory T4で。サンプルコードは1.7BのモデルカードとhotchpotchさんのGistにある。内容的には同じではなかろうかと思う。

https://huggingface.co/hotchpotch/query-crafter-japanese-Qwen3-1.7B

https://gist.github.com/hotchpotch/8b9c9c43e6aacc14b4b47801de063d64

モデルとトークナイザーをロード

from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "hotchpotch/query-crafter-japanese-Qwen3-1.7B"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",
    device_map="auto"
)

VRAM消費は3.4GB程度。

出力
Thu Jul 31 04:13:03 2025       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15              Driver Version: 550.54.15      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Tesla T4                       Off |   00000000:00:04.0 Off |                    0 |
| N/A   60C    P0             29W /   70W |    3404MiB /  15360MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

文章を用意。Wikipediaの以下の記事の冒頭部分を使用。

https://ja.wikipedia.org/wiki/オグリキャップ

text = """
オグリキャップ(欧字名:Oguri Cap、1985年3月27日 - 2010年7月3日)は、日本の競走馬、種牡馬。

1987年5月に岐阜県の地方競馬・笠松競馬場でデビュー。8連勝、重賞5勝を含む12戦10勝を記録した後、1988年1月に中央競馬へ移籍し、重賞12勝(うちGI4勝)を記録した。1988年度のJRA賞最優秀4歳牡馬、1989年度のJRA賞特別賞、1990年度のJRA賞最優秀5歳以上牡馬および年度代表馬。1991年、JRA顕彰馬に選出。愛称は「オグリ」「芦毛の怪物」など多数。「スーパー・スター」と評された。

中央競馬時代はスーパークリーク、イナリワンの二頭とともに「平成三強」と総称され、自身と騎手である武豊の活躍を中心として起こった第二次競馬ブーム期において、第一次競馬ブームの立役者とされるハイセイコーに比肩するとも評される高い人気を得た。その人気は競馬ファンのみならず一般の大衆にも波及し、社会現象を巻き起こした。日本競馬史上において、特に人気を博した競走馬の一頭である。

競走馬引退後は北海道新冠町の優駿スタリオンステーションで種牡馬となったが、産駒から中央競馬の重賞優勝馬を出すことができず、2007年に種牡馬を引退。種牡馬引退後は同施設で功労馬として繋養されていたが、2010年7月3日に右後肢脛骨を骨折し、安楽死の処置が執られた。
"""

推論。上記のテキストに対して、あらかじめカテゴリごとに決まっているキーワードをクエリとして投げるだけで生成される(プロンプトを考えることなく、キーワードだけで使えるように最適化されているらしい)。用意されているキーワードは以下。

query-crafter は7つのカテゴリーを生成できます。

  • keyword: スペース区切りのキーワード
  • synonym_keywords: 同義語を使用した特徴的なキーワード
  • query: 文書の内容に基づく質問
  • alt_query: BM25と一致しない表現を使用した質問
  • title: 文書全体を表すタイトル
  • faq: 文書がFAQの回答であるかのようにした質問
  • summary: 文書の簡潔な要約

サンプルコードは、上記キーワードをそれぞれクエリとして、順に出力するようになっている。

instructions = [
    "keywords",
    "synonym_keywords",
    "query",
    "alt_query",
    "title",
    "faq",
    "summary",
]

target_texts = []
for instruction in instructions:
    messages = [
        {"role": "system", "content": instruction},
        {"role": "user", "content": text},
    ]
    target_text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True,
        enable_thinking=False,
    )
    target_texts.append(target_text)

model_inputs = tokenizer.batch_encode_plus(
    target_texts, padding=True, truncation=True, return_tensors="pt"
).to(model.device)
generated_ids = model.generate(**model_inputs, max_new_tokens=256)

for i, instruction in enumerate(instructions):
    output_ids = generated_ids[i][len(model_inputs.input_ids[i]) :].tolist()
    generated_text = tokenizer.decode(output_ids, skip_special_tokens=True)
    print(f"{instruction}: {generated_text}")
出力
keywords: オグリキャップ オグリスーパークリーク ハイセイコー
synonym_keywords: 競馬史の偉大な馬 重賞優勝馬 人気の最高点
query: オグリキャップは種牡馬として何年引退した?
alt_query: オグリキャップは種牡馬引退後も功労馬として扱われた?
title: オグリキャップ「スーパー・スター」の活躍と引退
faq: オグリキャップの引退理由は?
summary: オグリキャップは重賞5勝、JRA賞受賞、人気高き種牡馬で引退後安楽死。

続きの文章でもやってみる。

text = """
オグリキャップの母・ホワイトナルビーは競走馬時代に馬主の小栗孝一が所有し、笠松競馬場の調教師鷲見昌勇が管理した。ホワイトナルビーが繁殖牝馬となった後はその産駒の競走馬はいずれも小栗が所有し、鷲見が管理していた。

1984年のホワイトナルビーの交配相手には、小栗によると当初はトウショウボーイが種付けされる予定だったが、種付け予定に空きがなかったため断念した。そこで小栗の意向により、笠松競馬で優れた種牡馬成績を残していたダンシングキャップが選ばれた[† 2]。鷲見はダンシングキャップの産駒に気性の荒い競走馬が多かったことを理由に反対したが[8]、小栗は「ダンシングキャップ産駒は絶対によく走る」という確信と、ホワイトナルビーがこれまでに出産していた5頭の産駒が大人しい性格だったため大丈夫だろうと感じ、最終的に提案が実現した。

なお、オグリキャップは仔分けの馬で、出生後に小栗が稲葉牧場に対してセリ市に出した場合の想定額を支払うことで産駒の所有権を取得する取り決めがされていた。オグリキャップについて小栗が支払った額は250万円とも500万円ともされる。
"""

結果

出力
keywords: ホワイトナルビー ダンシングキャップ オグリキャップ
synonym_keywords: 小栗孝一 母馬 生産牝馬 成績優れた種牡馬
query: ホワイトナルビーの交配相手がダンシングキャップになった理由は?
alt_query: オグリキャップの仔分け馬を取得する際の支払い額はどの程度か?
title: ホワイトナルビーとダンシングキャップの産駒、オグリキャップの母子関係
faq: ホワイトナルビーの交配相手にダンシングキャップを選んだ理由は?
summary: ホワイトナルビーは小栗孝一所有。ダンシングキャップ選出に反対した鷲見も小栗が決定。産駒の所有権はセリ市出荷で支払い。

2度ほど推論させたあとのVRAM消費は4.6GB程度

出力
Thu Jul 31 04:30:11 2025       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15              Driver Version: 550.54.15      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Tesla T4                       Off |   00000000:00:04.0 Off |                    0 |
| N/A   51C    P0             28W /   70W |    4634MiB /  15360MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
kun432kun432

ブログ記事では推論パフォーマンスやモデル評価についても書かれている。Colaboratoryだとそれほど速いとは感じない(1キーワードあたりだいたい2〜3秒程度)ので、ぜひローカルで試してみたいところ。

また、学習時のデータセットについても書かれているので、興味があれば確認してみるとよい。

このスクラップは2ヶ月前にクローズされました