Passage

Take me ‘cross that river, Charon
For I have paid the toll
The coins once warmed by mortal air
Here mask my eyes with cold

Their gleam outlives my beaten heart
The furnace of my veins
And bones I borrowed returned now
Char and dust remain

The pyre’s tongue devours all
Embrace of final light
My face once bronzed by crimson sun
Erased to endless night

The stars withdraw their silver pins
A dirge fills the abyss
The earth before I trod upon
Grants an eternal kiss

Strip bare the flesh that tethered breath
Unbind the ribs’ tight cage
The lungs which laughed with every jest
Now whisper to the sage

Lethe erodes my resting place
Where once was writ my name
So rubble now is all that’s left
And ash where once was flame

Postscript

I got the idea for this poem when the words "Take me 'cross that river, Charon / For I have paid the toll" came to mind one day. I noticed they had a nice meter and could be a good start to a poem.

This was an experiment in collaboratively writing with an LLM. The new DeepSeek R1 model is uniquely well-suited to poetry.

It wasn't great at producing whole poems that had coherent meaning, but it was great at producing vibes and snippets. The collaboration wound up being me pasting in a few stanzas or couplets and asking for more similar ones, then picking through those to promising threads to pull on.

For instance, the final line "And ash where once was flame" is 100% produced by R1, though in a different context. But I liked the sound of it.

The final poem is probably 70% my words and 30% R1's. The structure and motifs are all mine. The most evocative imagery is R1's, for example "The stars withdraw their silver pins" and "Strip bare the flesh that tethered breath" is all R1.

It took probably 4 hours of collaborative work to produce the final iteration, with a lot of that time spent refining my techniques for probing it.

Learnings

It's very bad at filling in gaps, e.g. "write a stanza that ends with [phrase]".

It's great if you give it 1 starting stanza to set the mood, and then let it go from there — this is how I mined it for most of the imagery. I'd give it opening lines and some general mood words to inspire it and let it go. Re-run 10 times and collect the good bits.

It's not good at follow-up prompting. The results from a follow-up prompt are almost always worse. It's better to start a new chat with the original prompt + what you learned from its initial response and generate a new, clean initial response.

It's not great at reasoning about rhyme scheme and meter. It's decent, but sub-human. The poem above is ABCB and if you told it to produce ABCB it would sometimes produce ABBB or BBBB, etc.

It's much better to just let it intuit the meter from your example. The capability is already in the base model. I gave a stanza to Llama-3-70b-base and it was also able to continue with the same scheme (and decent-but-not-as-good-as-R1 diction!).

Models like o1 were hopelessly bad poets, though I still used 4o as a thesaurus, e.g. "I'm looking for a word that kind of means X or Y with vibes of Z, give 20 options".

I'm looking forward to writing more poetry with R1, it was a really fun process and I think I'm getting the hang of how to best use it as a muse.