I recently built a small game that uses a fine tuned GPT2 model for content generation, and I wanted to jot down some notes about game design decisions that came up while creating it, without getting too bogged down in the technical details that often dominate machine learning discussion.
If we imagine language models as black boxes that take arbitrary input, and output entertaining text, it becomes very natural to think that the best choice for building gameplay around these models is to let the player craft the input, and be entertained by the output. An alternative I wanted to explore is casting the player as an editor to the machine’s author. Since the model is authoring all of the text, I never felt like the model missed the point of my input. I’d get to enjoy watching sillier options drift by, before picking an option that thought would lead to the most sensible next options. In general, I found “read and curate machine generated text” to be a more novel and relaxing decision space than “coauthor a text with a silly robot.”
Initially, I had the idea that the user should be able to take part but not all of an incoming language block by breaking it apart. I had ideas about deleting words, and having special prompts and phrases like “SETUP:” and “SCORING:” always available to the player. All of these ideas fell flat in testing. I arrived at the conclusion that the key gameplay loop is the curation of the samples generated by the language model, and the model’s response to the player’s selection. As the player learns to adapt to the model’s idiosyncrasies, they can generate more coherent games, which feels rewarding. Artificial ways to introduce coherence felt less rewarding to me, so these ideas were cut.
Small models fine tuned on small datasets generate a limited amount of novelty. The first time a GPT2 recipe generator suggests that you "dice water" is delightful. The tenth time is rote. A clever game designer could build complicated and interesting gameplay loops around a model's particular flawed view of reality, but for the purpose of this game, I wanted to make sure that players always have an exit available. I played with two other ways of ending the game in testing, a hard word limit, and a static button that allowed the user to append the words "the game ends when " to the text block to try to trigger a good wrap up. Ultimately neither was as satisfying as the freedom to restart whenever the player is bored with the game they are generating.