Composite scoring
A broad question like “how serious is this ticket?” hides several judgments. The model answers it with one number that you cannot explain, audit or tune.
Composite scoring splits the question. You send one rate call per dimension, each with its own scale. You keep the weights in your code, where you can read them, test them and change them without touching the model.
Design the dimensions
Each dimension is one rate call with one ordered scale. Follow three rules.
- Keep the dimensions independent. Tone, business impact and time pressure vary on their own. Do not add a dimension that restates another one.
- Describe every level. The level text is what the model reads.
"Low"and"High"carry no meaning. Write"The whole business is blocked"instead. - Keep scales short. A scale holds 2 to 10 levels. Four clear levels beat ten vague ones.
More guidance on level wording lives in writing good statements and labels.
Score each dimension
The example text is one inbound support ticket:
Three calls run against it, one per dimension. The curl call below scores the impact dimension.
The three responses, captured live:
Use score, not level. score is the probability-weighted position Σ p_i · i, so it carries the
model’s uncertainty. level is the argmax alone, and it can jump on a 0.001 difference.
Combine the scores
Normalise each score to 0–1 by dividing it by scale.length - 1. Then take the weighted sum.
The captured numbers normalise to 0.667, 0.836 and 0.833, and give a composite of 0.793. That clears
the paging band. The tone call reports confidence 0.208, so this ticket still routes to a person first.
The model separated impact and urgency cleanly, and stayed unsure about tone.
Log every dimension score next to the final action. A composite you cannot decompose is as opaque as the broad question you replaced.
Latency and batching
Each dimension is one call. A rate call runs near 1.0 s, so three dimensions in series cost near 3.0 s.
Run them together with Promise.all or a thread pool. Separate inference slots take the three calls, so they
finish in little more than the time of one.
Batching does not merge dimensions. texts sends many texts through one scale, so it scores many tickets
on one dimension, not one ticket on many dimensions. To score a queue, batch up to 32 texts inside each
dimension and read the results in input order, as batching describes.
Weights are your product decision, not a model output. Fit them against 50 to 200 labelled examples from a golden set, not against intuition.
Next
- Rate — the full request and response shape for one dimension.
- Confidence routing — the act, confirm and escalate bands used above.
- Tuning thresholds — pick the weights and the cut-offs from data.