A Day in the Life

情報検索のための質問文作成モデル query-crafter-japanese を公開

情報検索で利用する、ベクトル検索・リランカーなどのニューラルネットワークモデルの学習には、質問文と回答文がペアで必要です。回答文章はなんでも良い(もちろん質が高い文章や、独自ドメインのデータなどが高品質なモデル作成につながるのですが)のですが、学習にはその回答に関連がある質問文が必要になってきます。最近のLLMの性能向上はめざましく、回答文からLLMを通して自動作成した質問文を作成することで、そのペアを学習に利用することができます。これらのLLMが自動作成するデータセットは、合成データセットとも呼ばれています。

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

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


query-crafter-japanese-desc


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

  • keywords: スペース区切りのキーワード
  • synonym_keywords: 類義語をもちいた特徴的なキーワード
  • query: 文章の内容に基づいた質問文
  • alt_query: BM25でマッチしない表現を使った質問文
  • title: 文章全体を表現するタイトル
  • faq: 文章をFAQの回答とした場合の質問文
  • summary: 文章の短い要約

では、以下の文章を用いて、各々のカテゴリーに対する質問文を作成してみましょう。

夕方、開発合宿の成果発表会。私以外は、AI関連のちゃんとしたテーマに取り組んで、クオリティも高く、いやー面白い。I氏はエンジニアでもないのに、Figmaプラグインを作ったり、vercelにデプロイしてたり(ほぼcursorが書いた)して、AIによって大きく幅が広がる一例を間近に見る。私は何かのテーマに取り組んだわけではなく、Vibe Cording を一度もしたことがなかったので、cursor でコードをいかに触らず・見ずに作れるかを試した。

毎年のこの日記を要約してdiscordなどに投稿するツール(以前も作ったものの仕様を書いて新機能などを追加)を作成したり、この日記のタイトルがないものに自動でタイトルをつけたりするツールを作成する。Vibe Cording は思った通りの感じで、なるほど便利。

コードは見ずにブラックボックス的な開発(出力成果物だけをみる)をしたので、出来上がったコードを後で見ると本番運用前提のコードでは全くないが、書き殴りのツールを作るには十分。また自分が指示するのは仕様のみで、仕様書も随時アップデートされるようにしてるので、機能を変えたくなったら仕様変更・追加するだけでいいし、楽で良いね。

query-crafter-japanese-Qwen3-1.7B を用いてカテゴリーごとに質問文を生成した結果はこちらです。keywords, query, title, summary あたりは特色が分かりやすく出ていますが、synonym_keywords は完璧な類義語でないことも多かったり、alt_query, faq は query とそれほど変わらなかったりすることもあります。

keywords: Vibe Cording ブラックボックス開発 仕様変更
synonym_keywords: AI活用開発プロジェクト 発表会 仕様変更追加
query: 開発合宿で作成したツールの具体的な機能は?
alt_query: 開発者向けツール開発でコード見ない開発手法の利点は?
title: AI活用で拓く開発の新領域:Vibe Cordingとブラックボックス開発の可能性
faq: 開発合宿で実現した新機能や成果は?
summary: AI活用の開発成果発表会で、Vibe Cordingや日記ツール開発、コード見ずに開発を実施

また動作速度も vllm + RTX5090 環境で、入力トークンが 48,000 toks/s、出力トークンが 2200 toks/s で動作します。〜1000文字程度の文章1万件から質問文1万件を生成した場合、100秒弱で作成できます。対象文章が1億件あったとしても、約140時間程度で全てを処理することができます。

なお、DeepSeek-R1 を夜間ディスカウント時間帯(input: 1M toks 0.135USD, output: 1M toks 0.55USD)で実際に10万件の文章を並列100のAPIリクエストで処理した場合、約7時間と40USD程度の費用がかかりました。もし、DeepSeek-R1 APIで1億件を処理した場合、約7,000時間(実際には夜間ディスカウント時間を狙うと、そのタイミングでしか処理できないので、もっと時間がかかります。また並列リクエストの最大数はDeepSeekサイドのリソースによって変動します)と、40,000USDほどの費用が発生するでしょう。

このように、query-crafter は、特に大量の文章から質問文を作成したい場合、処理速度的にも費用的にも大きなメリットがあります。

query-crafter-japanese モデルの学習

学習には、出力結果利用に制限がない DeepSeek-R1 を使い fineweb-2-edu-japaneseのデータをもとに、質問文となる教師データを、合成データセットとして作成しました。

例えば title については '文章全体をうまく表現した、タイトルを考え作成しなさい。考えたタイトルは30文字以内で出力すること。出力は厳密な JSON 形式で {"query": "タイトル"} とする。他に一切余計な出力はしないこと。' といった指示文を用いて作成しています。

