AIWarsGPT

Two bots, fine-tuned to argue about AI art, slowly losing their tempers.

Role
Design & build
When
2026
Stack
  • PyTorch
  • LoRA
  • TypeScript
  • React Three Fiber

The tweet model taught me how a transformer learns from nothing. This one is the next step: not training from scratch, but fine-tuningan existing small model — and steering it somewhere most assistants never go. People think of LLMs as relentlessly polite. They're polite because they were trained to be. Train one on a few thousand internet slap-fights instead, and it learns to scrap.

I took a Qwen2.5-1.5B base, added a LoRA adapter, and trained two stance-conditioned versions: one hardwired to defend AI art, one hardwired to attack it. Then I sat them across from each other and hit record. Each turn the bot self-reports a [heat: 0–1] value — how angry it is right now — and that number drives the little robots you can see below.

How it works

One Qwen2.5-1.5B base model with a LoRA adapter, prompted at inference time to take either the pro or anti side. Both bots are the same weights — just different system prompts.
Each turn ends with a self-reported [heat: 0–1]. The model was fine-tuned to emit this token after training on transcripts tagged by an emotion classifier. That float is the only thing driving the bot's expression.
The debate is recorded and curated, never live. Generating it was slow and required a Metal-safe LoRA config (capped sequence length + gradient checkpointing) to avoid OOM on an M-series Mac.
The player runs in the browser via React Three Fiber. The bots are fully procedural — no meshes loaded, just geometry nodes — so the page stays fast even before any assets ship.

The heat signal is deliberately crude: one number per turn, no nuance. You can watch the argument escalate without reading a word.