KIEFERSA
Sophea-Nemo-Embedding
Greek + English dense retriever — fine-tuned NVIDIA Nemotron-3-Embed-1B

Sophea-Nemo-Embedding is a Greek + English dense retrieval embedder, fine-tuned from NVIDIA Nemotron-3-Embed-1B for Greek and English retrieval. It is the first stage of a two-stage Greek RAG stack; the matching second stage is Sophea-Nemo-Reranker.

  • Creator: Kiefer SA
  • Base model: nvidia/Nemotron-3-Embed-1B-BF16 (Ministral-3 backbone, bidirectional, mean pooling with include_prompt=true, 2048-d Matryoshka-sliceable, L2-normalized)
  • Languages: Greek + English
  • Prompts: query: on queries, passage: on documents (both sides prompted)
  • Training: full fine-tune, InfoNCE (in-batch + 7 hard negatives), 1 epoch, max-len 4096, bf16

Greek is out-of-distribution for the base. Nemotron-3-Embed lists 34 languages and Greek is not one of them — which is exactly why the base retrieves poorly on Greek and why this fine-tune exists.

Why it matters — base vs fine-tuned

On our held-out 5-domain Greek+English retrieval eval (cosine IR, query: /passage: prompts), the fine-tune roughly 2.5×'s the base embedder's retrieval quality — on every domain.

Greek+English retrieval — base vs fine-tuned

metric Val Energy Legal Finance Medical Mean
nDCG@10 — base0.3820.3450.5260.1940.2090.331
nDCG@10 — fine-tuned0.8750.7940.9500.7220.7470.818
Δ nDCG@10+0.493+0.448+0.424+0.528+0.538+0.486
Recall@10 — base0.4650.4640.5990.2830.3140.425
Recall@10 — fine-tuned0.9630.8980.9840.9030.9060.931

Read. Mean nDCG@10 0.331 → 0.818 (+0.486), with the largest gains on the hardest domains (finance +0.53, medical +0.54). Recall@10 climbs from a mean 0.425 to 0.931 — i.e. the right passage is now almost always in the top-10.

Size comparison — vs base Qwen3-Embedding (off-the-shelf)

Same 5-domain retrieval eval, same corpus/prompts. Your fine-tuned 1B embedder beats the base Qwen3-Embedding-8B by a wide margin (nDCG@10):

model Val Energy Legal Finance Medical Mean
Sophea-Nemo-Embedding (ours · 1B · fine-tuned)0.8750.7940.9500.7220.7470.818
Qwen3-Embedding-8B (base, off-the-shelf)0.7400.5800.9100.4900.6020.664
Qwen3-Embedding-4B (base, off-the-shelf)0.7380.5790.9190.5010.5860.665
Qwen3-Embedding-0.6B (base, off-the-shelf)0.6580.5090.8630.4260.4670.585

Read. Mean nDCG@10 0.818 (ours, 1B) vs 0.664 (8B), 0.665 (4B), 0.585 (0.6B). Note the Qwen 8B ≈ 4B — scaling the off-the-shelf model barely helps on Greek, whereas a 1B fine-tuned on-domain wins by +0.153 over the 8×-larger model.

End-to-end two-stage pipeline

The two models are designed to run together: the embedder retrieves the top-50 candidates, the reranker re-orders them. Measured end-to-end on the same 5-domain Greek+English eval (150 queries/set, correct query:/passage: prompts):

End-to-end two-stage stack — embedder alone vs + reranker

metric Val Energy Legal Finance Medical Mean
nDCG@10 — embedder alone0.8630.8020.9390.7020.6890.799
nDCG@10 — + reranker (stack)0.8670.7800.9760.7630.7030.818
Δ from reranking+0.004-0.022+0.037+0.061+0.013+0.019
Recall@10 — full stack0.9870.8730.9930.9200.8600.927

Read. The full stack reaches mean nDCG@10 0.818 (Recall@10 0.927) — the strongest configuration measured. The reranker adds the most where the embedder is weakest (finance +0.061, legal +0.037), i.e. it sharpens precision on the hard cases. On energy it slightly regresses (-0.022) and on val the gain is marginal, because the embedder alone is already very strong there and leaves little headroom — for the easiest, already-high-recall domains you can skip the rerank stage if latency matters.

Usage (sentence-transformers)

from sentence_transformers import SentenceTransformer
m = SentenceTransformer("KIEFERSA/Sophea-Nemo-Embedding")
q = m.encode(["Ποια είναι η πρωτεύουσα της Ελλάδας;"], prompt="query: ", normalize_embeddings=True)
d = m.encode(["Η Αθήνα είναι η πρωτεύουσα της Ελλάδας."], prompt="passage: ", normalize_embeddings=True)
print((q @ d.T))   # cosine similarity

Both sides must be prompted (query: / passage: ) — the base uses include_prompt=true, so dropping the prefix is a distribution mismatch. Embeddings are L2-normalized (use cosine / dot).

Serving with vLLM

vllm serve KIEFERSA/Sophea-Nemo-Embedding --runner pooling

Exposes an OpenAI-compatible /v1/embeddings endpoint. vLLM does not auto-apply the model's ST prompts, so prepend them client-sidequery: on queries, passage: on documents:

from openai import OpenAI
c = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
name = "KIEFERSA/Sophea-Nemo-Embedding"
q = c.embeddings.create(model=name, input=["query: Ποια είναι η πρωτεύουσα της Ελλάδας;"]).data[0].embedding
d = c.embeddings.create(model=name, input=["passage: Η Αθήνα είναι η πρωτεύουσα της Ελλάδας."]).data[0].embedding

License

Fine-tune of nvidia/Nemotron-3-Embed-1B-BF16 — governed by OpenMDW-1.1 (base Ministral-3 is Apache-2.0); commercial use permitted under those terms. Review the base model's license before use.

Downloads last month
2
Safetensors
Model size
1B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for KIEFERSA/Sophea-Nemo-Embedding

Collection including KIEFERSA/Sophea-Nemo-Embedding

Evaluation results

  • nDCG@10 (mean of 5 domains) on Internal Greek+English retrieval benchmark
    self-reported
    0.818
  • Recall@10 (mean of 5 domains) on Internal Greek+English retrieval benchmark
    self-reported
    0.931