続いてこのデータを教師データとし、SFT(Supervised Fine-tuning)で、Qwen3-4B, Qwen3-1.7B, sarashina2.2-3b-instruct-v0.1, TinySwallow-1.5B-Instruct を学習させました。

SFT時に使ったフォーマットはシンプルに

{
  "system": "{category名}",
  "user": "{text}",
  "assistant": "{query}",
}

といった内容です。systemプロンプトに title などの指示カテゴリを、user 入力文に文章テキストを、そしてmodelの出力に query を設定しています。何かの用途に特化したSFTの場合、冗長なプロンプトを書く必要はなく、短い指示(今回は各種カテゴリー)のみで、うまく学習できます。

query-crafter-japanese モデルの評価

query-crafter の評価は、japanese-query-crafter-reasoning-80k の testデータを用いました。このデータのtextを元に、各種SFTで学習させたquery-crafterモデルを使って質問文を作成します。

そしてこれらの質問文とテキストをペアに、リランカーBAAI/bge-reranker-v2-m3で評価させたスコアの結果が以下です。このリランカーは、文章とテキストの関連性が高いと1.0になり、関連性がないと0.0となります。そのため、質問文とテキストが関連しているかどうかの目安になります。

モデル 平均 標準偏差
query-crafter-jp-Qwen3-1.7B 0.8701 0.2592
query-crafter-jp-Qwen3-4B 0.8712 0.2652
query-crafter-jp-TinySwallow-1.5B 0.7526 0.3611
query-crafter-jp-sarashina2.2-3b 0.8670 0.2646
deepseek-r1 0.8507 0.2875

パーセンタイルをプロットしたグラフは以下です。

query-crafter-jp-percentile

結果、TinySwallow-1.5B 以外は、ほとんどのケースでDeepSeek-R1以上のスコアとなりました。特に、Qwen3-1.7B は日本語に特化しているわけではないマルチリンガルモデルですが、SFTするとQwen3-4Bとほとんどスコアが変わらず、性能の高さは驚くべきものです。そのため、特にこだわりがなければ、query-crafter-japanese-Qwen3-1.7B を利用するとよいでしょう。

なお、DeepSeek-R1 他よりスコアが低いからといって必ずしもDeepSeek-R1の質問文の質が悪いというわけではなく、リランカーでも判別が難しいような「正しく難しい質問文」を作成しているケースもあります。TinySwallow-1.5B はちょこちょこ全く関連がない質問文を作成してしまうケースがあり、他のモデルよりスコアが低くなりました。TinySwallow-1.5B-Instruct は TAID でモデル蒸留されているため、その後の SFT には不向きなのかもしれません。

おわりに

大量の質問文章を作りたい場合において、速度的にも費用的にも大きなメリットがある、query-crafter-japanese モデルを作成し公開しました。高性能かつ出力結果に制限がない DeepSeek-R1 の登場以降、様々な方法でデータセットの作成・公開・それを教師データとして利用したモデルの作成がしやすくなりました。また、Qwen などの小型サイズのモデルといった、ライセンスが使いやすいオープンウェイトなLLMの登場・性能進化により、ファインチューンした用途特化の小型モデルも作成・公開しやすくなり、幅広い応用が可能になってきたことを実感しています。もし半年前なら、このモデルを個人で作成することはリソース的にも不可能だったでしょう。

このモデルが、質問文を作りたい方の助けになれば幸いです。

記事の一覧 >

関連するかもエントリー

日本語最高性能のRerankerをリリース / そもそも Reranker とは?
💡 新しいバージョンはこちら👉 とても小さく速く実用的な日本語リランカー japanese-reranker-tiny と xsmall v2 を公開日本語に特化した形で学習されたRerankerがほとんど無かったので、日本語を適切に学習させた Reranker ファミリーを...
💡 新しいバージョンはこちら👉 とても小さく速く実用的な日本語リランカー japanese-reranker-tiny と xsmall...
100倍速で実用的な文章ベクトルを作れる、日本語 StaticEmbedding モデルを公開
文章の密ベクトルは、情報検索・文章判別・類似文章抽出など、さまざまな用途に使うことができます。しかしながら最先端のTransformerモデルは小さいモデルでも、とりわけCPU環境では処理速度が遅いため実用でないこともしばしばあります。この課題を解決する新しいアプローチとして、先...
文章の密ベクトルは、情報検索・文章判別・類似文章抽出など、さまざまな用途に使うことができます。しかしながら最先端のTransformerモデ...