A decision reasoning model is where we need to bridge the gap between LLM agents and classic ML.
Over the past year we've handed more and more small decisions to
LLM agents. Which of these moisturizers will she actually like. Should I go to this conference. How much
should this trip cost. The agent reads the context well and writes a sensible answer with a sensible
reason. Then we ask the same question again, and sometimes the answer changes.
I wrote about the checking side of this in
How do you know an AI answer is good enough to act on?
Fluency isn't a signal of correctness, and a second model grading the first carries the same variance.
For open-ended work that variance is part of the value. For a
decision I want to automate and audit, it gets in the way. If the same invite gets a Yes on Monday and a No
on Tuesday, I can't say what error rate anyone is signing up for.
The part of the language model we want, its
reading of messy text, doesn't have to come with the variance. I've been calling the tool a
decision reasoning model, or DRM: a small language model that reads context and reasoning as
free-form text and returns one deterministic, calibrated answer.
Three everyday decisions carry the piece, each with a different answer shape:
an order of preference across cosmetics for one shopper,
a Yes or No on attending a conference, and
a number for a travel budget. The idea came from Microsoft's
Decision-1 model; what follows is my own prototype.
Carey Chou ·
01 · The spectrum
"AI decision" is four different things
Decisions sit on a spectrum, from open questions nobody can answer in advance to
fully specified ones where a rule already says what to do. Tap each to see the kind of question
it fits.
◀ more ambiguousfully specified ▶
The gap
Between the agent and ML, there's a decision neither fits
It looks like ML
It repeats
the same kind of call, hundreds of times, with a history of real answers to learn from
but
▶
It looks like an agent
The evidence is text
a shopper's reviews and returns · a conference agenda next to your calendar · a trip plan with its notes
so
▶
The tool for it
A DRM
reads the text like an agent · scores like a model · same input, same score
An agent is good at reading the text.
A model is good at repeating itself. A DRM tries to do a bit of both.
✎
AI helps on the rules side too, just not at runtime. A language model can read a
pile of past decisions and propose candidate rules; a person reviews them, and they run as plain code.
So AI helps write the rules, and the rules make the call.
02 · Why the middle
Why not use what we already have?
It's a fair question. I see three reasons.
One
An agent's answer is a sample
When a model writes "Yes", it drew that token from a distribution. At temperature
zero you still get small differences from batching and GPU arithmetic. It also moves with
phrasing, so it can be argued with.
Two
Its confidence isn't calibrated
"90% sure" doesn't mean nine in ten are right. To automate I need to say
above this line, errors stay under 2%, and that needs a probability checked against outcomes.
Three
Classic ML drops the reasoning
A model on summary columns can't read "my skin gets dry in winter"
or "I'd only go if I can present". A DRM reads the paragraph the person reads.
Try it
Ask the same question again
An illustration, not a live model: the agent side samples
Yes with probability 0.68 each time, the way a sampled answer behaves; the DRM side computes once.
context: "Applied ML Summit", Austin, Mar 12–14; your team offsite is on the 13th proposal: register and fly out, $1,450 plus travel reasoning: two talks on your current project; a colleague is going and offered notes question: Would you attend? Yes or No.
LLM agent · sampled
each ask is a fresh draw
Not asked yet.
DRM · scored
each ask is the same function of the same text
Not asked yet.
⚑
Does RLHF itself make a model non-deterministic? No. The exploration in
reinforcement learning happens during training, while the weights are changing. Then it stops.
The weights are fixed. At inference the variability comes from how we decode: sampling, and
to a smaller degree GPU numerics. A DRM keeps the RLHF-tuned weights and just doesn't decode.
03 · Where it fits
Three decisions that could use a DRM
The pattern I look for has three parts. All three decisions in this piece have
them, and each needs a different answer shape. I've prototyped the same shapes at work, on
merchandising and operations decisions.
It repeatsthe same call, many times a week
The evidence is textreasoning, notes, descriptions
There's a history of answershuman decisions or real outcomes
In every case, the same job
Split the work into three lanes
auto-No
a person decides
auto-Yes
P(Yes) 00.51
sure it's a No: actnot sure enough: hand to a personsure it's a Yes: act
Lane widths are illustrative. The real cut points come from a
precision target, step 4 below. For a label, "sure" means the top label's probability is high; for a
number, it means the estimate's spread is tight.
Three decisions, three answer shapes
Not just Yes or No
💄Order of preference
Which of these will she like most?
reads her reviews and returns, "my skin gets dry in winter", each product's description
Hydrating serum
4.6
Tinted moisturizer
4.1
Matte foundation
2.3
Retinol night cream
1.8
→ show the serum first; drop the matte line
Learns from what she rated, kept and returned; a near miss is one band off
🏫Yes / No
Should you attend this conference?
reads the agenda, your calendar, the budget note, who else is going
0P(Yes) 0.681
→ middle lane: ask you
Learns from the conferences you went to and skipped
✈️A number
What should the Austin trip cost?
reads 3 nights, hotel block, flying from Chicago, "I'd rather walk than cab"
per diem
$1,850
$1k$1.5k$2k$2.5k$3k
→ set aside $1,850; flag past $2,050
Learns from what your past trips actually cost
⇆
Three shapes, one model. The conference reads one P(Yes). The preference order
scores each product into ordered bands and sorts by the expected band. The budget reads a number and
its spread. Each is a small task file on the same machinery.
04 · How it works
From an RLHF chat model to a calibrated scorer
I don't build a new model. I take a small open-weight chat model (Qwen2.5 1.5B or 3B
Instruct), ask it a question with a fixed set of answers, and read the scores of those answers
instead of letting it write. The code and the three examples above are on
GitHub.
1
Pre-train
language and world knowledge
2
Instruct + RLHF
follows "answer with one label"
3
Prompt
free-form text + one question
4
Label logits
Yes/No, A–D or 0–8, no generation
5
LoRA
learn this team's decisions
6
Calibrate
temperature + thresholds
Step 1 · Keep the RLHF
Nothing is removed
Keep
The instruct model, RLHF and all
Early on I asked whether to strip RLHF and keep only the base transformer. I kept it.
The instruct model already maps "Answer Yes or No" (or "answer with one letter") onto exactly those tokens, so it starts
with a meaningful opinion before any training. That matters when real decisions number in
the hundreds, not millions.
Add
A small LoRA layer, about 1% of parameters
The only thing trained. Everything the model already knows about reading business
text stays frozen.
Step 2 · Read the label logits
Ask, then don't let it answer
# a softmax over two tokens is a sigmoid of their difference
P(Yes | x) = σ( zYes− zNo ) = σ( (wYes − wNo) · h(x) )
# h(x): hidden state of the last prompt token, which has attended to the whole input# w_Yes, w_No: two rows of the model's existing output layer
Underneath, a DRM is just logistic regression on a
language model's reading of the text.
Same trick, more labels
Change the answer set, keep the machinery
Keep K label tokens instead of two and take a softmax over them.
The question spells out what each label means. Here is how each of the three decisions reads it.
Yes / No · conference
No · Yes
Read P(Yes). Two lines make three lanes.
Ordered band · preference
1 < 2 < 3 < 4 < 5
Score each product, sort by the expected band. A miss by one band counts as near.
A number · budget
$1.0k $1.25k … $3.0k
Each label is a value. Estimate = Σ p·v; a wide spread means a weak estimate.
# K labels: one softmax over their logits, still one forward pass
pk(x) = softmax( z1 … zK )k# a number: each label stands for a value v_k (e.g. $1,000, $1,250 … $3,000)
estimate =Σ pk vk spread =√Σ pk (vk − estimate)²
Step 3 · Fine-tune on real answers
Two weeks of shadowing, in LoRA form
The base model is an experienced analyst who has read a lot
of business writing. LoRA is the two weeks spent shadowing one person: the analyst keeps
what they knew and learns which parts of the reasoning this person weighs. The loss is plain
cross-entropy over the label logits. For an ordered answer like her preference, I also tried
earth mover's distance (EMD), which charges more for missing by two bands than by one. For a number, the target is split between the two nearest
values, so the estimate lands on the true number. No text is generated in training either.
Label source A
Human decisions
The conferences you said yes and no to. Learns how you decide, habits included.
Label source B
Realized outcomes
What the trip really cost, which products she bought again. Often
better, because they don't inherit a person's habits.
Step 4 · Calibrate, then set the lanes
Pick thresholds for a precision target
I fit one temperature T on held-out data so the scores match
observed frequencies, then find the approve and reject lines where precision reaches the target,
say 98%. If no line reaches it, the model automates nothing. Labels and numbers get one line: act when the
top probability is high enough, or the spread tight enough. Drag the Yes/No lines below to see the trade-off.
actually Yesactually No40 illustrative cases, placed by their P(Yes)
P(Yes) 00.51
–auto-Yes precision
–auto-No precision
–sent to a person
Step 5 · Measure consistency, not just accuracy
Determinism has two layers
0
flips when the exact same text is scored again, across all runs
~15%
of groups flip when one case is written five ways (3B, synthetic). This is the number I watch
1
small task file per decision: the prompt, the question and the answer shape. The machinery is shared
05 · What I've seen
Mixed results, shown as they are
I'd rather show the mixed results than a single good number. Here they are.
Setting
Result
What it tells me
Synthetic approval decisions, generated with known rules
AUC .93 / .95
1.5B / 3B; 18% auto-reject at 100% precision. The mechanism works when the signal is in the text.
Real approval decisions: a few hundred, mostly approvals
near chance
No automatic coverage yet. With so few rejections, it learned the base rate, not the reasoning.
Re-scoring the same input
0 flips
Deterministic in the strict sense.
Paraphrased inputs, five renderings per case
12–15% flip
Wording still matters. This is the next thing to drive down.
One of seven: which helper should take a request (work data)
.95 vs .72
Better than a keyword baseline. Acts alone on about half the requests with no errors on held-out data.
Automate or hand to a person, for documents (work data)
AUC .99
Handles 56% alone at 98% precision. One field may leak the answer; I'm checking that before I trust it.
Ordered bands, like the preference scale (work data)
.64 vs .62
Only slightly better than always guessing the common band, and EMD didn't help. It spots the clear losers, not the fine order.
A number: correcting an existing estimate (work data)
small gain
Error 1.05 vs 1.16 for leaving the estimate alone. Not enough to act on by itself yet.
⚠
Right now the data limits it more than the model does. It needs more decisions,
especially rejections, a log of exactly which version of the proposal the person saw, and
ideally a reason when they say no. More rejections matter most.
06 · Where the human stays
It makes one narrow call, with a probability attached
Sure enough
The DRM acts
only where it meets the precision target
else
▶
Not sure
A person decides
you, or whoever owns that call
then
▶
Loop
That answer trains it
every hand-off becomes the next training example
Agents are still good for exploring, and rules for what we can write down.
A DRM is meant for the repeated, text-shaped calls in between.
Where I might be wrong
The parts I'd want to double-check
1
the strong results are on routing and the hand-off gate. On ordered preferences and numbers it is only slightly better than a simple default, and on real approvals it isn't ready to automate yet
2
a 12–15% paraphrase flip rate means wording still moves the call. Until that drops, the same case written differently can land in a different lane
3
human labels carry human habits. Where an outcome exists, I'd rather learn from the outcome
4
a 98% target on a few hundred validation cases is a thin estimate. The lanes need re-checking as decisions accumulate