Views
No views yet
whybe-choi/Qwen3-VL-Embedding-2B-ko-vdr-preview-v0.2
(a Qwen3-VL-Embedding-2B contrastively fine-tuned on Ko-VDR) and further trains it by
listwise KL knowledge distillation from the Qwen3-VL-Reranker-8B cross-encoder
teacher — transferring the reranker's graded relevance (instead of binary labels) into
the 2B bi-encoder, which sharpens top-rank ordering.Qwen/Qwen3-VL-Reranker-8B — scored {gold ∪ 128 mined candidates} (log-odds) for the 146,687 queries of NomaDamas/ko-vdr-train-public-v2.0.KL( softmax(teacher/τ) ‖ softmax(student/τ) ), τ = 1.0.
softmax(20 · cosine).| metric | baseline (v0.2) | distilled (this model) |
|---|---|---|
| NDCG@10 | 0.7629 | 0.7718 |
| MRR@10 | 0.8319 | 0.8775 |
| Recall@100 | 0.9809 | 0.9778 |
1processor_kwargs = {"max_pixels": 1843200, "min_pixels": 4 * 28 * 28} # ~1800 vision tokens
2QUERY_PROMPT = "Find a document image that matches the given query."
3DOCUMENT_PROMPT = "Represent the user's input."1import torch
2from sentence_transformers import SentenceTransformer
3
4model = SentenceTransformer(
5 "johnandru/Qwen3-VL-Embedding-2B-ko-vdr-distill",
6 model_kwargs={"attn_implementation": "flash_attention_2", "torch_dtype": torch.bfloat16},
7 processor_kwargs={"max_pixels": 1843200, "min_pixels": 4 * 28 * 28},
8)
9if hasattr(model[0], "unpad_inputs"):
10 model[0].unpad_inputs = False
11
12q_emb = model.encode(["설계기준 강화 관련 문서"], prompt="Find a document image that matches the given query.")
13d_emb = model.encode(["path/to/page.png"], prompt="Represent the user's input.") # image path
14sim = model.similarity(q_emb, d_emb)