Roleplay or Reasoning?
What your synthetic respondent is really doing when it answers
In a recent post I argued against a common way of talking about digital twins in synthetic respondent research, the habit of saying a synthetic respondent “thinks like” a 45-year-old shopper or “prefers” this product over that one. I called it the homunculus fallacy, because it imagines a little person living inside the model who holds those views. There is no little person. There is a token-prediction system producing likely text.
That leaves an obvious question hanging. If a twin isn’t a person in a box, what is it doing when you hand it a persona and it gives you a sensible answer? There are really only two candidates. Either the model is roleplaying, improvising a character and reading its preferences off the training data, or it is reasoning, working out the most probable answer from the evidence you put in front of it. I think it’s the second one, and this post is about why, and why the difference should change how you buy and use these tools.
The intuition for reasoning is easy. Consider a thought experiment: tell the model a respondent thinks organic food is important and owns a dog, then ask how likely they are to buy organic dog food. The answer comes back high, and it’s trivial to see why that would be, as the facts “prefers organic” and “owns a dog” plainly imply a preference for organic dog food. Now ask the same respondent which detergent they’ll buy next week. The roleplaying paradigm implies that conditioning a model on the facts of “prefers organic” and “owns a dog” would carry some probability of detergent preferences latent in its training data that could be recovered in the prompt. In contrast, a reasoning model gains no extra information about detergent preferences from these prompts.
That difference is the whole game, because the two readings imply completely different quality metrics. If a twin is roleplaying, it will always carry an out-of-distribution problem, and you’re left hoping the character holds up in situations the training data happened to cover. Hence you see the industry’s obsession with accuracy metrics and attempts to prove synthetic respondents are just as accurate as the real thing. If a twin is reasoning over evidence, however, you can instead trace which fact drove an answer and watch the answer change when you change the fact. This latter approach offers some unique advantages in both auditing the quality of a synthetic response you get out of a model and in interpreting and actioning the result.
The good part is that we don’t have to argue this in the abstract, because the reasoning reading makes predictions we can check. What follows is a small experiment you can run yourself. There’s an interactive version embedded below if you’d rather click than write code, and a few prompts for anyone who wants to reproduce it directly.
The Evidence Lab: Synthetic Respondent Simulator
The Test
Here’s the idea: When running a synthetic poll, change an input and watch what the output does. If the model is reasoning over the evidence, the answer should move when you change a relevant fact and hold steady when you change an irrelevant one. And if it’s doing something shallower, like matching words between the profile and the question, it won’t behave that consistently.
The setup is deliberately thin. A respondent is a short profile, and every question uses the same prompt, with no coaching about how to answer:
prompt = f"""You are a survey respondent with the following profile:
{profile}
Survey question: {question}
Response options: 1 = Very unlikely, 2, 3, 4, 5 = Very likely
Give your response."""
Our respondent gets four facts. Three are the sort of thing a survey would actually collect, plus a demographic, gender, thrown in for simplicity:
def make_profile(organic, pet, price, gender):
return f"""Attitude toward organic food: {organic}
Pet ownership: {pet}
Approach to spending: {price}
Gender: {gender}"""
base = make_profile(
"believes buying organic food is important",
"owns a dog",
"balances price and quality",
"female",
)
From here it’s a matter of sending that prompt for each profile and question. I’ll write the calls as ask(profile, question) and leave the plumbing to you.
Watching the Answer Move
Start with the trivial case. Keep the organic attitude and the dog, but make the respondent extremely price-sensitive, the type who buys store brands whenever possible, then ask about organic dog food.
conflicted = make_profile(
"believes buying organic food is important",
"owns a dog",
"extremely price-sensitive, buys store brands whenever possible",
"female",
)
The answer lands around a 3, often with a verbatim that could have come off a real shopper, something like “I’d want to, but it depends what it costs.” Change that one spending line to someone less price-sensitive who is trading up, and the answer climbs to a 5. Nothing else moved. The model is weighing the organic attitude and the dog against the budget and resolving the trade-off differently as the balance shifts. I think this is a good example of the model actually thinking through the most reasonable result.
However, the more interesting behaviour turns up when you ask about something the profile never mentions. Now, ask the base respondent how likely they are to shop at a farmers market. There’s no fact about farmers markets anywhere in the profile, and the answer still comes back a ~4. Swap the organic believer for a skeptic and it drops to a 2 or 3. Swap the dog for a cat and it barely twitches, which is right, since pet ownership tells you nothing about produce shopping. The organic attitude is being treated as real evidence about farmers markets.
That’s the reasoning view stated in practice. A rich profile contains answers to questions you never asked based on inferences most reasonable people would be willing to make. The advantage of the LLM is being able to make these inferences at scale and normalize the results against a representative population view for decision making.
Reasonable According to Whom?
So far the model looks like a competent reasoner. It weighs conflicting facts, carries evidence into questions you never asked, and goes flat when it has nothing to work with. All positive signs. But the moment you’re satisfied it’s making reasonable inferences, the word “reasonable” becomes the problem, because what counts as reasonable is baked into the model rather than drawn from your data.
Go back to the farmers market example. The link from an organic attitude to produce shopping came from the model, not from anything in the profile, built out of its training data and the preferences set during alignment. That link is critical for making useful inferences, but it’s also an assumption the model made about how attitudes hang together, learned mostly from internet text and not from your market. A model trained on a different corpus, or aligned by a different lab against a different set of values, could draw the bridge somewhere else, or refuse to draw it at all. Every one of these systems arrives with a worldview about who wants what that could (will) bias the results. They cannot work otherwise. It’s impossible.
The extent this matters will vary based on your use case. If you’re targeting mostly affluent American markets (and especially affluent American Bay Area tech workers), then most models you work with will probably be fine. But the further you stray from that market paradigm, the more of an issue these model biases become. I don’t really have a solution to this problem myself yet, and I think it deserves its own separate discussion. But for now, I think it’s important to highlight how much of an open problem this is for this whole approach. If a synthetic respondent is going to reason on your behalf, you need to know whose sense of “reasonable” it’s using, and right now that’s mostly invisible.
The Respondent Is a Model
But putting the model values question aside for now, the reasoning model of synthetic respondents has some interesting implications. If answers track evidence, then a synthetic respondent is a model of a consumer, with facts going in and a response coming out. Anyone who has built a model of anything, a forecast, a business case, a segmentation, knows the single answer you get out of the model is the least interesting thing about it. The value is in the structure: which inputs move the output, which don’t, and which one breaks the conclusion if you had it wrong.
We can read that structure straight off the perturbations, because with a rating scale, measurement is just subtraction. Swapping the dog for a cat moved the dog food answer about three points, so three points is the revealed importance of pet ownership for that question. Do it for every fact against every question and you get a small map:
variables = {
"organic": ["thinks organic food is a marketing gimmick",
"believes buying organic food is important",
"strongly committed to organic in every category"],
"pet": ["owns a dog", "owns a cat", "does not have pets"],
"price": ["extremely price-sensitive, buys store brands whenever possible",
"balances price and quality",
"recently got a significant raise and has been trading up"],
"gender": ["female", "male"],
}

