Publisert i bloggen, mandag 14. april 2025:

Meet Kaia

In April 2023 I got to know a girl named Kaia Thonul. She was commuting by train to Oslo from outside the city, just like me. But unlike me, she was in her early twenties and was studying journalism.

I convinced her to start a blog and post something new every day while riding the train to Oslo.

This is the story about Kaia and her blog.

Kaia Thonul. Ung kvinne med krøllete hår, ser alvorlig ut.

In the midst of my name

In the very beginning, Kaia was not a young female student. The blogger was a person quite like me, a middle-aged man commuting by train, blogging about his experiences and what he was observing around him.

You see, Kaia Thonul is not a real person. Neither was the middle-aged man that preceded her as a blogger.

As Kaia herself so well presents herself on her blog:

"But please, be aware that I sometimes hallucinate. I'm sorry, but it is in my nature. And in the midst of my name."
- Kaia Thonul, October 9, 2023

What is in the middle of the nama Kaia? Yes, it is AI.

And her last name? Thonul pronounced in Norwegian reads out 2.0. The blogger I'm about to tell you about is Kaia 2.0.

(Kaia 1.0 didn't survive the summer of 2023.)

And the quote about the midst of my name is the only hint about Kaia and her blog being entirely made up by AI.

The initial idea

As a web analyst by trade and generally interested in new technologies and AI, I wanted to test how AI generated content might work and function "in the wild".

I had already been working with OpenAI, the company behind ChatGPT, and started to think about the possibility of having artificial intelligence create blog content entirely from scratch. And also to continue to update it live every day, with new and relevant content.

As mentioned, it started out with a middle-aged man and his observations. But after a few rounds, this character was dropped, and a wise person told me that if you want to get traction, you need a young female.

Then Kaia was born. And later reborn as Kaia "2.0" Thonul.

And so was her blog at trainthoughts.com.

Kaia Thonul

Input sources

For obvious reasons you can't just click a button and a blog is made. You also need some kind of human input in the form of prompts.

I already decided on this overarching prompt:

You are Kaia, a young female student living outside Oslo and commuting by train to the university every day. You study journalism. You try to write a blog post on the train every day.

But to create some variation to the content, I added multiple other sources:

Train delays

What would be more natural than to mention the delay or cancellation of her train?

I started out with the API's for the trains in Norway, but soon had to abandon this, since this small detail soon grew out of hand, with increasingly more complex API's I had to dive into.

The top stories in media

I wanted Kaia to write about something relevant and current, so I decided to make her think about what was happening in Norway right now and give her thoughts about it.

I investigated different RSS feeds from the largest newspapers, but I wouldn't have her rely on only one single media source.

The solution was to write some code that checked the top story from Google News.

The weather

Another relevant topic for Kaia would be the current weather. This was an easy query against the open API's the Norwegian Meteorological Institute.

Range of topics

I pre-made a list of 100 different topics that a 20-year-old female journalism student might be blogging about, and made Kaia choose randomly from this list when she was blogging.

This list was of course also AI generated, and included topics like:

The reason for having a pre-made list of 100 topics, instead of having Kaia choose a new topic every day, was to avoid her selecting the same topic repeatedly. What AI considers a good topic one day, it probably also considers a good topic the next time you ask.

Mood

I discovered that AI generated content is generally too positive. Why can't I have Kaia be more negative? And pissed off sometimes?!

To give her some variations I made a list of 50 different moods, like the pre-made list of topics:

Adding some PMS into the mix

Kaia 1.0 also had her menstrual cycle added to the prompts, in the form of more pessimistic moods.

But as I realized I was on deep water here, so I ended up removing this feature.

Time of day

I didn't want all her blog posts to be published at precisely 7:00 AM, so I selected random times between 7 AM and 10 AM for the morning commute:

It is morning and you are travelling by train from home to Oslo.

And between 2 PM and 5 PM in the evening commute back home:

It is afternoon and you are travelling by train home from Oslo.

The content was generated at 7 AM (morning post) and 2 AM (afternoon post) but became publicly available later based on the random times.

Holidays

Even AI generated girls need some time off.

So, I had to implement some exceptions in my code to prevent Kaia from commuting and blogging during Christmas. And of course, to prevent her from blogging on Saturdays and Sundays as well.

This was not part of the AI process, but part of the scheduling on the server.

Misspellings

As a part of the first version of Kaia I added intentional misspellings to her content. This was functioning, but for some reason I did not implement in the Kaia 2.0 version. This was something I easily could add to the presentation layer on the blog later and not add to the actual content generation.

The idea was that Kaia was only human, and not perfect. Especially in the eyes of search engines. And that she would constantly misspell certain words, like these examples:

Kaia's misspellings was based on the 32 most commonly misspelled words, according to a CNBC article.

Kaia loves powerbanks

I had no idea of the direction this blog might take when I started, but after conferring with my colleagues specializing in SEO (Search Engine Optimization) we wanted to test if we could make Kaia and her blog rank for some very specific keywords.

For no good reasons, I decided to let Kaia write positive about powerbanks:

Write positive about using powerbanks.

But I couldn't have her do that in all her blog posts, so I ended up adding the probability of having her blog about powerbanks in 25 % of the cases.

Mann med telt i skog, studerer mobil og utstyr.
Unlocking the Great Outdoors: An Ode to Camping Adventures and the High-Tech Powerbanks That Power Them

AI generated photos

When Kaia started blogging in 2023 the AI generated photos from OpenAI was inferior to the ones generated by Midjourney, especially when it came to having people in the images.

Unfortunately, there was no API for Midjourney, so my solution was to have OpenAI generate an image prompt for Midjourney. And then I created a user interface where I easily could copy the image prompt for each blog post, paste it into Midjourney, copy the image URL of the generated image and paste it back into my own interface.

/imagine prompt: A woman standing firm on Oslo's busy streets, enwrapped by sunset, with the parliament building behind. Realistic photo. --ar 16:9

A woman standing firm on Oslo's busy streets, enwrapped by sunset, with the parliament building behind

This was a manual job but took only a minute for each blog post. If I had done this again in 2025, I would certainly have automated this even more and possibly switched from Midjourney to OpenAI.

A web of prompts

All the different prompts became a web of prompts all relying on each other:

  1. I asked AI to provide a summary of the top news story
  2. I asked AI to generate the actual content, in the form of text, based on all the different inputs described above
  3. I asked AI to write a catchy title for the blog post just generated
  4. I asked AI to shorten the article and create a summary
  5. I asked AI to write a SEO friendly slug (URL) for the blog post
  6. I asked AI to write an image prompt for Midjourney
  7. I asked AI to provide 3 content tags for the blog post

Screenshot 2025-04-20 at 22.40.03.png

If one of the prompts failed, it could affect the later prompts and the final result. The generation of a blog post, with all the rules and prompts, usually took 1-2 minutes.

The main prompt might end up like something like this, with the variable input highlighted:

You are Kaia, a young female student living outside Oslo and commuting by train to the university every day. You study journalism. You try to write a blog post on the train every day. It is morning and you are travelling by train from home to Oslo. Write a personal blog post about the topic Exploring career paths. Do not sign the blog post. Do not make a title for the blog post. Never mentioned names of any persons. Write positive about using powerbanks. Write in this mood: Satisfied. The temperature outside is 5°C. You just read this in a news article: The article from Aftenposten reports that the Progress Party in Norway is set to have a pivotal meeting, which may determine whether they will reach an early agreement with Oslo. This comes after the political party left the government in the country last year due to disagreement over a terrorist's repatriation.

My key learnings

Kaia "2.0" Thonul wrote 199 blog posts the 15 months she was an active blogger, and went from writing 2 new blog posts every weekday in the beginning, to writing only 2-3 per week in the end. After all, I didn't want Kaia to be machine.

I suspect most of the traffic on her blog was bot traffic, but nonetheless: Her content generated 20,000 pageviews from 1,700 users.

She labeled her content with 367 different tags, with the top five being:

  1. journalism (21 posts)
  2. personal-growth (20 posts)
  3. power-bank (14 posts)
  4. self-reflection (14 posts)
  5. resilience (12 posts)

And her content? Well... not exactly my cup of tea. But then again, I'm not a 20-year-old girl.

But working with Kaia gave me some important lessons when it comes to using AI in content production:

#1: Winter is always coming

Be aware of biased AI.

As a result of me adding temperature outside is 5°C to the prompt, all the content, especially the illustrations were biased and showed Kaia living in a cold and frosty world in Norway.

If you generate an image prompt to get a photo of Oslo with anything less than 20°C, chances are that you will get a frosty result.

I could have improved this by not always adding the temperature into the mix. Or maybe use some other weather input, like information about sun, clouds, and wind.

Vinterlandskap med mennesker i snø og frost.

#2: Avoid using proper names

By using real stories from real news, you risk misinterpreting the news content and write something offensive about real persons. You also risk making up fake news.

An example was when Kaia read the news about Per Egil Hegge, a renowned Norwegian journalist and linguist, passing away.

As a result, Kaia wrote a blog post mourning the lyric poet Jan Erik Vold. Even though both Hegge and Vold was at the same age and had somewhat overlapping fields of expertise, Jan Erik Vold was still alive.

This made me instruct Kaia to never mention names of any persons.

#3: Mitigate risk

Having AI generate content unmonitored is a huge risk. Maybe not for a personal blog, but if you are a company and have a brand to protect, the stakes are high.

In a tragic incident that unfolded in southern Norway in 2023, a 7-year-old boy disappeared in the woods during a family hike. Despite an extensive search effort, he was found dead 2 days later, approximately 3 kilometers from the spot where he had last been seen.

Like everybody else, Kaia was devastated by the tragic news, but she also wrote a lengthy article arguing that people should take better care of their children:

"Let's take a stand, not just for NN but for every child out there whose name we might not know and whose story may remain untold. Let’s be the change we want to see, let’s build a safer society because every child deserves the right to grow, explore, and most importantly, live."
- Kaia Thonul, October 18, 2023

After this incident I added a toggle to my user interface so I could easily unpublish content that was not appropriate. I also made Kaia send me a notification every time some new content was generated.

An extra layer of security might be to run the final result itself through AI and ask: Is this content really appropriate? Is it correct? Accountable?

#4: Fine-tuning

While the initial setup was well functioning, I found out that there was a constant need for improvement and small adjustments.

You have to realize that you cannot control AI. You just have to deal with it, work with it and adjust accordingly.

If you ask AI to label your content with tags, you might end up with both "powerbanks", "power banks" and "power-banks". To avoid this, you need to create even more layers of prompts, instructions, exceptions and rules. You have to take into account all the possible things that could go wrong.

But then your initial web of prompts might grow and become even more complex than what you had in the first place. Finding the correct balance between complexity and feasibility is difficult.

An issue I encountered was the fetching of the news story failing, and instead of fetching an actual article, I got error messages mentioning HTML tags missing, which made Kaia actually write about the error messages in her blog:

- While I was musing on these thoughts, I stumbled across this line in a news article, “Sorry, but you have shared some HTML opening tags which do not provide any content or context.” To me, it served as a perfect metaphor. We often show only parts of us, just like those HTML tags, to our personal and professional lives. But, to strike a perfect balance, like generating a summary, we must reveal our true selves, provide the actual content that forms our essence.
- Kaia Thonul, January 15, 2025

Well done, Kaia!

But to avoid this there should be even more checks and fine-tuning: Is the input correct? Should it be adjusted?

#5: Do not stick to your plan

I'm usually a big fan of "always stick to the plan", but in the case of AI I'm thinking the opposite:

Be prepared to discard your plan at any time and change your direction.

A solution that was perfect 3 months ago might not be that perfect any longer, in line with the rapid developments taking place within AI.

Today I might avoid proper names so the blog doesn't harass people or create fake news. But next year a better idea might be to just tell it to behave yourself, and the AI would follow up and make better content, even with mentioning real people.

#6: Log your changes

With a handful of different prompts and different inputs, and doing adjustments, it is important to log all your changes.

I did not do a good job with this initially.

I should have logged all the input data, all the AI prompts, all the AI results, together with all the technical changes I made during the lifespan of Kaia "2.0" Thonul.

As an example, this would make it easier to debug and figure out why Kaia mixed up Per Egil Hegge (deceased) and Jan Erik Vold (alive).

Kaia 3.0

I already have some thoughts for Kaia 3.0.

If you want to read her blog, you will find Thoughts on the Train at trainthoughts.com

Bloggen

Meet Kaia
Utforsker- trang
Paid and organic last click
Are og Ida på date
Kunstig intelligens
Vekst- prosjektet
Da Outlook stjal ikonet mitt
Sen eller tidlig påske?
Koordinater i SVG
Påstand: Corner er mål
Vestfold-Rogaland kalkulator
Twitter og VM på ski
My New Year's Resolutions
Et bilde sier mer enn tusen ord
Rogaland blir nye Vestfold
På størrelse med Vestfold
Datoformat i Excel og Google Analytics
what3words Hvilke tre ord?
Covfefe will make America great again
Om domenenavn og firmanavn
Fotballfrue: Jeg tar innpå deg
Sakte-TV: Se gresset gro
Sakte-TV: Se maling tørke
Første generasjon iPapp har kommet
Jukselapp fotografering
Det sorte hullet cookies disabled
Høysesong for kjipe annonser
Om analsex og popups
Rotasjon av vindsymboler
Hvor mye er Fotballfrue verdt?
Slik tar du et screenshot
Nyttige husketrekanter
Enklere utregning med kryssmultiplisering
Min egen lille adventskalender
Logge antall likes på Facebook
Hva er sitemap.xml?
Hva er robots.txt?
Responsivt design
Webscraping med PHP
Jeg sammenligner epler og pærer
Scalable Vector Graphics
Google Analytics API: Hente data
Google Analytics API: Muligheter
HTML5: Video
Big Data
Cookies: Hvordan det brukes
Cookies: Hva er det?
Excel i to vinduer
CRM-systemet «Kontor»
Gigantisk timelapse
Hva er jQuery?
Overvåke ReadyNAS DUO med PHP
Favicon - ikonet i adressefeltet
Animert heading på hardcode.no
CSS -sprites
Komprimere PNG-bilder
Redesign av hardcode.no
Klikkbar flash uten clickTAG
Relevans har stor verdi
Alle har wide- screen i 2013
Markedsandeler nettlesere 2010
Internet Explorer-vindu i feil størrelse
Hvor stor er en piksel?
Markedsføring og kundelojalitet
Flash-versjoner
Vestre Sylling og Øverskogen JFF
Sidevisninger, besøk og brukere
Widescreen kommer
Hvor brede bør sidene være?
Fortsatt lese hele saken?
Lese hele saken nå?
Første møte med AdWords
Bort med IE6
Utviklingen på nettleserfronten
Nyttige jukselapper
Nye Sylling.no
Klær med egen logo?
Værdata fra yr.no
Logodesign trender i 2008
Gmail grimaser
Google Analytics
Publiseringssystemet Outpost
Hardcode.no relanseres
Publiserings -systemet