melissa kate
<< Little Jane

tiny-chat roadmap

Long-running side project to train a sardonic-detective tiny LM from scratch
and learn ML mechanics along the way.

Guiding constraints:

Current state (May 2026): 8M-param decoder-only transformer trained on
~40K pairs (mostly Ollama-augmented + ~340 hand-curated). Model has personality
and answers simple greetings; longer-form output gets noisy. Loss curves show
classic overfitting past iter 2500 — capacity exceeds data.

---

Phase 1 — Data ramp (this week + next)

Goal: more high-signal training data without spending forever generating it.

1a. Continue hand-curated pair collection — IN PROGRESS (~700/1500)

signal than synthetic. Even at 3-5% of the total corpus they tilt the model's
voice meaningfully.

1b. Save full conversation transcripts — DONE

multi-turn training feeds on these.

1c. Two-model Ollama dialogue generation — ACTIVE (replaces Claude API plan)

produces more dynamic dialogue than any single model can

paying for Claude API for bulk gen isn't worth it. The two-model setup also
generates Phase 3 multi-turn data for free as a side effect.

1d. More glue from qwen2.5:14b — ACTIVE

---

Phase 2 — Tooling (concurrent with Phase 1)

Goal: stop hand-running everything; make experimentation cheap.

2a. Eval script with fixed prompts — PARTIAL (integrated in web UI)

Standalone evaluate.py for CLI use isn't built yet but probably not needed.

prompt set gives you apples-to-apples comparisons of how a change affects
the model.

2b. A/B compare script — TODO

checkpoints and shows responses side-by-side

500 hand-curated pairs" at a glance teaches you which changes actually moved
the needle.

2c. Web UI — DONE

---

Phase 3 — Multi-turn capability (weeks 3-5)

Goal: the bot remembers context from earlier in the conversation.

3a. Multi-turn data generation — DONE (via two-model dialogue)

3b. Update training to use multi-turn data — DONE

unified "blocks". Pairs = 2-element blocks, transcripts = N-element blocks.

3c. Update chat.py + web UI to feed conversation history — TODO

we're still feeding it single-turn prompts at inference. The capability is
trained but un-activated. This is the unlock.

---

Phase 4 — Model scaling (week 5-6+)

Goal: use the bigger corpus productively, push past current ceiling.

4a. Scale model to ~15-20M params

current overfitting just gets worse

iter 2500 — that's "model can memorize all the data." More params on the
same data = more memorization. More params + 3x more data = more capability.

4b. Sampling improvements

different output behavior. Cheap to experiment with.

4c. Learning rate scheduler

benefit from schedules. Educational to see if it actually helps at your scale.

---

Phase 5 — Stretch / future

Things to consider once the core feels good:

Knowledge insertion — give the bot Melissa's world model

Bake in personal/factual knowledge so the bot can answer questions about
things like favorite movies, daily routines, opinions, places, people —
all delivered in detective voice. Riffs on the HalBot tradition where a
bot's personality includes a specific knowledge bias.

questions across categories (movies, food, places, opinions, routines).
Melissa answers in-character. Each (Q, A) saves as a training pair.

specific Q→A mappings as lookups, but won't generalize across phrasings
("favorite movie?" ≠ "favorite film?"). For tight prompt matching it works;
for free-form questioning it'll often miss. That's the same memorization-
not-generalization ceiling we keep hitting.

detective who happens to know Melissa's opinions on things. Unique flavor.

---

Open questions / things to revisit

(vs. faint signal)? May need 20M+ params + 5K+ multi-turn dialogues.

with a single run at 256.

Probably yes; need a small quality script.

---

Done so far