| --- |
| license: mit |
| library_name: pytorch |
| pipeline_tag: text-generation |
| language: |
| - en |
| tags: |
| - knowledge-editing |
| - model-editing |
| - selective-prediction |
| - abstention |
| - byte-level |
| - interpretability |
| - research-prototype |
| - crud |
| - editable-llm |
| - tiny-language-model |
| - cpu |
| - knowledge-base |
| - rome |
| - memit |
| --- |
| |
| # Yaz — an editable, auditable tiny knowledge model that abstains when unsure |
|
|
| **Yaz** is a sub-1M-parameter (≈808K), byte-level language model whose individual facts you can |
| **create, read, update, and delete** one at a time — with **provable per-edit locality** — and that |
| **abstains** when it isn't confident which fact you mean, instead of guessing. CPU-only, offline. |
|
|
| > **Status: research prototype.** Small-scale and honestly scoped. A clean, reproducible demonstration — |
| > **not** a state-of-the-art result and **not** a defensible new capability. Read the limitations below. |
|
|
| - 📄 Technical report: [`paper/yaz-technical-report.pdf`](paper/yaz-technical-report.pdf) |
| - 💻 Code & reproduction: https://github.com/TilelliLab/Yaz |
| - 🔬 Each fact = one decoder column (*atom*); routing by a frozen `all-MiniLM-L6-v2` embedding. |
|
|
| ## How it works |
|
|
| Each fact lives in its own addressable **atom** (a decoder column). A **frozen sentence embedding** |
| routes a prompt to a fact by meaning, so paraphrases reach the same fact. UPDATE swaps a column, |
| DELETE zeroes it, CREATE allocates a fresh one, READ is just routing — no retraining. The routing |
| **confidence margin** (top-1 − top-2) is used as an "I don't know which fact you mean" signal, so the |
| model refuses low-confidence queries. |
|
|
| ## Download |
|
|
| Use the Hugging Face Hub (handles the Git-LFS weights for you). **Don't `git clone` without |
| `git-lfs`** — you'd get 132-byte LFS pointer files instead of the real `model.safetensors` / `.pt`. |
|
|
| ```bash |
| pip install huggingface_hub |
| # CPU-only deps (avoids the multi-GB CUDA stack): |
| pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cpu |
| ``` |
| ```python |
| from huggingface_hub import snapshot_download |
| repo = snapshot_download("TilelliLab/Yaz") # -> local path with all files (real weights) |
| # then: cd into `repo` and run the snippets below, or `python demo.py --demo`. |
| ``` |
|
|
| ## Load it (safetensors, no pickle) |
|
|
| ```python |
| # files in this repo: model.safetensors, yaz_meta.json, load_yaz.py, yaz/ (model code) |
| from load_yaz import load_yaz |
| model, cfg, meta = load_yaz() # 807,680 params, 50 fact-atoms |
| print(meta["country_to_target_atom"]["France"]) # -> 0 |
| ``` |
|
|
| Run the full routing + abstention + live-edit demo (needs `pip install -r requirements.txt`): |
|
|
| ```bash |
| python demo.py --demo |
| python demo.py --prompt "the country of the Eiffel Tower, its capital is " |
| python demo.py --prompt "The capital of France is " --edit France=Lima |
| python demo.py --prompt "best pizza topping?" # -> ABSTAIN (out of scope) |
| ``` |
|
|
| The original PyTorch checkpoint is also included at `checkpoints/yaz_gen_semantic_v2.pt` for fidelity; |
| the `model.safetensors` is the recommended (pickle-free) artifact. |
|
|
| ## What it can do (measured) |
|
|
| | Capability | Result | |
| |---|---| |
| | UPDATE (edit, no retraining) | in-dist reliability 1.000; edits land 8/8 (first byte) | |
| | DELETE | fact gone, 0 collateral | |
| | CREATE | passes 4/4 battery (monosemantic / local / readable / deletable) | |
| | Per-edit locality | 0/10 collateral; bpc +0.000% across 40 sequential edits | |
| | Paraphrase-robust routing | held-out reach **0.696** vs 0.216 surface routing | |
| | Abstain when unsure | near-oracle risk-coverage **AURC 0.004** (oracle 0.003) | |
|
|
| All numbers reproduce with the public `all-MiniLM-L6-v2` embedder (no internal dependencies), seed 2026, CPU. |
|
|
| ## How it compares |
|
|
| Yaz sits in the **side-memory** family of editors (like SERAC/GRACE/WISE/PENME), not the weight-editing |
| family (ROME/MEMIT/MEND). Two honest differences: its edit is a **structural** decoder-column swap (locality |
| by construction), and it **abstains** on low routing confidence instead of answering with the base model — |
| a feature no published editor has. On a controlled tiny task, weight-editing (ROME/MEMIT) lands the new |
| answer but loses selectivity as edits accumulate (22–67% of other facts change), while Yaz holds 0%; but |
| Yaz is far smaller-scale and its update reliability degrades past its capacity. **Full, honest comparison |
| (incl. ROME/MEMIT-vs-Yaz at 5/50/200 facts):** |
| [COMPARISON.md on GitHub](https://github.com/TilelliLab/Yaz/blob/main/COMPARISON.md). |
|
|
| ## Limitations (read these) |
|
|
| - **First-byte editor.** Edits set the answer's **first byte**; multi-byte generation is not faithful |
| (full-word transfer ≈ 0.05). |
| - **A retracted claim.** An earlier "edit-generalization" headline of 0.675 was **retracted** — a |
| random-column-swap control sits at ≈ 0.688, i.e. that number was at chance. What survives is routing |
| *reach*, not an edit-magnitude effect. |
| - **Fragile routing** on oblique, name-free clues (≈0.85 famous → ≈0.50 oblique). |
| - **Structural locality** holds only while no two facts share an atom. |
| - **Tiny, synthetic scope** — 50 country→capital facts, single seed, CPU. |
| - **Not a moat.** Mechanisms exist in the literature (ROME/MEMIT, GRACE, SERAC, PENME; EasyEdit). Yaz |
| combines them cleanly and reproducibly — an engineering contribution, not a unique capability. |
|
|
| ## Citation |
|
|
| See [`CITATION.cff`](https://github.com/TilelliLab/Yaz/blob/main/CITATION.cff). MIT licensed. © 2026 Tilelli LAB. |
|
|