Instructions to use nlpai-lab/KURE-Sparse-nano-inference-free with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- sentence-transformers
How to use nlpai-lab/KURE-Sparse-nano-inference-free with sentence-transformers:
from sentence_transformers import SparseEncoder model = SparseEncoder("nlpai-lab/KURE-Sparse-nano-inference-free") queries = ["Which planet is known as the Red Planet?"] documents = [ "Venus is often called Earth's twin because of its similar size and proximity.", "Mars, known for its reddish appearance, is often referred to as the Red Planet.", "Jupiter, the largest planet in our solar system, has a prominent red spot.", ] query_embeddings = model.encode_query(queries) document_embeddings = model.encode_document(documents) similarities = model.similarity(query_embeddings, document_embeddings) print(similarities) - Notebooks
- Google Colab
- Kaggle
π KURE-Sparse-nano-inference-free
KURE-Sparse-nano-inference-free is the inference-free variant of KURE-Sparse-nano, a Korean-English learned sparse retrieval model. Documents are encoded by a compact (0.1B) sparse encoder, while queries need no model forward pass at all: a query is tokenized and each of its terms is looked up in a learned weight table. It averages 0.7360 nDCG@10 on MTEB(kor, v2) Retrieval, the highest among the inference-free sparse models we evaluated, at one third of KURE-Sparse-nano's retrieval FLOPs.
Key Characteristics
- Inference-free queries: query encoding is a tokenizer call and a table lookup, with no neural network involved, so it needs no GPU at serving time. On a single CPU thread,
encode_querytakes about 3 ms for one query and 0.3 ms per query in batches. Only documents go through the neural encoder, once, at indexing time. - Learned Sparse Retrieval (LSR): every vector lives in a fixed vocabulary of 36,282 terms, so documents can be indexed in an inverted index and matched terms are inspectable.
- Compact: 0.1B-parameter document encoder.
- Long documents: up to 8,192 tokens.
- Cheap to search: on average 20 active dimensions per query and 958 per document, for 7.9 FLOPs per query-document pair (KURE-Sparse-nano: 23.0).
How It Works
- Documents are prefixed with
[D]and encoded by a SPLADE-style encoder (log(1 + ReLU(logits)), max-pooled over tokens). - Queries are tokenized, and every term present in the query gets that term's learned weight; a repeated term counts once, and special tokens are ignored. The table starts from each term's BM25 IDF over the training documents and is trained jointly with the document encoder.
- Terms: WordPiece continuations and their word-initial forms share one dimension on both sides (e.g.
κ³μ½and##κ³μ½), so a query term matches a document term however it was split. - Score: the dot product, i.e. the sum over query terms of the term's query weight times its document weight.
The document encoder starts from the same backbone as KURE-Sparse-nano. It is contrastively pre-finetuned, then distilled from Qwen3-Reranker-8B on Korean and English retrieval data, with the query table trained throughout.
Usage
Sentence Transformers
pip install -U sentence-transformers
The model ships its own query and document modules (pooling.py), so load it with trust_remote_code=True. Use encode_query / encode_document: queries take the lookup route, and documents get the [D] marker and go through the encoder.
from sentence_transformers import SparseEncoder
model = SparseEncoder("nlpai-lab/KURE-Sparse-nano-inference-free", trust_remote_code=True)
query = "νλ―Όμ μμ μΈμ λ§λ€μ΄μ‘λμ?"
documents = [
"μΈμ’
λμμ 1443λ
μ νλ―Όμ μμ μ°½μ νκ³ 1446λ
μ μ΄λ₯Ό λ°ν¬νμλ€.",
"κΉμΉλ λ°°μΆλ 무λ₯Ό μκΈμ μ μΈ λ€ κ³ μΆ§κ°λ£¨μ μ κ°μ λ£μ΄ λ°ν¨μν¨ μμμ΄λ€.",
"νλΌμ°μ ν΄λ° 1,947mλ‘ λ¨νμμ κ°μ₯ λμ μ°μ΄λ©° μ μ£Όλ μ€μμ μ리νλ€.",
]
query_embeddings = model.encode_query(query) # no model forward: tokenizer + lookup
document_embeddings = model.encode_document(documents)
print(query_embeddings.shape, document_embeddings.shape)
# torch.Size([36282]) torch.Size([3, 36282])
# Dot-product scores (higher is more relevant)
scores = model.similarity(query_embeddings, document_embeddings)
print(scores)
# tensor([[61.8513, 24.9416, 10.8340]])
Evaluation
KURE-Sparse-nano-inference-free is evaluated on the nine MTEB(kor, v2) Retrieval tasks. We report nDCG@10.
| Model | Type | Params | Avg | AutoRAG | PubHealthQA | Ko-StrategyQA | LawIRKo | SQuADKorV1 | Belebele (ko-ko) | MrTidy | MLDR | MIRACL |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Inference-free Sparse Models | ||||||||||||
| nlpai-lab/KURE-Sparse-nano-inference-free | Sparse (inference-free) | 0.1B | 0.7360 | 0.9423 | 0.7772 | 0.7568 | 0.5970 | 0.9798 | 0.9499 | 0.4609 | 0.5508 | 0.6089 |
| opensearch-project/opensearch-neural-sparse-encoding-multilingual-v1 | Sparse (inference-free) | 0.2B | 0.5444 | 0.6482 | 0.5506 | 0.5553 | 0.3554 | 0.7770 | 0.7321 | 0.5526 | 0.1219 | 0.6064 |
| Sparse Models (query encoder) | ||||||||||||
| nlpai-lab/KURE-Sparse-base | Sparse | 0.6B | 0.7984 | 0.9445 | 0.8099 | 0.8188 | 0.7244 | 0.9815 | 0.9703 | 0.6255 | 0.5716 | 0.7395 |
| nlpai-lab/KURE-Sparse-nano | Sparse | 0.1B | 0.7716 | 0.9360 | 0.7711 | 0.7924 | 0.7226 | 0.9774 | 0.9608 | 0.5618 | 0.5133 | 0.7091 |
| omai-research/milco-650m | Sparse | 0.6B | 0.7824 | 0.9483 | 0.8219 | 0.8143 | 0.6724 | 0.9700 | 0.9623 | 0.6997 | 0.4318 | 0.7209 |
| telepix/PIXIE-Splade-v1.5 | Sparse | 0.1B | 0.7608 | 0.9412 | 0.7910 | 0.7993 | 0.7667 | 0.9687 | 0.9651 | 0.5132 | 0.4938 | 0.6085 |
| yjoonjang/splade-ko-v1 | Sparse | 0.1B | 0.7526 | 0.9423 | 0.7977 | 0.7583 | 0.6509 | 0.9754 | 0.9576 | 0.5299 | 0.5162 | 0.6451 |
| telepix/PIXIE-Splade-v1.0 | Sparse | 0.1B | 0.6636 | 0.9597 | 0.7860 | 0.7352 | 0.5330 | 0.9417 | 0.9413 | 0.2909 | 0.3991 | 0.3858 |
Performance-Sparsity
Average active dimensions per vector and FLOPs, averaged over the nine tasks.
| Model | Query encoder | Params | Avg nDCG@10 | Query dims | Document dims | FLOPs |
|---|---|---|---|---|---|---|
| KURE-Sparse-nano-inference-free | None (lookup) | 0.1B | 0.7360 | 20 | 958 | 7.9 |
| KURE-Sparse-nano | 0.1B | 0.1B | 0.7716 | 147 | 843 | 23.0 |
| KURE-Sparse-base | 0.6B | 0.6B | 0.7984 | 100 | 1,897 | 36.5 |
| omai-research/milco-650m | 0.6B | 0.6B | 0.7824 | 105 | 1,167 | 32.3 |
| telepix/PIXIE-Splade-v1.5 | 0.1B | 0.1B | 0.7608 | 117 | 1,541 | 37.3 |
| yjoonjang/splade-ko-v1 | 0.1B | 0.1B | 0.7526 | 109 | 742 | 29.1 |
| telepix/PIXIE-Splade-v1.0 | 0.1B | 0.1B | 0.6636 | 121 | 625 | 22.4 |
| opensearch-project/opensearch-neural-sparse-encoding-multilingual-v1 | None (lookup) | 0.2B | 0.5444 | 29 | 176 | 6.8 |
Limitations
- No query expansion. A query only activates the terms it contains, so the model relies on the document side to cover paraphrases. On tasks with a large vocabulary gap between queries and documents it trails KURE-Sparse-nano most: LawIRKo (β0.126), MrTidy (β0.101) and MIRACL (β0.100).
Citation
@misc{kure-sparse,
title = {KURE-Sparse: a Korean-English bilingual learned sparse retriever},
author = {Jang, Youngjoon and Son, Junyoung and Lee, Taemin and Hong, Seongtae and Lim, Heuiseok},
year = {2026},
url = {https://huggingface.co/nlpai-lab/KURE-Sparse-nano},
}
@misc{kure-v2,
title = {KURE-v2: a Korean-English bilingual late-interaction retriever},
author = {Jang, Youngjoon and Son, Junyoung and Lee, Taemin and Hong, Seongtae and Lim, Heuiseok},
year = {2026},
url = {https://huggingface.co/nlpai-lab/KURE-v2},
}
@inproceedings{jang2025kure,
title={KURE: Embedding Model for Korean-Specific Retrieval},
author={Jang, Youngjoon and Son, Junyoung and Lee, Taemin and Hong, Seongtae and Park, JeongBae and Lim, Heuiseok},
booktitle={Annual Conference on Human and Language Technology},
pages={129--134},
year={2025},
organization={Human and Language Technology}
}