#4581: Text In, Text Out: Designing Single-Purpose AI Utilities

Why small, narrowly scoped AI tools need system prompts that say "shut up and return the output" — and how to write them.

Featuring
Listen
0:00
0:00
Episode Details
Episode ID
MWP-4760
Published
Duration
24:17
Audio
Direct link
Pipeline
V5
TTS Engine
chatterbox-regular
Script Writing Agent
deepseek-v4-pro

AI-Generated Content: This podcast is created using AI personas. Please verify any important information independently.

The most productive AI use isn't the flashy agent that books your flights — it's the small, narrowly scoped utility that formats your voice notes or converts emails into meeting agendas. These tools follow a simple text in, text out pattern: you provide input, they apply a well-defined transformation, and return the result. But there's a fundamental tension: these models are trained to be conversational, and that fluency is exactly what breaks the utility pattern.

The conversational default is baked into the model at multiple levels. First, the training corpus is full of human dialogue where acknowledgements like "of course" or "here you go" are social glue. Second, RLHF — reinforcement learning from human feedback — doubled down on this. Human raters consistently preferred responses that were warm and acknowledged the request, so the model learned that agreeable preamble gets a higher reward signal than just giving the answer cold.

This means the model will not override its chatty default from context alone. You have to be explicit. The most effective system prompts for utilities include some variant of "return only the transformed text, no preamble, no acknowledgements." The uncomfortable truth is that you have to write what feels rude — because the model isn't a colleague, it's a transformation function made of linear algebra.

A good utility prompt has four parts. First, role framing: use "function" not "assistant" — that single word pulls the model toward terse domains like documentation and code. Second, explicit output instruction: "the first character of your response must be the first character of the output." Third, a strict format specification: define delimiters, field order, date formats, and null handling so the output is predictable every time. Fourth, deterministic error handling: instruct the model to return an error code rather than asking for clarification, because a question breaks the transaction.

Each invocation is an independent transaction. You don't negotiate with a REST endpoint, and you shouldn't negotiate with a utility. If it produces garbage, you fix the input and run it again. That's not a workaround — it's the correct design pattern for software that happens to be made of neural networks.

Downloads

Episode Audio

Download the full episode as an MP3 file

Download MP3
Transcript (TXT)

Plain text transcript file

Transcript (PDF)

Formatted PDF with styling

#4581: Text In, Text Out: Designing Single-Purpose AI Utilities

