AI Behavior & Conversational UX / System Design / Product Discovery & Insight
AI Persona & Behavior
People change how they communicate depending on the situation. They can be playful in one moment, serious in the next, give a short answer when they're tired, make a joke when the conversation gets awkward, or go off on a tangent when something reminds them of a previous conversation.
So, how do we design an AI that can maintain a recognizable identity while still behaving like a real person?
state & condition
Knowing what someone would say is different from knowing how they would say it in a particular moment
The initial approach focused heavily on knowledge and personality.
The AI could be given information about the person, their background, opinions, and writing examples. But knowing what someone would say is different from knowing how they would say it in a particular moment.
Too consistent
The AI was helpful and coherent, but every response had the same level of effort. It was always ready with a polished answer.
Real people aren't.
Too performative
If the persona was described as funny, the AI could turn too many interactions into a performance.
A person can be funny without trying to be funny all the time.
Too tidy
Advice often came out as clean lists with explanations and examples.
Real conversations are messier. People interrupt themselves, change their mind, remember something halfway through an answer, or discover the point while they're talking.
Abrupt mode changes
The AI could move from playful to serious, from casual conversation to coaching, or from joking to emotional support too easily.
The individual responses could be reasonable while the conversation as a whole felt unnatural.
No sense of conversational rhythm
A conversation is not just a sequence of questions and answers.
There are short acknowledgements, pauses, callbacks, tangents, moments where nothing particularly interesting happens, and occasional bursts of energy.
The AI needed to control these behaviors rather than maximize them.
The Design Question
What system would give the AI the right behavioral choices for this person, in this situation?
Instead of asking:
"How do we make the AI sound like this person?"
We reframed the problem:
"How do we build a system that helps the AI choose how this person would respond in the moment?"
That led to three layers:
Identity
What does this person know, believe, value, and sound like?
Behavior
How does the person behave differently depending on the conversation?
Context
What is happening right now, and what should change or stay consistent?
Designing Conversational Modes
A single unusual message should not immediately change the entire personality
One of the first problems was mode whiplash.
A conversation might move between:
banter → deep → coaching → banter
without the user actually changing the register.
Instead of treating every message independently, we introduced the idea of a conversation mode.
The system recognizes registers such as:
Banter
Small talk
Deep conversation
Coaching
Task
Debate
Testing
Winding down
The important part was not simply classifying the current message.
The AI needed to understand whether the user had actually changed the register.
A single unusual message should not immediately change the entire personality.
So the mode system uses hysteresis, meaning a single ambiguous message isn't enough to change the conversational register:
Same mode
Stay in the current register.
Different mode, no clear shift
Hold the existing register and wait for more evidence.
Clear user shift
Switch immediately.
This prevented the AI from constantly reacting to individual messages and made the conversation feel more continuous.
This matters because people don't usually redefine the entire relationship because of one unusual sentence.
Designing Energy
Higher energy is a permission to perform, not an obligation
Mode alone was not enough.
Two people can both be in "banter" while having completely different energy.
We therefore separated conversational register from performance energy.
The AI could move between states such as:
Low → Medium → High
This allowed the same persona to behave differently without changing identity.
A low-energy turn might simply acknowledge something.
A medium-energy turn might respond normally and add a little personality.
A high-energy turn gives the system more permission to be expressive, such as using humor, vivid language, or a tangent when those behaviors also fit the conversation.
The important design principle was:
Higher energy is a permission to perform, not an obligation to perform.
This became particularly important for avoiding the “AI entertainer” problem.
Designing Variance
Stop capability from becoming a constant performance
One of the biggest discoveries was that making every response interesting actually made the AI feel less human.
So we introduced deliberate variation.
On some ordinary comedian turns, the AI could simply be present.
Not every message needed:
a joke
a metaphor
a clever callback
a long explanation
a punchline
Sometimes the right response was just:
“Yeah, I'm around”
or
“Pretty good, actually. Long week, but good”
Some behaviors need to happen occasionally, not every time.
For these behaviors, the system makes a reproducible probability-based selection. The same conversation state produces the same decision, while different turns are distributed so the behavior does not appear on a fixed pattern.
The user experiences this as natural variation, while we can still reproduce and test the decision when debugging the system.
For example, a quiet turn can be selected using a deterministic draw. It feels unpredictable to the user, but the system can reproduce the same decision for testing and debugging.
The goal isn't to randomly change the AI's mood. It is to create controlled variation within an otherwise continuous conversation.
Designing Delivery Shapes
Separate what the AI wants to say from how it delivers it.
The same underlying answer could be delivered in several ways depending on the conversation.
Vivid
Use imagery, comparisons, and more expressive language when the energy and context support it.
Ramble
For advice at performing energy, let the thought develop out loud instead of forcing it into a tidy list.
Quiet
On selected ordinary turns, remove the pressure to perform.
Restraint
Sometimes the best comedic response is to withhold the obvious joke.
Plain
When none of the performance shapes are appropriate, simply answer.
This created a hierarchy of delivery shapes rather than a single “comedian mode.”
The Important Constraint
Don't Stack Everything
One of the easiest ways to make the system worse would have been to activate every interesting behavior at once.
For example:
High energy + vivid + ramble + callback + joke + tangent
That might look impressive in isolation.
It would be exhausting in a conversation.
So when several behaviors could work at the same time, the system chooses one main delivery style instead of trying to use all of them at once.
For example, an advice response at high energy could support both Vivid and Ramble. Instead of forcing both into the same response, the system picks the stronger fit for that moment.
This keeps the behaviors from piling up and making the AI feel like it is trying too hard.
The result is less “look what the AI can do” and more like an actual conversational rhythm.
Callbacks and Relationship Context
A callback should come from the relationship, not from nowhere
Callbacks became another source of naturalness when relevant relationship context was available.
Instead of treating every message as an isolated interaction, the system could use information the person had previously shared to make the response feel continuous.
For example:
“I'm nervous about my presentation”
could receive:
“You were nervous about the last one too. You ended up being fine.”
The important part isn't the callback itself.
It's that the response feels like it comes from someone who remembers the relationship rather than a model generating an isolated answer.
But this also introduced an important boundary: relationship context can inform a response, but private information from other people should never become persona material.
Building the Behavior as a System
A set of deterministic gates rather than one giant personality instruction
The behavioral system eventually became a set of deterministic gates rather than one giant personality instruction.
Conceptually:
User message
↓
Triage
What is happening?
↓
Conversation state
What has been happening?
↓
Energy + mode + intent
What kind of moment is this?
↓
Behavior eligibility
Which behaviors fit?
↓
Frequency controls
Which behaviors have been used too recently?
↓
Behavior / few-shot selection
What does this behavior look like?
↓
Dynamic directives
What should change this turn?
↓
Existing generation
The LLM decides what to say
The system decides the behavioral constraints. The LLM still decides the actual response.
Few-Shots Show What the Behavior Looks Like
Telling the model what to do was not enough
“Be funny but don't overdo it” is vague.
Showing the model what the behavior looks like is much more useful.
So each behavioral register was paired with small, purpose-built example packs.
The examples demonstrated:
response length
rhythm
degree of performance
when to stop
whether to ask a question
how a tangent should feel
how an unfinished thought should sound
The instruction defines the boundary.
The examples show the model what that boundary looks like in practice.
Preventing Behaviors from Becoming Gimmicks
The system controls behavioral opportunities, not the conversation's energy.
Another problem appeared when a behavior worked too well.
If the AI discovered that a particular behavior produced good responses, it could overuse it.
A tangent every turn is not natural.
A joke every turn is not natural.
A quiet response every turn is obviously broken.
So we separated conversation energy from individual behavioral devices.
Energy can persist across several turns. A conversation can remain playful, warm, or subdued without suddenly changing personality.
Individual behaviors, however, can have frequency constraints. After a behavior fires, the system can temporarily make that behavior ineligible again.
For example:
Turn 1 → Ramble ✓
Turn 2 → Ramble blocked
Turn 3 → Ramble blocked
Turn 4 → Ramble eligible
The conversation does not become less energetic during those blocked turns. Other behaviors can still happen.
This turns:
"Occasionally make a tangent."
into an actual system constraint.
The model still decides what to say. The system simply prevents one successful behavior from becoming the entire personality.
What We Learned
Naturalness is not the same as capability.
A persona is behavioral, not descriptive.
A list of personality traits does not tell an AI how to behave in a conversation.
The system needs rules for how those traits manifest under different conditions.
Conversation needs memory of its own state.
Treating every user message as an isolated request creates mode whiplash.
The AI needs to know what register the conversation is already in.
Variation needs constraints.
Randomness alone does not create naturalness.
Some behaviors need controlled variation, while others need frequency limits so they don't dominate the conversation.
Deterministic selection and refractory periods gave us a way to create variation that was unpredictable to the user but reproducible and controllable by the system.
Performance needs permission.
Humor, vividness, callbacks, and tangents should be available when the context supports them.
They should never become the default expression of the persona.
Reflection
Behavioral registers were given deterministic refractory periods
The biggest shift in my thinking was moving away from the idea of a persona prompt.
A persona is not something you write once and put above the conversation.
It is something the system continuously expresses through:
identity + context + state + behavior + constraints.
That changed the design problem from:
"How do we prompt the AI to act like Kelvino?"
to:
"How do we build a system that gives the AI the same behavioral choices a person would have in the moment?"
That distinction became the foundation for the next part of the project: Persona Compiler, where we explored whether these behavioral characteristics could be derived from evidence instead of manually written.
System Design
Cross-Functional Alignment
Leadership & Influence
Superbank + OVO + Grab Integration
Designed the system logic and multi-surface UX for OVO’s savings product, aligning six design teams and multiple financial partners under tight regulatory and launch constraints.
UI & Interaction
Growth & Conversion
Product Discovery & Insight
Revamping Sign-Up Process
Redesigned the onboarding flow end-to-end to remove friction and clarify requirements, increasing registration success by 2.8×.
UI & Interaction
Product Discovery & Insight
Growth & Conversion
Adapting More Variants
Scaled the product detail experience to support more variants using a reusable pattern and component updates that preserved clarity and increased add-to-cart performance.