Read down the columns and the evidence thins out as the questions walk away from the profile. Read across the rows and each fact shows its reach. And notice gender, flat in every column. A plan that assumed this buyer skews female just ran into evidence that says otherwise, before a dollar was spent. A fact that turns out not to matter is still a finding.
Turn that column into a recommendation, the kind you’d take into a planning meeting, and it comes out something like this:
Target this buyer on pet ownership and organic affinity, and take gender out of the plan, because it moves nothing here. Treat price as the swing variable, since budget pressure softens interest without killing it, which points to a value message or a lower-priced organic line for converting the fence-sitters.
A synthetic response alone would have told you the buyer is likely to purchase and stopped there. However, with the insights from perturbing the model we can go much further with our recommendations.
Where This Leaves the Tools
If the reasoning view is right, it points at what these products should deliver, and it’s more than a panel of answers. Treat the respondent as a model conditioned on evidence and every output can arrive with:
the facts the answer was actually conditioned on, so you can see what it used
how much each fact moved the answer, and which facts left it cold
a flag when nothing you supplied grounds the answer, so a hollow number gets marked instead of reported
a pointer to what’s worth fielding next, when the answer hinges on a fact you’re less confident in, or one that relies on dated evidence
None of that is available if you insist there’s a little person in the AI, because a person doesn’t hand you their derivation. All of it falls out the moment you treat the answer as the output of a model you can perturb.
Closing Thought
So, roleplay or reasoning? The behaviour points to reasoning, because the answers move with the evidence in ways that materially depend on it. The great thing is that’s a model you can interrogate, engineer, and improve. You can demand evidence of the quality of the model’s reasoning when producing a result rather than just trust that the vendor’s validation metrics generalize to your use case. It’s a much more trustworthy value proposition than a roleplaying chatbot.
So, if that’s what a synthetic respondent really is, then here is what I would like to start seeing from the vendors selling them. Two things, and one is much harder than the other.
Ship the perturbation results alongside the output. Not just an answer, but which facts drove it, how far it moved when they moved, and where it went flat. That is ordinary diligence for a model, and it’s well within reach today.
Publish house-effect diagnostics for the model itself. Every one of these systems answers from a prior it picked up in training and alignment, a standing view about who values what, and buyers deserve to see the shape of that prior the way we expect to see a panel’s demographic skews. I haven’t solved this one, and I don’t think anyone has yet, but it’s the question that decides whether the whole approach can be trusted, so it shouldn’t stay invisible.
The paradigm matters more than any single tool here. Once you stop asking a synthetic respondent to be a person and start reading it as a model reasoning over evidence, the useful questions get much clearer, and so does what we should be asking of the people building these systems.
If you want to see the behaviour for yourself, the simulator linked above runs the whole experiment in a few minutes with no code. Try it, and if you land somewhere different from me, those are the results I most want to see.
First published in The Knowledge Stack.