Feature Extraction
MLX
Safetensors
English
Chinese
multilingual
qwen3
mlx-lm
embeddings
text-embedding
retrieval
4-bit precision
Instructions to use mlx-community/Octen-Embedding-4B-MLX-4bit with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- MLX
How to use mlx-community/Octen-Embedding-4B-MLX-4bit with MLX:
# Download the model from the Hub pip install huggingface_hub[hf_xet] huggingface-cli download --local-dir Octen-Embedding-4B-MLX-4bit mlx-community/Octen-Embedding-4B-MLX-4bit
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- LM Studio
- Atomic Chat
| language: | |
| - en | |
| - zh | |
| - multilingual | |
| license: apache-2.0 | |
| library_name: mlx | |
| pipeline_tag: feature-extraction | |
| base_model: Octen/Octen-Embedding-4B | |
| tags: | |
| - mlx | |
| - mlx-lm | |
| - embeddings | |
| - text-embedding | |
| - retrieval | |
| - multilingual | |
| - qwen3 | |
| - 4-bit | |
| # Octen-Embedding-4B-MLX-4bit | |
| Community MLX 4-bit conversion of | |
| [Octen/Octen-Embedding-4B](https://huggingface.co/Octen/Octen-Embedding-4B) | |
| for Apple silicon. | |
| This repository is not an official Octen release. The original model was | |
| developed by Octen and is distributed under the Apache License 2.0. | |
| ## Model details | |
| | Property | Value | | |
| |---|---| | |
| | Upstream model | `Octen/Octen-Embedding-4B` | | |
| | Upstream revision | `fea468fae3f0caffbae8a12ba792d1c394b6277d` | | |
| | Runtime architecture | Standard MLX-LM `qwen3.Model` | | |
| | Parameters | 4B | | |
| | Embedding dimension | 2560 | | |
| | Context length | 32,768 tokens | | |
| | Quantization | MLX affine 4-bit | | |
| | Quantization group size | 64 | | |
| | Pooling | Last token | | |
| | Normalization | L2 normalization in float32 | | |
| The upstream checkpoint contains encoder-only `Qwen3Model` weights without an | |
| LM head. Its weight keys were normalized from `embed_tokens.*` / `layers.*` to | |
| the standard MLX-LM `model.embed_tokens.*` / `model.layers.*` layout before | |
| running the official `mlx_lm.convert` command. The final repository uses the | |
| built-in `mlx_lm.models.qwen3.Model` and contains no custom Python model code. | |
| For embeddings, use the built-in model's `model` encoder submodule, which | |
| returns hidden states shaped `[batch, sequence, 2560]`. | |
| ## Prompt format | |
| Use the same prompt contract as the upstream Sentence Transformers model: | |
| ```text | |
| Query: | |
| Instruct: Given a web search query, retrieve relevant passages that answer the query | |
| Query:{query} | |
| Document: | |
| {document} | |
| ``` | |
| The document prefix is one space. Query and document embeddings must use the | |
| same checkpoint and processing contract. | |
| ## Usage | |
| ```python | |
| import mlx.core as mx | |
| from mlx_lm import load | |
| repo = "davied-he/Octen-Embedding-4B-MLX-4bit" | |
| model, tokenizer = load(repo) | |
| QUERY_PREFIX = ( | |
| "Instruct: Given a web search query, retrieve relevant passages that answer the query\n" | |
| "Query:" | |
| ) | |
| def encode(text: str, is_query: bool) -> mx.array: | |
| prefix = QUERY_PREFIX if is_query else " " | |
| input_ids = mx.array([tokenizer.encode(prefix + text)]) | |
| hidden_states = model.model(input_ids) | |
| embedding = hidden_states[:, -1, :].squeeze().astype(mx.float32) | |
| norm = mx.sqrt(mx.sum(mx.square(embedding))) | |
| return embedding / mx.maximum(norm, mx.array(1e-12)) | |
| query = encode("What is semantic retrieval?", is_query=True) | |
| document = encode( | |
| "Semantic retrieval finds documents by meaning rather than exact keywords.", | |
| is_query=False, | |
| ) | |
| similarity = float(mx.sum(query * document)) | |
| print(query.shape) # (2560,) | |
| print(similarity) | |
| ``` | |
| `estha_embedding_config.json` contains the same runtime contract in a | |
| machine-readable form. | |
| ## Conversion | |
| The upstream model uses bare encoder weight names such as `embed_tokens.*` and | |
| `layers.*`. Before conversion, those keys were deterministically prefixed with | |
| `model.` so they match the official MLX-LM Qwen3 model layout. No tensor values | |
| were changed during this normalization step. | |
| ```bash | |
| mlx_lm.convert \ | |
| --hf-path Octen/Octen-Embedding-4B \ | |
| --mlx-path Octen-Embedding-4B-MLX-4bit \ | |
| --quantize \ | |
| --q-group-size 64 \ | |
| --q-bits 4 | |
| ``` | |
| Conversion environment: | |
| - `mlx-lm==0.31.3` | |
| - official `mlx_lm.convert` | |
| - affine 4-bit quantization | |
| - 4.501 effective bits per weight reported by MLX-LM | |
| - no custom `model_file` or remote code | |
| ## Validation | |
| The published artifact was validated on Apple silicon: | |
| - MLX-LM loads the repository directly with built-in `qwen3.Model`. | |
| - The repository contains no custom Python model files. | |
| - Hidden-state output shape is `[batch, sequence, 2560]`. | |
| - Query and document embeddings have shape `[2560]`. | |
| - Float32 L2-normalized vector norms are `1.0`. | |
| - On three English and Traditional Chinese samples, cosine similarity between | |
| upstream BF16 and MLX 4-bit embeddings was `0.9748–0.9782`. | |
| - A two-query bilingual retrieval smoke test returned the expected Top-1 | |
| documents. | |
| Artifact checksum: | |
| ```text | |
| model.safetensors | |
| 423d1c857da56367a84bffa182a4a875c5844a54a979c0866da38072525f6aed | |
| ``` | |
| ## Limitations | |
| - Quantization introduces numerical differences from the upstream BF16 model. | |
| - This conversion exposes embeddings, not text generation. | |
| - Do not mix vectors from this model with vectors generated by another model, | |
| even when both models use 2560 dimensions. | |
| - Retrieval quality should be evaluated on your own language and domain data. | |
| ## Attribution and license | |
| The upstream `Octen/Octen-Embedding-4B` model and its base | |
| `Qwen/Qwen3-Embedding-4B` are licensed under Apache License 2.0. This | |
| conversion preserves that license and attribution. See `LICENSE`. | |
| Please cite and credit the upstream Octen model when using this conversion. | |