I probably mentioned this before, the growing count of articles here calms my mind in the midst of my fruitless job search thus far. With that said, I also pay more attention on producing better content. As a non-native English speaker, I rely on an LLM chatbot’s editorial assistant to achieve the goal. Every session ends with a brief discussion on the final draft. Sometimes, I also do a short brainstorming session to get some idea on what to write next. Last week, we briefly discussed the growing complexity of our setup over time. That’s also the moment I realized it is likely worth the effort to draft a post to answer this question — How do I write for KitFu Coda?
Copilot’s interpretation of this article.
The Question in the Age of AI: Is Long-Form Dead?
My Writing Journey: From Chinese Stories to English Technicalities
Blogging is not new to me, I always enjoy writing, and started a blog in Chinese years ago, before social media went mainstream. Besides dumping my thoughts and life events, I also blogged movie reviews and photo-walking or travelogues. However, the content I like the most is creative writing, usually in the form of stories in various lengths. At the time, I was placed in an environment where I needed to communicate mostly in English. To some extent, the experience relates English to serious work discussion, and I always feel a disconnect in expressing myself in the language.
After starting my first job, I created another blog, purely for technical articles. KitFu Coda (this very blog) can be seen as a reincarnation of it, with a revised focus — to be written for actual readers. Yes, for a long time, the original blog was purely written for myself, as an open notebook. Practically, no effort was put in to make the content readable.
Photo by Stephen yu on Unsplash
In contrast, my personal blog in Chinese went on getting nominated and winning blogging contests. I also eventually went on to signing up for classes in story writing, as well as attending a workshop in authoring screenplays. As I got better, more of my work got published, and I eventually won a consolation prize in a short story writing competition.
The Struggle with English Expression
The little success deepens the mental barrier in writing for this blog. The goal of writing to an audience was set in the beginning, warranting the decision to start anew at Medium. I concluded a project, after the retrenchment earlier in the year, and needed to keep myself busy while looking for the next gig. Unlike in a classroom or even a work environment, I didn’t have anyone proofreading my work, so earlier works were published with a lot of self-doubt.
Photo by Ryan Snaadt on Unsplash
Having to produce articles in a more periodic manner, is an interesting struggle for a software engineer like myself. Therefore, I pushed myself to experiment with ideas, given the amount of free time I have. AI-enhanced editors were starting to gain a bit of traction, and that’s when I explored the collaboration with an LLM model. Genruler and Genstates were the two projects I built with varying degree of assistance provided by the LLM model. Around the same time, I also started to contemplate the idea of employing readily available LLM chatbot as my editor.
And I quickly put the idea on to test.
The Spark of AI Collaboration
I am sure a lot of people are like myself, having a tendency to start focusing on improving quality after repeatedly working on similar tasks. The decision to get LLM chatbot as my editor stuck, and it sparked more thoughts the more I work with it. The biggest question so far, as raised by a friend in a discussion, is whether it is still worthwhile writing long articles in this era of instant gratification?
Photo by Andy Kelly on Unsplash
Instead of attempting to find the ultimate answer to the question (definitely not 42), my approach would be incorporating storywriting elements into my work. The inspiration came to me, when I was writing one of the Advent of code articles. I almost worded the idea as a joke in my prompt, but it seemed to work. That began my journey of opening up, offering an intimate and personal narrative to the articles. The article on the self-hosted album is a clear evidence of this.
A Love Story in Code: Building My Self-Hosted Photo Album
Plus, the writing of the article also opens up the possibility to be adapted into a script for video.
Though not a definite answer to the big question, I still find the realization to be inspiring. Producing a video is not exactly something I can comfortably fit into my schedule for now due to the sheer amount of work involved. The fact that I am still struggling to keep enough ideas to maintain a fixed publishing frequency also deters me from pursuing the video idea
That’s the journey full of self-realization into writing for the blog. Read on to learn how to personalize your chatbot as editor, and come along as we journey into the world of story telling.
Beyond Grammar Checks: Evolving the Article Workflow
Initial Setup: Prompting the Editorial Assistant
I want to write a new post at kitfucoda.medium.com. Please provide editorial assistance, I will send draft paragraph one at a time, and please go through and check for language errors. If any part of the paragraph requires a rewrite to flow better, prompt me without providing example. Do not include a revised paragraph at the end of response.
I usually start a new conversation with a prompt as shown above, whenever I start drafting a new article. The collaboration started before Gemini, my usual chatbot of choice offered to save my information, so I type a variation of the prompt each time. Most of the time it worked well, my biggest worry would be grammar, especially when it comes to applying the correct tense consistently. It is also surprisingly good at spotting writing tone problems, often pointing out I am being overly casual.
Maintaining Authenticity: Why I Opt for Rewrites
It is crucial to ensure the article feels genuine, so I opted to prompt for a rewrite, instead of relying on it to generate a replacement. The GenAI detectors are catching up and do quite well in spotting traces of LLM generated text these days. In our case, we want to ensure as much as possible, the vocabulary choice comes from us writers. Lastly, the chatbot also tends to return a fixed, revised paragraph after every submission so it is important to instruct against that.
Our voice would be retained with this strategy, at the expense of increased interaction with the LLM chatbot. As a result, if a disclaimer on AI use is required, we probably shouldn’t say something like “with light edit from LLM chatbot …”.
Adding Storytelling to the Prompt
Photo by Mike Erskine on Unsplash
As we mentioned previously, I eventually started writing as if I am writing a story. So a new sentence is added to the initial prompt:
I want to write a new post at kitfucoda.medium.com. I want it to read like a story. Please provide editorial assistance, I will send draft paragraph one at a time, and please go through and check for language errors. If any part of the paragraph requires a rewrite to flow better, prompt me without providing example. Do not include a revised paragraph at the end of response.
Alongside the initial prompt, remember to also include some key points to be included in the article. The chatbot will then help to structure these points into a writing plan. Further refinement can be added with exchanges of messages, but the rule of thumb is try to do all the preplanning within this stage so we can focus just on writing later.
Structuring with 起承轉合 (Qi Cheng Zhuan He)
When it comes to storytelling, a very popular way to structure a story is in the form of introduction-development-twist-conclusion (起承轉合). It originates from the way stories are told in Chinese culture (also likely adapted by the Japanese and Koreans). When I was attending my story writing class, the teacher demonstrated the idea with 4-panel comics. Let’s randomly pull a xkcd comic to illustrate the idea:
- 起(qǐ) — Introduction: The setup of the story, in this case an introduction of pygmy rabbit, and a grant proposal to introduce it to the east.
- 承(chéng) — Development: The story progressed according to the setup in previous panel. Given this is a grant proposal, a panel of evaluators grilled the person pitching the idea.
- 轉(zhuǎn) — Twist/Turn: A story without a twist is just an event, this is where we should introduce an element of surprise. Instead of providing logical argument, the person became emotionally-driven and started yelling.
- 合(hé) — Conclusion: Something disruptive happened, and the conclusion is how it is being resolved. In the comic, the group of people seen as needlessly logical just now reacted to the twist with their approvals. End of story.
Most of the time, a twist is driven by a conflict. In the case of KitFu Coda, where most of the articles center around sharing technical insight, that would often mean my struggle in learning, failing to comprehend the documentation, bug encounter etc. Of course, I am still quite new in the area, so there are times where a revision of plan is necessary. The key is not to get discouraged when it happens, just attempt it again in the next article.
Seeking External Feedback: The Laws of Linus
Sometimes, I go around seeking explicit feedback from my peers. After publishing the article on dunder, it was pointed out that the premise stated in the title was not answered in the article. A friend then shared a link, detailing tips for content creation published by a renowned Youtuber called Linus Sebastian. Though it was for video creation, the criteria fit article creation too.
Gemini is able to parse YouTube videos. Since then, I start a new writing session with a link to the video, asking it to incorporate the laws in reviewing my drafts (skipping the list of criteria and explanation for brevity). Incorporating storytelling and the laws of Linus does improve the readability, though at the expense of increased writing time.
Refining the Process: Addressing Repetitive Patterns and Tone
Till now we are still doing one paragraph at a time, and setting up a writing session requires the same set of prompts every time. Fortunately Gemini brought saved info and canvas to free users not too long ago, simplifying the process a great deal. Now it is possible to review work at a larger scale. One problem suddenly became apparent — the pattern of reusing the same words at the beginning of sentences.
(yes, I intentionally wrote the em-dash)
Fortunately, it can be addressed by saving the following to the saved info setting panel.
When you play a role as my editor, do take note of how I repeatedly start sentences similarly when you are going through the draft in broader scope than one paragraph. Point out the problem, and suggest some alternative ways to fix them.
And yes, I saved this alongside (but separately) the earlier prompt, with a summary of the video as well.
Photo by Annika Gordon on Unsplash
Another issue I noticed, was how Gemini is picky about my word choice. Overly casual, is a common feedback I received. We spent some time discussing on the matter, and came to an agreement on the tone of narration. Again, save this
Tone Note for articles written for kitfucoda.medium.com: Write like explaining to a colleague you know well. Blend personal anecdotes/story with clear technical steps. Ensure accuracy. Avoid overly casual language.
Genstates: A Goal-Oriented Approach
The whole set up process reminds me a lot of my exploration of AI-assisted editor when I was building genstates. Though in this case the experience was more closely related to what people call vibe-coding now. Vibe-coding is mostly defined as building a software project iteratively, by submitting prompts explaining a “vibe”. The requirement is often not very concrete, at least in the beginning.
I started the shift to the AI-assisted editor, after I am done building a crude implementation of the library. Tests and documentation were not written at this point, so a series of prompts were issued. Strictly speaking, it is not exactly vibe-coding, as I have a rather clear goal I want to achieve. Throughout the whole process, I also got it to fix some bugs in the first iteration.
Genruler: More Akin to Vibe-Coding
On the other hand, for genruler the experience is more akin to a vibe-coding experience. My original implementation uses hy as the parser, hence importing it would pull the whole package, which is not ideal. After having some success with genstates, I figured it may be worth trying to redo the parsing with a lighter, smaller library.
And I tried.
I didn’t know what would break, what adjustments to be made, but eventually things worked and the prewritten tests passed. Considering how the parser is essential to the project, I consider myself lucky things turned out to be fine. Eventually I went back to study the generated code and compared it to the documentation. That was how I learned to parse computer code and applied it to the Advent of Code puzzle.
How to parse computer code, Advent of Code 2024 day 3
Crafting Stories in Chinese: AI in Creative Writing
So all these are done with a lot of intervention from us the user. How about further automating it without writing a single code, or even a single word in the case of writing, i.e. real vibe-coding, or vibe-prompting?
Text generation is often perceived as the biggest achievement of contemporary LLM. Despite that, due to the risk of generating misinformation, the feature is often nerfed to some degree. But with some effort it is still possible to get language models to compose a story, by providing them some story elements.
I ran an experiment with a last-gen model in Gemini in the past, and the result was really bad. Now with a new 2.5 model, and my recent venture into utilizing canvas, maybe it is time to redo the experiment. I generated 3 stories in Chinese, increasing my level of involvement in each of them. The point of the exercise isn’t to produce a work I would proudly send it to be published, but finding how to collaborate in a creative writing project.
Photo by Brett Jordan on Unsplash
The model update does improve the quality and reliability to a certain extent, even with the free flash model. I supplied rough story genre and some vague description of plot points for the first story. The resulting story was logically sound, and most importantly very readable. The claimed context window seems to be working as the story that was almost 17,000 words long feels coherent from the first chapter to the end.
For the second story, I gave it some notes on world and character building, a rough story narration style, key plot points, and specifically requested it to follow the hero’s journey (another commonly used approach to write a story). This time, the word count was 30,000 words, to be split into 9 chapters with an epilogue. Like the previous attempt, I opted for one chapter at a time, but provided significantly more details before generating each.
With more input, the quality improves significantly, almost good enough to pass as a fresh amateur writer.
In my third attempt, I pulled out some settings in a story I plan on writing for the experiment. In addition to the type of information I provided previously, I also requested the work to be written in a specific “vibe”. It was to be written in a way that reads somewhere between prose and poem. To emphasize the vibe I am after, I purposefully did not quantize the desired word count of each paragraph, and kept refining the writing style in the first chapter for close to an hour.
In this iteration, I also played a very active role in deciding the plot. Most major decisions were made by myself, leaving only minute details to be filled. Thinking back, the time spent on iteratively prompting could be better spent writing the story myself. Too much time was spent on nitpicking to ensure a consistent writing style. In contrast, deciding the key events and all the world/character building work took much less time.
This time, the produced work can likely pass as a crude first draft written by a somewhat experienced writer.
Learnings Across Domains: Copilot, Not Replacement
Incorporating LLM into our daily work is slowly becoming a topic we need to face at work. Coincidentally, I had this very discussion in my job interview last week. From my point of view, LLM can be a valuable partner in our work, as demonstrated in this article. Given how it is changing how we work, the real key question is how much we choose to involve in the process.
Contemporary LLMs are quite capable nowadays, as they can likely produce work with minimal input. That said, we also saw how quality improves with more input. In the end, is it worth spending the time fixing minute details (like how I focused on a writing style I am after)? In software engineering, the analogy to this question would be whether it is worth the time writing it in a functional, or object-oriented approach.
In the end, code has to be written, and what really matters is whether it meets the business rules. As my supervisor in my previous job mentioned repeatedly, treat the LLM chatbots as your interns, and delegate all the menial jobs to them. Yet, we see non-techies complaining on social apps about how vibe-coding cost them money in the long run due to critical bugs hidden in the generated code. Clearly, they don’t understand what was being generated.
Photo by Possessed Photography on Unsplash
That brought another risk we don’t usually discuss until damage is done — LLM hallucination. Critical thinking is still crucial, especially in a vibe-prompting setting. IMHO, LLMs are best treated as a copilot, instead of our equal, at least for now. They are very capable at the job, but in no way they should be left doing work without supervision and careful revision. When I was asked in the interview whether I should let LLM take over my job, I often explain how our relationship would be more like a collaboration, instead of following its lead.
In short, get them to do all the boring, background tasks (tests/documentation for software engineering, help with world/character building and arranging plot in writing projects), but have more control of the actual task (writing actual words and code).
The Road Ahead: Continuous Refinement
We discussed a great deal on how I collaborate with LLMs, and proposed a strategy to collaborate with them. Maintaining control of the actual work is crucial in meeting the actual goal (business rules for software engineering, and readable work for writing projects). On the other hand, their ability to analyze and complete seemingly boring tasks could be well-utilized, so we could focus on the real important work.
I doubt if there is a definite answer to the question raised earlier, whether it is worth the effort writing long articles in this era of instant gratification. Still, I want to go on this journey looking for an answer with my own hands (or pen, or keyboard). In the case of technical writing, where the point is often exchanging knowledge and insights, modern LLMs can do the job very well. Not only could they tailor the content to user’s preference, but they could also be the source for complementary information.
Photo by George Liapis on Unsplash
Answering a yes or no is easy, but I see this whole journey as a quest. My current strategy, hoping to lead to a ‘yes’ answer, involves injecting my personality into the writing. It is interesting to note that the revelation came by repeatedly revising how to work with LLMs.
If the goal is not on competing with the LLMs, then we might as well leverage them as a tool. Earlier, we discussed my current setup and how it evolved over time, focusing on getting it to play the role of a capable assistant. Through some experiments into vibe-prompting in general in both software engineering and creative writing, we also found out though quality of work increases with involved intervention. However, spending too much time chasing after a certain writing style (or coding paradigm) may not be the best use of time.
Just start writing yourself.
As detailed previously, I stored all the editorial instructions in Gemini’s “saved info” section, so no more typing the same prompt over and over again (yes, I know I could just save a copy somewhere and copy-pasta over). The workflow would begin by typing key points and get the chatbot to help structure them into a writing plan. Once completing the content plan, then the editing process starts as I write into the generated canvas window.
The process is by no means perfect, and the point of this meta article is to document my current setup, and discuss the current state of affairs in the domain of LLM. My opinion, and the proposed process are subject to change, as tools inevitably become better over time. Having said that, I expect to revise the topic again in the future here on KitFu Coda though likely not on a predictable periodic basis.
While this article was drafted and refined with AI assistance (Gemini), the voice, ideas, and insights are solely mine. I’m open to project collaboration and job opportunities. Connect with me on Medium or Linkedin.