|
| 1 | +# Changelog |
| 2 | + |
| 3 | +All notable changes to MeowLLM will be documented in this file. |
| 4 | + |
| 5 | +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), |
| 6 | +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). |
| 7 | + |
| 8 | +--- |
| 9 | + |
| 10 | +## [0.1.0] — Initial release |
| 11 | + |
| 12 | +First public release of MeowLLM / Miso. |
| 13 | + |
| 14 | +### Added |
| 15 | + |
| 16 | +#### Model |
| 17 | + |
| 18 | +- ~3.5M parameter decoder-only transformer (`meow/model.py`, 278 lines) |
| 19 | +- Modern architecture: RoPE, RMSNorm, SwiGLU, torch SDPA, tied embeddings |
| 20 | +- Config: 4 layers, d_model 256, 4 heads, ffn_hidden 640, context 256 |
| 21 | +- Causal self-attention with flash-attention kernels via SDPA |
| 22 | +- Autoregressive generation with temperature, top-k, and EOS handling |
| 23 | + |
| 24 | +#### Data pipeline |
| 25 | + |
| 26 | +- Slot-based compositional template generator (`meow/generate_data.py`) |
| 27 | +- 15 categories fully populated with inputs, cores, openers, sensories, |
| 28 | + and redirects |
| 29 | +- Per-category probability tuning for optional slots |
| 30 | +- Optional LLM augmentation path via Anthropic API (disabled by default) |
| 31 | +- Robust JSON extraction from LLM responses (handles fences, prose) |
| 32 | +- Deduplication on `(input, output)` tuples |
| 33 | +- Eval-prompt leakage prevention during generation |
| 34 | +- Rejection stats reporting by reason |
| 35 | + |
| 36 | +#### Rules module |
| 37 | + |
| 38 | +- Single source of truth for character validation (`meow/rules.py`) |
| 39 | +- Whole-phrase matching for banned assistant phrases (no substring false |
| 40 | + positives) |
| 41 | +- Asymmetric per-category keyword requirements |
| 42 | +- Exempt-category handling for nonsense questions |
| 43 | +- Short-response bypass (≤6 words skip keyword checks) |
| 44 | +- 40+ banned phrases across AI disclosure, helpfulness, chirpiness, and |
| 45 | + refusal-as-assistant categories |
| 46 | + |
| 47 | +#### Tokenizer |
| 48 | + |
| 49 | +- Byte-level BPE tokenizer trained on generated dataset |
| 50 | + (`meow/tokenizer.py`) |
| 51 | +- Target vocab 2048, typical trained vocab ~1682 |
| 52 | +- Special tokens: `<pad>`, `<bos>`, `<eos>`, `<user>`, `<miso>` |
| 53 | +- Chat format encoding with `output_start` index for loss masking |
| 54 | + |
| 55 | +#### Training |
| 56 | + |
| 57 | +- AdamW optimizer with cosine decay + linear warmup (`meow/train.py`) |
| 58 | +- Gradient clipping at 1.0 |
| 59 | +- Smoke mode for fast pipeline validation (`--smoke`) |
| 60 | +- Best and final checkpoint saving |
| 61 | +- Training metadata JSON export |
| 62 | + |
| 63 | +#### Dataset class |
| 64 | + |
| 65 | +- PyTorch `MeowDataset` with proper loss masking (`meow/dataset.py`) |
| 66 | +- User-turn positions marked with `IGNORE_INDEX = -100` |
| 67 | +- Padding to fixed max sequence length |
| 68 | +- Collate function for batching |
| 69 | + |
| 70 | +#### Evaluation |
| 71 | + |
| 72 | +- Held-out prompt suite: 38 prompts across 15 categories + hard negatives |
| 73 | + (`meow/eval_cases.py`) |
| 74 | +- 5-dimension evaluation: lowercase, length, banned phrases, cat framing, |
| 75 | + full gate |
| 76 | +- Batch evaluation with per-check pass rates |
| 77 | +- Top-failure-reasons reporting |
| 78 | + |
| 79 | +#### Inference |
| 80 | + |
| 81 | +- Checkpoint loading with config reconstruction (`meow/inference.py`) |
| 82 | +- Single-prompt and interactive modes |
| 83 | +- Proper device handling across CPU/GPU |
| 84 | + |
| 85 | +#### Tests |
| 86 | + |
| 87 | +- 68 pytest tests covering: |
| 88 | + - Rules module (34 test cases) |
| 89 | + - Generator behavior and yield |
| 90 | + - Cross-consistency between `CATEGORIES` and `CATEGORY_KEYWORDS` |
| 91 | + - Model architecture (shapes, RoPE identity, RMSNorm, ignore_index, |
| 92 | + tied embeddings) |
| 93 | + - Tokenizer round-trip and chat format |
| 94 | + - Dataset loss masking |
| 95 | + - Evaluation harness |
| 96 | +- Runs in ~7 seconds on CPU |
| 97 | + |
| 98 | +#### Notebooks |
| 99 | + |
| 100 | +- `notebooks/train_meow.ipynb` — one-click Colab training |
| 101 | +- `notebooks/chat_with_meow.ipynb` — HF-download-first chat with |
| 102 | + training fallback |
| 103 | + |
| 104 | +#### Documentation |
| 105 | + |
| 106 | +- `README.md` — project overview, quick start, architecture, evaluation |
| 107 | +- `persona.md` — character bible with hard voice rules |
| 108 | +- `CONTRIBUTING.md` — contribution guide |
| 109 | +- `docs/getting_started.md` — friendly tutorial walkthrough |
| 110 | +- `docs/troubleshooting.md` — common issues and fixes |
| 111 | +- `docs/faq.md` — frequently asked questions |
| 112 | +- `docs/release.md` — step-by-step release process |
| 113 | +- `docs/dataset_card.md` — Hugging Face dataset card (valid YAML front matter) |
| 114 | +- `docs/model_card.md` — Hugging Face model card (valid YAML front matter) |
| 115 | +- `CITATION.cff` — valid CFF 1.2.0 |
| 116 | +- Inline docstrings on every public function and class |
| 117 | + |
| 118 | +#### Packaging |
| 119 | + |
| 120 | +- `pyproject.toml` with setuptools backend |
| 121 | +- Console scripts: `meow-generate`, `meow-tokenizer`, `meow-train`, |
| 122 | + `meow-chat` |
| 123 | +- Optional dependency groups: `llm` (Anthropic), `hub` (HuggingFace), |
| 124 | + `dev` (pytest, ruff) |
| 125 | +- Python 3.10+ support |
| 126 | +- `LICENSE` — MIT |
| 127 | + |
| 128 | +#### Infrastructure |
| 129 | + |
| 130 | +- GitHub Actions CI (`.github/workflows/test.yml`) testing Python |
| 131 | + 3.10, 3.11, 3.12 |
| 132 | +- CI runs pytest, rules smoke test, generator, tokenizer, and smoke |
| 133 | + training to verify end-to-end pipeline |
| 134 | +- `scripts/test_rules_smoke.py` — portable rules smoke test (no |
| 135 | + hardcoded paths) |
| 136 | +- `scripts/upload_to_hf.sh` — one-shot Hugging Face upload for model |
| 137 | + and dataset |
| 138 | + |
| 139 | +### Baseline numbers |
| 140 | + |
| 141 | +Pass rates on held-out eval (bundled CPU checkpoint, 2000 steps, val_loss 0.476): |
| 142 | + |
| 143 | +- lowercase: 100.0% |
| 144 | +- length: 100.0% |
| 145 | +- no banned phrases: 100.0% |
| 146 | +- cat framing: 81.6% |
| 147 | +- **overall: 84.2%** |
| 148 | + |
| 149 | +A full 10-epoch GPU training run is expected to produce higher numbers still. |
| 150 | +Contributors who complete a GPU run are invited to open a PR with their numbers. |
| 151 | + |
| 152 | +### Known limitations |
| 153 | + |
| 154 | +- Only the smoke-trained checkpoint has been validated. Full-training |
| 155 | + numbers pending. |
| 156 | +- Narrow vocabulary (~1700 BPE tokens). |
| 157 | +- Single-turn only. |
| 158 | +- English/lowercase only. |
| 159 | +- HF upload script untested on real credentials. |
| 160 | +- Colab notebook untested on a real Colab instance (cells are |
| 161 | + syntactically correct and commands have been validated locally). |
| 162 | + |
| 163 | +--- |
| 164 | + |
| 165 | +## [Unreleased] |
| 166 | + |
| 167 | +Things planned for future releases: |
| 168 | + |
| 169 | +- Pretrained weights published to Hugging Face |
| 170 | +- Verified full-training eval numbers in the model card |
| 171 | +- ONNX export path for browser inference |
| 172 | +- Optional multi-turn format (experiment) |
| 173 | +- `docs/architecture.md` deep-dive on design decisions |
0 commit comments