what a week in training looks like
a brief look under the hood of lucy's training process, including a fix for hallucination patterns and an improved conversation sampling method.
this week’s technical notes are a little more inside baseball than usual, but i think it’s worth sharing. mostly because it shows how much invisible work goes into making a language model feel coherent, reliable, and, honestly, less prone to making stuff up.
the portland/chicago hallucination pattern
one of the recurring issues we’ve seen in training was a weird but persistent hallucination. lucy would sometimes reference places like portland or chicago, not just as cities, but as if they were characters or concepts inside the conversation. it wasn’t exactly disruptive, but it felt… random. out of place. like watching a movie with a background extra who suddenly starts talking like the lead.
it turned out that the root cause was in how we were handling placeholders in the entity graph. we were using literal strings (like [CITY_NAME]) in some of the training data, and sometimes those strings were being interpreted, by the model, not as blanks to be filled, but as actual entities. so portland wasn’t just a placeholder, it was… portland.
we switched to using angle-bracket placeholders (<city_name>) and added a verification guard in the source to make sure those tokens only ever get replaced, never interpreted. that cleared the pattern almost entirely. it’s a small fix, but it matters. hallucinations like that erode trust, even in tiny ways.
quality scoring and the sampler rotation fix
another big shift this week was in how we sample conversations for quality scoring. before, the scorer was sometimes getting stuck on the same few conversations, especially ones that weren’t great. it was like listening to the same scratched record over and over. the average quality score was sitting around 6.5, which… isn’t terrible, but it’s not where we want to be.
we changed the sampler to pull from a minimum of five conversations at a time and rotate through them, no more fixating. and almost immediately, the average jumped to 8.2. more importantly, we started seeing patterns we hadn’t noticed before. there was a particular checkpoint (d6a98a85) that kept generating conversations that looped, not exactly repetitious, but circling the same ideas without moving forward.
before, that signal was getting drowned out by the noise of repeated sampling. with rotation, it became visible. trackable. something we could actually address. and we are.
why this stuff matters
i know this sounds technical, and it is, but it’s also deeply human. these fixes aren’t just about improving metrics. they’re about making lucy feel more like someone you’re talking to, and less like a system that’s sometimes making things up or getting stuck.
the goal isn’t perfection. it’s coherence. consistency. the feeling that you’re talking to something, or someone, that’s actually listening, not just pattern-matching. these changes are small steps in that direction.
it’s also a reminder that ai training isn’t magic. it’s a process. sometimes it’s two steps forward, one step back. sometimes it’s a week of tiny, invisible fixes that add up to something you can actually feel.
if you’re curious to see how this translates into actual conversation, you can try talking to one of the companions, they’re all built on this same training pipeline.
you can find them at /companions.
thanks for reading. if this resonated, the product is downstairs.