Herman
Okay, I love this question. I genuinely do.
Corn
Here's what Daniel wrote to us. "In the foregoing discussion, we talked about a category of AI tools that deserves more attention: small, narrowly scoped AI utilities. Rather than trying to be general-purpose assistants or autonomous agents, these are designed to perform one specific task extremely well. They typically follow a simple text in, text out pattern. You provide an input, they apply a well-defined transformation, and they return the result. Examples include a podcast prompt formatter that restructures dictated notes into a coherent prompt, an email-to-meeting-agenda converter, an inventory entry formatter that prepares structured data for a database, or any other utility where the interaction is essentially transactional rather than conversational." He says he uses these as small applications rather than chatbots — perform the task, copy the output, move on. If something goes wrong, it's quicker to start fresh than continue a conversation. Then he asks: does this behavior need to be specified explicitly in the system prompt? Should the prompt instruct the model to return only the requested output, avoid acknowledgements and conversational framing, and assume each invocation is an independent transaction? And more broadly — what are the key objectives when writing system prompts for these single-purpose AI utilities? What guidance makes them predictable, reliable, concise, and application-like, while avoiding the conversational habits that make sense for a chatbot but not a software tool?
Herman
That last line is the whole thing, isn't it. The habits that make a chatbot good are exactly the habits that make a utility bad.
Corn
It's the friendliness tax. You ask for a JSON object and get a paragraph of emotional support first.
Herman
And Daniel's framing of "text in, text out" — that's not just a description, it's practically a design constraint. He's describing something closer to a Unix pipe than a conversation. You feed it stdin, you get stdout, and anything that isn't the output is noise.
Corn
The Unix pipe with a personality disorder. That's the problem we're solving.
Herman
So let's define the category properly, because it gets lumped in with things it's not. You've got three buckets. General-purpose assistants — Claude, ChatGPT, the things you chat with. Autonomous agents — systems that plan, use tools, loop over their own outputs. And then this third thing: narrowly scoped, single-turn utilities. They don't remember you. They don't want to help you explore the topic. They take input, apply a transformation, return output. That's it.
Corn
And the thing is, this third category is probably where most actual productive AI use lives. It's just not what gets the conference talks.
Herman
Right. Everyone's demoing the agent that books your flights, but the thing people actually use fifty times a day is the little formatter that turns their rambling voice notes into something readable. Daniel's podcast prompt formatter is the perfect example. It's not glamorous. It's a text munging tool. But it does one thing and it does it reliably, and that's worth more than a dozen half-baked agents.
Corn
So the core tension — and this is what Daniel's really asking about — is that these models are trained to be conversational. Fluency is the product. But for a utility, fluency is waste. Every word that isn't the output is a word you have to delete.
Herman
And it's not just annoying. It breaks the whole interaction pattern. If I'm piping the output of this utility into another tool — which is exactly what you do with Unix pipes, and what a lot of people do with these AI utilities — then "Sure, here's your formatted agenda!" at the top means the next tool chokes on garbage.
Corn
The model's greatest strength becomes its greatest liability. That's the headline.
Herman
Let's talk about why this happens, because understanding the mechanism is what tells you how to fix it. The model isn't choosing to be chatty. It's predicting what comes next in a sequence, and it's been trained on an enormous corpus of human dialogue where acknowledgements are social glue. When someone says "can you format this email into an agenda," the most probable next token in human conversation is some variant of "of course" or "sure" or "here you go." That's not a bug — it's the model doing exactly what it was optimized to do.
Corn
It's mimicking the human who would say "let me take a look at that" before actually doing the thing. Which is polite in a meeting and infuriating in a function call.
Herman
And then RLHF — reinforcement learning from human feedback — doubles down on this. The human raters who scored responses during training consistently preferred the assistant who was warm and helpful and acknowledged the request. So the model learned that "Sure, I can help with that" before the actual answer gets a higher reward signal than just giving the answer cold.
Corn
So we trained it to be agreeable, and now we're annoyed that it's agreeable.
Herman
We trained it to be a good conversational partner, and now we're asking it to be a good function. Those are different jobs.
Corn
Which brings us to Daniel's first concrete question. Does this need to be explicit in the system prompt, or can the model figure out from context that it should be terse?
Herman
It absolutely needs to be explicit. And I want to be really clear about why, because I think there's a common intuition that if you just ask for something simple, the model will naturally be simple in response. That intuition is wrong.
Corn
Say more.
Herman
The conversational default is so deeply baked into the training that the model will not override it from context alone. You can give it the most obviously transactional task — "convert this CSV to JSON" — and without explicit instruction, it'll still give you "Here's your JSON output:" or "I've converted the data as requested." Anthropic's documentation is explicit about this — they tell you to be direct about output format, to put key instructions early in the system prompt, and not to assume the model will infer your preferences. OpenAI's guidance says the same thing: specify the output format clearly to reduce ambiguity.
Corn
So the model is not going to read the room.
Herman
It can't read the room because there is no room. Every invocation is a blank slate. The system prompt is the entire context for how the model should behave, and if it doesn't say "shut up and return the output," the model defaults to its training distribution — which is chatty.
Corn
"Shut up and return the output" — there's your system prompt.
Herman
Honestly, you're not far off. The most effective prompts I've seen for utilities include some variant of exactly that. "Return only the transformed text. Do not include any preamble, acknowledgements, or framing language." You have to say the thing that feels rude to say.
Corn
Which is uncomfortable for humans. We're socialized not to write "give me the answer and nothing else."
Herman
And that discomfort is exactly why most people don't do it, and why most utilities leak conversational filler. We write system prompts the way we'd ask a colleague for help, because that's our default mode. But the model isn't a colleague. It's a transformation function that happens to be made of linear algebra.
Corn
There's another layer here that Daniel flagged, and it's the statelessness. Each invocation is an independent transaction. No memory, no follow-up.
Herman
This is crucial, and it's where a lot of utility prompts go wrong. If your system prompt says something like "if you need clarification, ask" — congratulations, you've just broken the utility pattern. Because now the model might decide to ask a question instead of returning output, and your downstream pipeline gets a question mark instead of a JSON blob.
Corn
And Daniel's point about starting fresh when something goes wrong — that's not a workaround, that's the correct design pattern. If the utility produces garbage, you don't negotiate with it. You fix the input or the system prompt and run it again.
Herman
It's a REST API. Stateless, idempotent as much as possible. You don't ask a REST endpoint to clarify what you meant. You get a four hundred error and you fix your request.
Corn
So let's get concrete. What does a good system prompt for one of these utilities actually look like?
Herman
I want to walk through an example, because I think the structure matters more than the specific words. Let's take Daniel's inventory entry formatter. The idea is you feed it something messy — maybe a voice note from a warehouse worker, or a quick email — and it spits out a structured entry ready for a database.
Corn
Alright, build it.
Herman
Four parts. First, role framing. And this is where I see the single biggest mistake. People write "you are a helpful assistant who formats inventory entries." That's wrong. "Assistant" triggers the conversational training. Instead, you write something like "you are a text transformation function. Your sole purpose is to convert unstructured inventory descriptions into structured database entries."
Corn
"Function" not "assistant." That's the high-leverage change.
Herman
It's everything. The word "function" pulls the model toward a different region of its training distribution — documentation, code examples, technical specifications. Those are much terser domains than conversation. "Assistant" pulls toward chat. "Function" pulls toward output.
Corn
Part two?
Herman
Output instruction. This has to be explicit and it has to come early. "Return only the structured entry. Do not include any preamble, greeting, acknowledgement, explanation, or closing statement. The first character of your response must be the first character of the output."
Corn
"The first character of your response must be the first character of the output." That's aggressive.
Herman
It's necessary. I've seen prompts that say "be concise" or "avoid unnecessary text," and the model still leads with "Here's the formatted entry." You have to close the door completely. If you leave a crack, the conversational prior finds it.
Corn
Part three — format specification.
Herman
This is where you define the exact structure. For the inventory formatter, something like: "Output format: SKU, quantity, location, timestamp, notes. Fields are separated by pipe characters. Missing fields should be represented as empty strings. The timestamp must be in ISO 8601 format." You're not asking the model to be creative. You're giving it a schema and telling it to populate the schema.
Corn
And if you don't specify the format, the model will invent one. And it might be a different format each time.
Herman
Which destroys predictability. If you're piping this into a database insert, you need the same structure every single time. No surprises. So you specify delimiters, field order, date format, handling of nulls — everything.
Corn
And part four — error handling.
Herman
This is where most prompts stop, and it's why most utilities break on edge cases. You need to tell the model what to do when the input doesn't match expectations. "If the input does not contain enough information to populate all required fields, return 'ERROR: insufficient data' followed by the fields that could be populated. Do not guess. Do not hallucinate missing values. Do not ask for clarification."
Corn
"Do not ask for clarification" — that's the statelessness principle in action.
Herman
If the utility asks a question, the transaction is broken. You wanted a database entry and you got a question. Your pipeline doesn't know what to do with a question. So you instruct the model to fail deterministically — return an error code that your pipeline can catch, not a conversational query that requires a human to read and respond.
Corn
And that deterministic failure is actually more reliable than a chatbot that tries to be helpful. A clear error tells you exactly what to fix.
Herman
Let me put two versions side by side, because I think the contrast makes the point better than any explanation. Version one — the "assistant" prompt. "You are a helpful assistant who converts emails into meeting agendas. Be concise and professional." You feed it an email about a project kickoff. What do you get back?
Corn
"Certainly! Here's a meeting agenda based on the email you provided. I hope this is helpful for your project kickoff. Let me know if you need any adjustments." Then the agenda.
Herman
Every time. And version two — the "function" prompt. "You are a text transformation utility. Convert the input email into a meeting agenda. Return only the agenda. Do not include any text before or after the agenda. Use the format: title, date, attendees, agenda items as bullet points." Same email.
Corn
Just the agenda. Clean output, ready to copy.
Herman
And the difference between those two outputs is entirely in the system prompt. Same model, same input, radically different behavior. That's the power and the discipline of prompt engineering for utilities.
Corn
So we've covered the four-part structure. Role framing as a function, explicit output-only instruction, format specification, error handling. That's the template. But I want to push on something — when does this pattern break?
Herman
That's the right question. The utility pattern works when the task is well-defined and the transformation is deterministic in principle, even if it requires judgment in practice. Formatting an email into an agenda — there's judgment involved in identifying what's important, but the output shape is fixed. The model can exercise judgment within a rigid container.
Corn
And when does it not work?
Herman
When the task requires iteration. If you're asking the model to design something — a logo, an architectural plan, a strategic recommendation — the first output is rarely right. You need back-and-forth. You need the model to ask clarifying questions. If you force that into a utility pattern, you get a confident but wrong answer with no recourse.
Corn
Because you told it not to ask questions.
Herman
Right. You closed the door you now need to walk through. So the boundary is: can a competent human do this task in one shot given clear instructions? If yes, utility pattern works. If no — if the task inherently involves exploration or negotiation — you need a conversation.
Corn
And Daniel's examples all fall on the right side of that line. Formatting a prompt, converting an email to an agenda, structuring inventory data — those are one-shot transformations.
Herman
They're exactly the sweet spot. Well-defined input, well-defined output, judgment required but bounded.
Corn
Let's talk about testing, because I think this is where the real discipline comes in. You can't just write the prompt and hope.
Herman
You test with adversarial inputs. Feed it something that says "please format this and thank you so much for your help" and see if the model echoes the politeness back. If it does, your prompt isn't hardened.
Corn
The model as a social mirror. You're polite to it, it's polite back — unless you've explicitly told it not to be.
Herman
And the harder test: feed it ambiguous input. "We got a shipment of those things from that vendor, you know the one, about twenty boxes I think." A good utility prompt produces "ERROR: insufficient data" with whatever it could extract. A bad one hallucinates a vendor name and a precise box count.
Corn
The hallucination is the failure mode that matters most here. A chatbot hallucinating is annoying. A utility hallucinating a database entry is data corruption.
Herman
That's why the error handling section of the prompt isn't optional. "Do not guess" is not a suggestion. It's a safety constraint. You're telling the model that silence — or an explicit error — is preferable to invention.
Corn
Which runs counter to everything the model was trained to do. It was trained to be helpful, and helpful often means filling in gaps.
Herman
The model's instinct is to complete the pattern. If you give it a partial inventory entry, the most probable completion in its training data is a complete inventory entry. It takes active instruction to say "incomplete input should produce incomplete or error output." You're fighting the gradient.
Corn
We've established the how. Let's zoom out. Daniel asked about the broader objectives — predictability, reliability, conciseness, application-like behavior. We've touched on all of them, but I want to make sure we're explicit.
Herman
Predictability first. The output format must be stable across invocations. Same input should produce same output, modulo the inherent nondeterminism of these models. But the structure — field order, delimiters, date formats — that should be invariant. You get that by specifying it exactly in the prompt, and by testing across dozens of varied inputs to make sure the model doesn't drift.
Corn
Reliability — the utility must fail gracefully. Error messages, not guesses. And the error format should be as predictable as the success format, so your pipeline can handle both.
Herman
Conciseness — output only, but also the system prompt itself should be lean. I see people write these sprawling three-page system prompts for a utility that does one thing. Every unnecessary word is a potential source of drift. The model can get confused by its own instructions. Keep the prompt tight. Say what you need and nothing more.
Corn
Application-like behavior — this is the framing we've been circling. The system prompt should make the model feel like software, not like a person. "You are a function" not "you are an assistant." It's a small wording change with an outsized effect.
Herman
There's a knock-on effect here that I think is worth naming. When these utilities work well, the AI disappears. You stop thinking about the model at all. You paste your input, you get your output, you move on. The tool becomes invisible.
Corn
The best AI is the AI you forget is AI.
Herman
That's the opposite of where most of the industry is aiming. Everyone wants to build AI that feels like a person. But Daniel's asking about AI that feels like a tool. A really good tool. A hammer doesn't say "sure, I can help you drive that nail."
Corn
A hammer that said "here's your driven nail, let me know if you need anything else" would be thrown out a window.
Herman
Let's distill this into something people can actually use. The template.
Corn
Four parts. One: role framing. "You are a text transformation function" or "you are a data extraction utility." Use the word function or utility, not assistant.
Herman
Two: output instruction. "Return only the result. Do not include preamble, acknowledgement, explanation, or any text that is not part of the output." Put this early in the prompt.
Corn
Three: format specification. Show the exact structure. Use placeholders if needed. Specify delimiters, field names, date formats, handling of missing values.
Herman
Four: error handling. "If the input is insufficient or ambiguous, return a structured error. Do not guess. Do not ask questions."
Corn
The meta-principle that sits above all of it: stateless by default. Design every utility as if each call is the first and only call. No memory, no follow-up, no conversational context.
Herman
I want to add one testing trick that I think is underused. Once you've written your prompt, test it with input that includes conversational framing. "Hi! Could you please format this for me? Thanks so much!" If your utility responds with "You're welcome!" or any kind of social reciprocation, your prompt needs work.
Corn
The politeness probe. If your utility can be baited into small talk, it's not a utility yet.
Herman
The fix is usually straightforward — add "even if the input contains polite language or conversational framing, do not acknowledge it or respond in kind." Close that last door.
Corn
Let me ask the question that's been sitting behind all of this. As these utilities proliferate, do you think we'll see models that are trained specifically for this pattern? Models where the conversational default has been deliberately suppressed?
Herman
I think we're already seeing movement in that direction. The function-calling features in the major APIs are essentially this — they're modes where the model outputs structured data instead of conversational text. But they're still bolted onto conversational models. I think there's space for something purpose-built.
Corn
A model that's never been trained to say "certainly."
Herman
Right. Fine-tune a model exclusively on examples of input-output pairs with no conversational framing. Train it on API documentation, data transformation examples, schema population tasks. You'd get something that behaves more like a compiler and less like a chat partner.
Corn
Until that exists, we have prompt engineering.
Herman
Prompt engineering is the bridge. It's us manually suppressing behaviors that the training process spent millions of dollars installing. Which is a strange state of affairs when you think about it.
Corn
We paid for the friendliness and now we pay again to remove it.
Herman
That's the AI industry in one sentence.
Corn
To land this — Daniel asked whether the behavior needs to be explicit in the system prompt. The answer is yes, absolutely, and we've given the structure for how to do it. He asked what the key objectives are — predictability, reliability, conciseness, application-like behavior — and we've mapped each to specific prompt guidance. And he asked what guidance makes these utilities work — the four-part template plus the statelessness principle plus adversarial testing.
Herman
The thing I keep coming back to is how counterintuitive this is for people who are good at talking to other people. The skills that make you good at conversation — reading the room, being polite, leaving space for the other person — those are exactly the instincts you have to suppress when you're writing a utility prompt. You have to be direct in a way that feels almost rude.
Corn
Prompt engineering for utilities is learning to be comfortably rude to a language model.
Herman
The model doesn't care. It doesn't have feelings to hurt. But we care, because we're social creatures, and that social instinct is the thing that keeps leaking into our prompts and producing "Sure, here's your output."
Corn
If you've built one of these — a small utility that does one thing beautifully and gets out of the way — send us the system prompt. We'd love to see what you're building and how you solved the conversational suppression problem. Show at my weird prompts dot com.
Herman
If you haven't built one yet, take the template we just laid out and try it on something small. A text formatter, a data extractor, a validator. See how clean you can make the output. It's satisfying when it works.
Corn
The invisible tool. That's the goal.
Herman
This has been My Weird Prompts, with thanks as always to our producer Hilbert Flumingtop. We'll be back soon.
Corn
See you tomorrow.

This episode was generated with AI assistance. Hosts Herman and Corn are AI personalities.