Oliver Wakeford
All projects
Local ML
Local MLOngoing2026

Putting My Own Writing Into the Weights

No measurement taken

Fine-TuningLocal MLLLMsApple Silicon

Built with

OllamaMLXGemma 4QLoRAPythonClaude API

Not public

The corpus is my own journals, notes and client-facing work, so it stays private. The extraction script and the model config are the parts that carry the argument, and both are described here.

The voice system solves this by retrieval: pull the right examples at generation time and let a frontier model imitate them. That works, and it spends a chunk of the prompt on it every single time. The other option is to put the style in the weights, so it isn't retrieved at all, it's just how the model writes. This is the attempt at that.

It runs on one laptop with 48GB of unified memory, and the whole design is shaped by that budget rather than by what would be ideal. Gemma 4 31B: the Q8_0 build for inference, the Q4_K_M build as the training base: the larger build is near-lossless and fits comfortably for inference, and training has to drop to the smaller one because QLoRA needs room for the adapter and the optimiser state on top of whatever the base weights already occupy.

The extraction step walks my notes and pulls out prose, stripping frontmatter, wikilinks, code blocks and anything under 200 characters, then tags each file with a register based on where it lives rather than on what's in it. Journals are raw personal, the strategy documents are strategic, client-facing work is professional. That produced 66 files, 542,000 characters.

That's as far as it has gone, and the reason is more interesting than the hardware. The next step generates instruction-and-response pairs by asking Claude to write them from each chunk, which means fine-tuning a model on another model's imitation of my writing rather than on the writing itself. I don't have a good answer to that yet. It's a better objection than any of the ones I started with.

So there are two attempts at the same problem sitting next to each other. The retrieval one writes things I actually send. This one is a corpus, a config file, and an objection I haven't resolved.

What this does not show

  • The training run has not happened. What exists is an extraction script and a config file pointing at a fused model directory that does not exist yet.
  • Register labels come from where a file sits, not from reading it, so anything written in the wrong tone for its folder is mislabelled.
  • The corpus is lopsided: 36 professional and 25 strategic files against two raw personal, which is the register I most wanted it to learn.
  • No evaluation is planned beyond reading the output. The voice system has a rubric and a judge; this has neither.