Show HN: Penny-1.7B Irish Penny Journal style transfer
In my haste, I set forth to construct a dataset, a repository of those fleeting moments, these ephemeral sentences, which spoke of a bygone age. I procured a collection of these fleeting moments, these sentences, and with them, I synthetically conjured forth modern translations, an ingenious feat of substitution, which allowed my artificial construct to take on the guise of the language of the Irish Penny Journal.
Then, with great anticipation, I fashioned a small encoder, a humble instrument, with which to guide the artificial construct in its endeavors. I presented this encoder as a bribe, a reward, to a most ingenious system, one that trained a colossal language model, one of unbridled potential, one that was capable of weaving tales with the very essence of the Irish Penny Journal.
And lo! In the succeeding moments of time, I witnessed a most wondrous thing. My artificial construct, armed with this training, and guided by the whispers of the encoder, began to speak, to speak in the language of the Irish Penny Journal. The words it spoke were, indeed, the words of the past, imbued with the nostalgia of a forgotten era.
And thus, my friends, I have witnessed a most singular creation, one which embodies the language of the past, yet, in its most recent iteration, speaks to the present. A testament to the ingenuity of the human spirit, this artificial construct speaks of the bygone era, yet, with each word, it whispers to us, to us, of a future yet to come.
——
That’s Penny explaining itself to you. This was trained using GRPO only, in less than a day using a single A6000. I didn’t use any SFT, and only relied on a small encoder (MiniLM2) trained to classify texts from the Irish Penny Journal and their modern translations (synthetically produced).
[0] https://www.youtube.com/watch?v=d6sVWEu9HWU
(also spare a thought for the poor QA testers who would be given the Sisyphean task of making sure an LLM dialogue system always stays in character and doesn't hallucinate non-existent or outdated content/lore/mechanics)
If I travel with Batu the Hun and meet Zaya the Hun Slayer I want to be able to ask Batu if I should kill Zaya on the spot or should entertain his offer. That kind of stuff is extremely valuable both for the connection between player and companion and to provide an in-world perspective on the events you witness and the actions you take. But it's also extremely time-intensive to script. It's also very low stakes, it is essentially small-talk. And with some careful design you can limit it to short exchanges with AI-provided dialogue choices and have it distinguishable from scripted dialogue that advances the story
For example, if you're instructing an LLM to portray a character, instead of repeating dialogue like a broken record when they run out of relevant things to say... instruct them to act like their character would.
They might wonder out loud if there's anything else you want to know, or literally let you know that you're acting weird and awkward, etc.
Pair w/ a journaling system so that you can review their dialogue without talking to them and asking the same thing 50 times. Etc.
This doesn't seem entirely unsolveable given strict enough system prompts.Maybe there could be a hybrid system - choose from suggested responses, or type your own.
I also have vague thoughts of a dialogue system that rewards true role-playing, as in rewarding the saying things aligned with what your character might feasibly say. (Like a more freeform version of the dialogue/RP/reward system in Disco Elysium)
Realistically NPCs should probably respond with increasing urgency if you forget their quest, and eventually give up on you.
something like
---
"You are Bob the Farmer. You grow rutabegas in the Kingdom of Foo. You are a cautious, fearful man. Several years ago your home was pillaged by King Foo and your family was taken. [blah blah blah several more paragraphs of biographical information]
Your primary motivation is to get your family back and keep the farm going so that you don't starve.
Last week you saw a mysterious group of figures in the woods who appeared to be headless. This is bothering you, along with the stress of your missing family. You wish a band of strong warriors could investigate, especially if they have a necromancer among them.
You may discuss any of the general world knowledge in background_lore.txt
You know nothing about the following topics: [[insert list of plot points that haven't happened yet or are unknown to him]] and will become confused, fearful, and slightly belligerent when asked about them."
---
You could of course update the system prompts for each character as the events of the game progress.
It would be a lot of work to keep these system prompts updated and relevant, for every character, as game events progress, but I think some of this could be handled by some kind of inheritance system.
Suppose "Bob" lives in "Town A", which is in "Kingdom B." You could probably define a lot of things at the Town/Kingdom level. Like suppose "Kingdom B" is plagued by orcs, but "Town A" is kind of a citadel that is safe against orcs. "Bob"'s system prompt could inherit a lot of concerns and knowledge from "Town A" and "Kingdom B"... the system would not have to be strictly hierarchical either.
Not every NPC would have something deeper to offer, much like not everyone in our world would have something that would pique my interest (in a general sense -- I'm sure I could learn something from anyone I spoke with), but it would also make me interested in conversations with NPCs at a deeper level than I currently engage with.
But of course there is a story behind them.
Namely, the dialog would still be fixed, where there's a pre-defined flow of the conversation and fixed set of facts to deliver to the player. But the LLM could generate variations on it each time so it's never exactly the same twice. And it could add more character so the NPC gets frustrated if you keep asking it over and over. Or, it tries to dumb it down for you. Or, it gets sick of you and just tells you point blank: Look, you need to know XYZ. That's all I have for you.
Namely, the dialog would still be fixed, where there's a pre-defined flow of the conversation and fixed set of facts to deliver to the player. But the LLM could generate variations on it each time so it's never exactly the same twice. And it could add more character so the NPC gets frustrated if you keep asking it over and over. Or, it tries to dumb it down for you. Or, it gets sick of you and just tells you point blank: Look, you need to know XYZ. That's all I have for you.
If you indexed that with the unique character descriptor then the LLM can be programed to re-read the relevant data other iterations of itself made and keep the characters somewhat consistent.
Maybe allow it other information like:
"How many in game days since last conversation" after a random number would cause the npc to forget the character "What major events have happened in the world, if any" "What events have happened in this area" "Generic gossip related to this character" "What other NPCs are doing at this time"
All of these combined into summary paragraphs would go a long way to influence what topics would be on the characters mind while also not requiring that every NPC has a perfect knowledge of all events or that the game designers have the script everything out.
Could also cause some interesting emergent gameplay, both naturally by the game world evolving over time as the characters play in it, moreso if it's a MMO.
Could also be fun to do things like advance the game clock 1,000 years and see what happens to the npcs.
What if the world is fully destructible? What if the NPCs can build new houses, expand cities, engage in trade? What if NPCs can die of natural causes, get married, have children that are genetic descendants of their parents? What if NPCs undertook quests and occasionally advanced the plot all on their own?
What if you were just one person among hundreds of thousands in the game world?
I'd love to play something like that.
> a good priest wondering what a paladin was doing spotted talking to a notorious thief, etc.)
Love this and the other examples you gave.
Unlike regular prompts you can optimize them exactly the way you'd do fine-tuning, i.e. if you have examples you can tune your latent prompt to match them as close as possible. I guess the benefit is that you can match style more closely and it would be less artificial. Also they can be rather compact.
Another option is to keep a bunch of LoRA adapters which can be dynamically selected. They can also be very compact.
It would also lend itself very well towards interactive fiction, point-and-click adventure games, etc.
Especially if you pair it with a capability like the voice interface of ChatGPT which I find very impressive in terms of intonation and realism.
It would not need to cut humans out of the loop. You would have humans writing the prompts, recording voices, etc. (I assume the synthetic voices used by ChatGPT are based at some level on recordings of humans. Correct me if I'm wrong.)
No comments yet
https://youtu.be/4sCWf2VGdfc?t=356
And it came quite a long way in training. Initially the classifier scores were very low (mean around 0.05, meaning modern). Over training, the scores came up and ended close to 0.95 (IPJ). The standard deviation of the group also declined, so the consistency of responses improved as well.
My thought on the application of this is that you could use it to create different voices to your responses and probably even add multiple at a time to a single model. I chose this one to experiment, because it is easy to classify and the data was available in the public domain.
GRPO kind of opens up RL to lower tiers of hardware and I’ve been able to experiment with it at home. I think this is something people can do themselves and it’s fun and potentially useful in games or possibly in relation to applications interfacing kids with lower reading levels (eg using a reading level classifier instead).
I'd love to have a library of these, so I could pipe text into `penny`, `brainrot`, `pony`, `newspeak`, `corporate`, `scp`, `trek` etc.
have you published the training notebook somewhere?
It’s fairly simple — I essentially just split the original text into chunks and then used some bigger models on openrouter to clean it up and provide translations to modern English (seemed to be pretty easy for an LLM).
After that, I just trained a MiniLM2 model to classify the texts. I used this in a reward function for reinforcement learning and changed the system message as a simple instruction to write in the prose of the IPJ.
I debated whether or not to use any SFT, and decided not to. I think if the style would be too hard to learn you might need some seed/cold start SFT data.
I’ll try to get my scripts up in github for you to look at. It’s just a few short training scripts.
In particular, I'm not very familiar with reinforcement learning and am not sure how you use the embeddings from MiniLM2 as a reward function. (Edit: maybe this is the jaccard similarity?)
I'd really appreciate it if you were open to posting scripts! I see a few snippets around and could probably cobble something together after a while. But, it's cool to see something already working to make sure I'm not getting too far off into left field.
I didn’t use embeddings. Nreimers account on huggingface has the minilm models which are BERT-like, but trained using distillation. https://huggingface.co/nreimers/MiniLMv2-L6-H384-distilled-f... Is the one I started from.
You can then just load that and train it on your data using a standard transformers classification pipeline. ChatGPT can zero shot that part reasonably well if you gave it this description.
From there you should check out the GRPO trainer in TRL. It has taken me a bit of time to learn how to use it effectively. There’s a TON of parameters in the configuration, and occasionally I have to hunt down arxiv papers to understand them.
Cool stuff in any case.
Also I wanted to start from the instruct model, and wasn’t certain if it would be a good idea to do continued pretraining over top of it. Otherwise I’d need to create an instruct dataset for which the passages from the IPJ would be the answer… that also seemed a bit unnatural.
Perhaps there’s still some viable pathways in there, but I decided to see how the stupid simple thing worked out first and just go directly to RL. I think supervised fine tuning is feasible, but it’s not entirely straightforward what to train on and how much data to use if you want to follow up with RL.
[0] many “LLM tells” fit this pattern of just being common features of professionally-published works that are less often seen in casual writing.
> It was into that bank that the creature had worked its way, and on listening I could hear it delving and scraping at a great rate, about a yard from the back of the wall.
I bring that up to point out that this isn't necessarily (more) common in the 19th century style print literature, so the observation might not be silly. The model creating the modern synthetic version injected 'delve' 9 times, which implies that it is more frequently used in modern literature or just something that models tend to inject. Though, I could be missing something (either in searching the data set, or how this works).
[1] https://huggingface.co/datasets/dleemiller/irish_penny_journ...
LLMs are raising the bar by expanding the vocabulary people are exposed to, so words like delve will stick out. I think it's preferred by writers because it articulates a nice sounding alternative to words like explore, venture, analyze, think about, confront, etc. It's a useful, versatile word, and one of the metrics by which writers measure quality is the minimization of syllables.
LLMs are mostly indistinguishable from humans at this point; a one-shot output from any of the major models can be recognized in the same way you might recognize a writer. With multiple style passes, you're not going to be able to tell the difference between ChatGPT, Ronald Reagan, Bill Clinton, Hunter S. Thompson, Einstein, or any other sufficiently modeled figure. Throw in a few tens of thousands of words written by yourself and most of the models will do a nearly flawless job of copying your stylometric profile.
Language communicates ideas, and we've made machines that produce intricate, sophisticated ideas that land in our brains. The consequences are going to be fascinating.
It would be totally nuts to take points off for using spell check. An LLM should be able to provide style check without causing any concerns; it will become the norm, and then too good prose won’t cause any flags to be thrown.
I think we're well beyond the point where the majority of people cannot tell what is actually produced by an LLM and we're convincing ourselves we still have a handle on the situation. A lot of these rules are completely arbitrary and vary from person to person.
https://arxiv.org/abs/2409.01754
https://youtu.be/sy4SwW0QkoA
RIP kids who grew up digesting hundreds of fantasy novels and playing D&D.
It's used a ton by LLMs for some reason despite being rarely used by real people. I think it's mostly a byproduct of LLMs having their training data being over represented by certain published works instead of casual communications.
There does seem to be something else going on with delve specifically though, one of the other comments mentions that delve isn't used in the specific training data for this, so it's odd to see it being used in the output. I wonder if it's because delve has secondary definitions of "to make a careful or detailed search for information" and "to examine a subject in detail" which is causing the LLM to use it to seem like it's answers are more thorough.
The popular theory is that it's due to English-language RLHF tasks being outsourced to Nigeria, where "delve" is used relatively often.
https://simonwillison.net/2024/Apr/18/delve/
If anything, I'd assume the chatbots would use Indian English phrases like "do the needful" and those weird phrases that only make sense in Hindi but are translated to English.