amagasaki-qna-embedding-0.6B
Qwen/Qwen3-Embedding-0.6B をベースに、
- 日本語汎用検索能力の底上げ
- 行政 FAQ ドメインへの適応
- 尼崎市 Q&A コーパスへの特化
の 3 段階で fine-tune した、尼崎市 Q&A コーパスに特化した日本語 embedding モデルです。
評価コーパスと Phase 3 の学習コーパスが同一 (queries 側だけ LLM で合成) なので、本モデルは
「尼崎市 Q&A 検索における到達上限性能」を測ることを主目的としており、未知ドメインへの
汎化を保証するものではありません。
モデル概要
| 項目 | 値 |
|---|
| ベースモデル | Qwen/Qwen3-Embedding-0.6B |
| アーキテクチャ | Qwen3 (decoder-only, last-token pooling + L2 normalize) |
| パラメータ数 | 約 596M (0.6B) |
| 隠れ次元 | 1,024 |
| レイヤー数 | 28 |
| アテンションヘッド | 16 (KV ヘッド 8、GQA) |
| 中間次元 | 3,072 |
| 語彙サイズ | 151,669 |
| 最大入力長 (学習時) | 512 トークン |
| 最大入力長 (モデル仕様上) | 32,768 トークン |
| 出力次元 | 1,024 |
| 精度 | bfloat16 |
訓練方法 (3 段階チェーン)
Qwen/Qwen3-Embedding-0.6B を起点に、Phase 1 → Phase 2 → Phase 3 の順に重みを引き継いで
学習しました。各 Phase の最良サブサイクルだけを選抜して次 Phase の起点に使っています。
共通の学習設定
| key | value |
|---|
| loss | CachedMultipleNegativesRankingLoss (scale=20.0, mini_batch_size=8) |
| precision | bf16 |
| max_seq_length | 512 |
| eval_dataset | 尼崎市 Q&A (queries: 749, corpus: 1,786) |
| metric_for_best_model | eval_cosine_recall@10 |
| seed | 42 |
| gradient_checkpointing | true |
LoRA を使う Phase は q_proj / k_proj / v_proj / o_proj / gate_proj / up_proj / down_proj
(全 attention + MLP) を target_modules に指定し、merge_and_unload() でベース重みに統合
してから次 Phase に引き渡しています。
Phase 1: 汎用日本語化 (Full Fine-Tuning)
日本語 Wikipedia 由来の合成 QA を大量に与え、ベースモデルを日本語の dense retrieval 向けに
底上げするステージ。
| key | value |
|---|
| 起点モデル | Qwen/Qwen3-Embedding-0.6B |
| 学習データ | 日本語 Wikipedia 記事から自動合成した query–positive–negative の n-tuples (50 万件サブサンプル) |
| 学習方式 | Full Fine-Tuning |
| epochs | 1 |
| batch_size | 64 |
| learning_rate | 5e-6 |
| warmup_ratio | 0.03 |
| evals_per_epoch | 10 |
学習率は 5e-6 / 1e-5 / 2e-5 の HP 探索で cosine_recall@10 最良の 5e-6 を採用。
Phase 2: 行政 FAQ 適応 (LoRA)
汎用的な日本語の行政 FAQ コーパスでドメイン適応するステージ。Phase 1 の Full FT 済み
モデルを起点に LoRA を被せます。
| key | value |
|---|
| 起点モデル | Phase 1 出力 |
| 学習データ | 日本語の汎用行政 FAQ から構築した triplet (anchor / positive / negative) データ |
| 学習方式 | LoRA (r=16, α=32, dropout=0.1, bias=none) |
| epochs | 2 |
| batch_size | 64 |
| learning_rate | 1e-4 |
| warmup_ratio | 0.05 |
| evals_per_epoch | 16 |
学習率は 5e-5 / 1e-4 / 2e-4 の HP 探索で cosine_recall@10 最良の 1e-4 を採用。
学習後 merge_and_unload() でベースに統合して保存。
Phase 3: 尼崎市 Q&A 特化 (LoRA)
尼崎市 Q&A コーパス上で LLM 合成した query を含む n-tuples を用い、対象コーパスへ
特化させるステージ。Phase 2 出力を起点に再び LoRA を被せます。
| key | value |
|---|
| 起点モデル | Phase 2 出力 |
| 学習データ | 尼崎市 Q&A コーパスを母集団に LLM で合成した query を持つ n-tuples |
| 学習方式 | LoRA (r=16, α=32, dropout=0.1, bias=none) |
| epochs | 2 |
| batch_size | 64 |
| learning_rate | 2e-4 (最良サブサイクル) |
| warmup_ratio | 0.05 |
| evals_per_epoch | 16 |
学習率 5e-5 / 1e-4 / 2e-4 と epoch 1 / 2 の HP 探索を行い、cosine_recall@10 最良の
lr=2e-4, epochs=2 のサブサイクルを本モデルとして公開しています。
評価との関係について: 評価コーパス (corpus.json, 1,786 件) と Phase 3 の学習データの
コーパスは同一の尼崎市 Q&A 文書集合です。Phase 3 の query は LLM が合成したもので評価
query と直接は重複しませんが、本モデルの数値は同一コーパス内検索の上限性能として
解釈してください。ドメイン外汎化を測りたい場合は Phase 1 / Phase 2 出力モデルの利用を
推奨します。
評価メトリクス (尼崎市 Q&A データセット)
sentence_transformers の InformationRetrievalEvaluator で測定 (queries: 749,
corpus: 1,786, qrels: 1,817 ペア, graded relevance 1-2)。主指標は cosine_recall@10。
本モデル (Phase 3 最良サブサイクル)
| metric | value |
|---|
| cosine_recall@1 | 0.3146 |
| cosine_recall@3 | 0.5277 |
| cosine_recall@5 | 0.6266 |
| cosine_recall@10 | 0.7704 |
| cosine_ndcg@10 | 0.6366 |
| cosine_mrr@10 | 0.6791 |
| cosine_map@100 | 0.5619 |
| cosine_accuracy@1 | 0.5714 |
| cosine_accuracy@10 | 0.9012 |
Phase ごとの recall@10 推移
| stage | cosine_recall@10 |
|---|
| Phase 1 出力 | 0.6407 |
| Phase 2 出力 | 0.6994 |
| Phase 3 出力 (本モデル) | 0.7704 |
Phase 3 サブサイクル別 (参考)
| サブサイクル | learning_rate | epochs | cosine_recall@10 |
|---|
| 採用サブサイクル | 2e-4 | 2 | 0.7704 |
| 候補 A | 1e-4 | 1 | 0.7683 |
| 候補 B | 1e-4 | 2 | 0.7632 |
| 候補 C | 5e-5 | 2 | 0.7529 |
使い方
1from sentence_transformers import SentenceTransformer
2from sentence_transformers.util import cos_sim
3import torch
4
5model = SentenceTransformer(
6 "mahiyama/amagasaki-qna-embedding-0.6B",
7 model_kwargs={"torch_dtype": torch.bfloat16},
8)
9model.max_seq_length = 512
10
11queries = ["国民年金の免除申請をしたいのですが、申請に必要な持ち物は何を持っていけば良いですか?"]
12documents = [
13 "Question: 国民年金の免除申請に必要な持ち物は?\nAnswer: 年金手帳または基礎年金番号通知書、本人確認書類、印鑑などをお持ちください。",
14 "Question: 住民票の写しを取得する方法は?\nAnswer: 市役所窓口またはコンビニ交付サービスでご取得いただけます。",
15]
16
17q_emb = model.encode(queries, convert_to_tensor=True)
18d_emb = model.encode(documents, convert_to_tensor=True)
19print(cos_sim(q_emb, d_emb))
想定用途と限界
想定用途は、尼崎市 Q&A のような自治体 FAQ コーパスにおける質問から該当 QA ドキュメント
への検索 (Question: ... / Answer: ... 形式の文書を corpus とする dense retrieval) です。
限界として、評価コーパスと Phase 3 の学習コーパスが同一であるため、他の自治体・他ドメインの
FAQ に対する汎化は保証されません。汎用用途には Phase 1 / Phase 2 段階で止めたモデルの
利用が望ましい場合があります。また学習時 max_seq_length=512 で動かしているため、
極端に長い文書では性能が落ちる可能性があります (モデル自体は最大 32,768 トークンまで
扱えます)。
ライセンス
Apache License 2.0 (ベースモデル Qwen/Qwen3-Embedding-0.6B のライセンスを継承)