Instructions to use aghatage/zeppelin-embed-clean71-arctic-m-v2 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use aghatage/zeppelin-embed-clean71-arctic-m-v2 with MLX:
# Download the model from the Hub pip install huggingface_hub[hf_xet] hf download aghatage/zeppelin-embed-clean71-arctic-m-v2 --local-dir zeppelin-embed-clean71-arctic-m-v2
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Atomic Chat
zeppelin-embed clean71-v1 + Arctic m-v2
An asymmetric two-tower text embedding pair for zeppelin-embed, an embedded vector and hybrid search engine. Documents are embedded with the unchanged Snowflake Arctic-embed-m-v2.0 model. Queries are embedded with clean71-v1, a small query tower distilled into the same 768-dimension space. The small query tower keeps query latency low on the Apple Neural Engine.
These files are a packaged runtime bundle for zeppelin-embed. They are not a
transformers or sentence-transformers checkpoint.
Platform: macOS on Apple Silicon only (CoreML on the Neural Engine for queries, MLX on the GPU for documents).
Towers
| Role | Model | Parameters | Input | Precision in this release |
|---|---|---|---|---|
| Query | clean71-v1 | 71,201,280 | prefix query: , max 96 tokens |
CoreML INT8 weights (primary); MLX FP16 (fallback) |
| Document | Snowflake/snowflake-arctic-embed-m-v2.0 @ 95c2741480856aa9666782eb4afe11959938017f |
305,368,320 | no prefix, max 8192 tokens | MLX FP16 |
- Output: 768 dimensions, L2-normalized. Score = dot product (= cosine).
- Each tower has its own tokenizer. Token limits include special tokens and the query prefix. zeppelin-embed adds the prefix and chunks documents.
- Query tower: 6 layers, width 512, FFN 1536, 98,304-token vocabulary, CLS pooling, learned 512 to 768 projection. It was initialized from the published Arctic weights.
- CoreML INT8: weight-only, per-channel, symmetric; activations and output FP16; all compute ops on the Neural Engine (230 ANE ops, 12 CPU ops).
Files
| File | Bytes | Content |
|---|---|---|
zeppelin-embed-clean71-v1-arctic-m-v2.zem |
761,146,896 | FP16 document tower, FP16 MLX query fallback, both tokenizers |
zeppelin-embed-clean71-v1-arctic-m-v2.mlmodelc/ |
71,618,688 | compiled CoreML INT8 query tower (96 tokens) |
zeppelin-model.json |
1,377 | format-1 manifest: size and SHA-256 of each file |
SHA256SUMS |
shasum -a 256 -c SHA256SUMS |
zeppelin-embed downloads only the files in zeppelin-model.json, checks the
size and SHA-256 of each file, and caches the verified set. Pin the commit
and the manifest hash:
- repo:
aghatage/zeppelin-embed-clean71-arctic-m-v2 - revision:
d64b817c4021a3f1b9bded3152d9afdf9ac813e7 - manifest SHA-256:
123c6308e00f769c68498f9df60dfb9efc688f58c4ff2c4da266f978fcb215dc
Languages and measured quality
Target languages: en, es, fr, de, pt, it, ru, zh, ja, ko, hi, ar, id, vi.
The primary score is the equal mean of English BEIR (4 tasks), MIRACL (10 target languages) and Belebele (14 target languages), nDCG@10 with MTEB 2.20.5. Document vectors are the unchanged Arctic vectors. "Original S2B" is the earlier, larger query tower that clean71-v1 replaces.
| Group | clean71-v1 | Original S2B |
|---|---|---|
| English4 (SciFact, NFCorpus, FiQA, TREC-COVID) | 0.558788 | 0.558020 |
| MIRACL10 | 0.573916 | 0.574632 |
| Belebele14 | 0.865348 | 0.882941 |
| Primary macro | 0.666017 | 0.671864 |
| All 37 units, with out-of-scope languages | 0.610932 | 0.719872 |
The primary score is 0.87% lower with 69% fewer query parameters.
Do not expect universal multilingual parity. There are real regressions inside the target set, mostly on Belebele (nDCG@10, clean71-v1 vs S2B): Russian 0.852 vs 0.890, Vietnamese 0.797 vs 0.833, Chinese 0.875 vs 0.901, Hindi 0.787 vs 0.812. Outside the target set the regressions are large:
| Outside the target set | clean71-v1 | Original S2B |
|---|---|---|
| Persian, MIRACL | 0.140 | 0.536 |
| Persian, Belebele | 0.296 | 0.852 |
| Thai, Belebele | 0.083 | 0.850 |
| Telugu, Belebele | 0.066 | 0.783 |
| Bengali, Belebele | 0.075 | 0.777 |
| Finnish, Belebele | 0.463 | 0.762 |
| Dutch, Belebele | 0.643 | 0.877 |
Use a different query model for languages outside the target set.
Precision of this release
Measured in zeppelin-embed on BEIR test sets (Apple M3 Max), nDCG@10, against an FP32 document tower with an FP16 CoreML query tower:
| Corpus | Leg | FP32 reference | This release | Change |
|---|---|---|---|---|
| FiQA (648 q) | dense | 0.421072 | 0.420397 | -0.160% |
| FiQA | hybrid | 0.284278 | 0.284463 | +0.065% |
| SciFact (300 q) | dense | 0.697647 | 0.696895 | -0.108% |
| SciFact | hybrid | 0.720797 | 0.720797 | 0.000% |
| NFCorpus (323 q) | dense | 0.339128 | 0.340106 | +0.288% |
| NFCorpus | hybrid | 0.339312 | 0.339146 | -0.049% |
The worst loss on any corpus, leg or tier is 0.16%. The upload is 49.7% smaller than the FP32 release (832,765,584 vs 1,656,816,265 bytes). Dense query p50 latency with the CoreML tower was about 1-2 ms at batch 1, tokenization included, on a loaded host. The MLX FP16 fallback was about 6-7 ms. Quality of the MLX fallback is within 0.2% of FP32.
Usage
Install zeppelin-embed with text support, then open a store by model. The first open downloads and verifies the files; later opens use the cache.
Rust (zeppelin-embed-text):
use zeppelin_embed_text::{Legs, ModelOpenOptions, ModelRef, QueryOptions, TextDocument, TextStore};
let model = ModelRef {
repo: "aghatage/zeppelin-embed-clean71-arctic-m-v2".into(),
revision: "d64b817c4021a3f1b9bded3152d9afdf9ac813e7".into(),
manifest_sha256: "123c6308e00f769c68498f9df60dfb9efc688f58c4ff2c4da266f978fcb215dc".into(),
};
let store = TextStore::open_model("store", &model, ModelOpenOptions::default())?;
store.ingest_text(&[TextDocument { id: 1, revision: 1, text: "Restore the backup, then replay the log.".into() }],
Default::default())?;
let hits = store.query_text("how do I restore a backup", QueryOptions::new(10).with_legs(Legs::Hybrid))?;
C: fill ZeTextOpenModelRequest (repo, revision, manifest_sha256)
and call ze_text_open_model(&request, &handle), then ze_text_ingest and
ze_text_query.
Python:
import zeppelin_embed as ze
store = ze.open_model("store", repo="aghatage/zeppelin-embed-clean71-arctic-m-v2",
revision="d64b817c4021a3f1b9bded3152d9afdf9ac813e7",
manifest_sha256="123c6308e00f769c68498f9df60dfb9efc688f58c4ff2c4da266f978fcb215dc")
store.ingest_text([1], ["Restore the backup, then replay the log."])
print(store.query_text("how do I restore a backup", k=10, legs="hybrid"))
Node:
const store = await TextStore.openModel({path: 'store',
repo: 'aghatage/zeppelin-embed-clean71-arctic-m-v2',
revision: 'd64b817c4021a3f1b9bded3152d9afdf9ac813e7',
manifestSha256: '123c6308e00f769c68498f9df60dfb9efc688f58c4ff2c4da266f978fcb215dc'});
store.ingest([{id: 1n, text: 'Restore the backup, then replay the log.'}]);
console.log(store.query({text: 'how do I restore a backup', legs: 'hybrid'}));
Swift:
let model = TextModel(repo: "aghatage/zeppelin-embed-clean71-arctic-m-v2",
revision: "d64b817c4021a3f1b9bded3152d9afdf9ac813e7",
manifestSHA256: "123c6308e00f769c68498f9df60dfb9efc688f58c4ff2c4da266f978fcb215dc")
let store = try await TextStore.open(at: storeURL, model: model)
Later zeppelin-embed releases ship this model as the built-in default model reference.
License and attribution
Apache-2.0.
The document tower is Snowflake/snowflake-arctic-embed-m-v2.0, Copyright Snowflake Inc., released under Apache-2.0. Its weights are unchanged except for FP16 conversion. The included GTE model code keeps its own copyright and Apache-2.0 headers.
Provenance
- Query tower clean71-v1: best held-out checkpoint at step 50,000 of an embedding-distillation run against the Arctic document space. It was initialized from the published Arctic weights.
- No MS MARCO or mMARCO training data was used, and no KorQuAD data was used (it is explicitly excluded from the selected training caches). MKQA was used only for inspection, not training. "clean" is a run name, not a legal certification.
- Training sources in the selected caches, with their own licenses:
- Wikipedia-derived queries and passages, MIRACL and Mr. TyDi official training sources (Wikipedia text: CC-BY-SA).
- Mintaka TRAIN: CC-BY-4.0.
- DPR Natural Questions TRAIN: CC-BY-SA-3.0.
- SQuAD TRAIN: CC-BY-SA-4.0.
- KLUE MRC TRAIN: CC-BY-SA-4.0.
- CMRC2018 TRAIN: CC-BY-SA-4.0.
- Stack Exchange titles: CC-BY-SA-4.0.
- Qwen3-4B translations of NQ TRAIN questions (the translation model's Apache-2.0 license does not relicense the source questions).
- No training data, optimizer state or other experiment weights are in this repository. Benchmark datasets are not included.
- Conversion:
tools/ze-model release --document-precision fp16 --query-coreml-precision int8in zeppelin-embed (torch 2.7.0, coremltools 9.0).
Model tree for aghatage/zeppelin-embed-clean71-arctic-m-v2
Base model
Snowflake/snowflake-arctic-embed-m-v2.0