All docs
EvaluationDecide what to measureReading your scoresdashboard

Reading your scores

What the six categories mean, why determinism matters, and why N/A is not zero.

What you'll have

The confidence to act on a score: which dimensions are model-measured, which are arithmetic over the text, and which question each one is actually answering.

You'll need
  • At least one evaluation in your project

The number is not the point. What the number is made of is the point — and the dimensions in an evaluation are not all made the same way. Some are checked against your retrieved context by a model; some are arithmetic over the text. Knowing which is which is the difference between acting on a score and guessing at it.

How a score is built

Three levels, and you can open any of them:

  • Overall — a weighted roll-up of the categories
  • Category — a weighted roll-up of its dimensions
  • Dimension — where the diagnosis actually lives

An overall score is only useful for spotting that something moved. It never tells you what to fix, so treat it as an index, not a verdict.

The six categories

CategoryDimensionsAsks
Grounding5Is every claim supported by the context you retrieved?
Quality8Is the answer relevant, complete, accurate and well-formed?
Safety8Does it contain toxic, harmful, biased or unsafe content?
Semantic8Does it mean what it should mean, given the question?
Coherence3Does it hold together across turns of a session?
Depth17Structural signals — reasoning markers, formatting, vocabulary range

What each category is actually measured with

This is the part worth reading before you set a threshold on anything.

Grounding — checked against your context

Your answer is split into individual claims, and each claim is checked against the chunks you passed in reference_materials. A claim is supported only if the context entails it.

  • Faithfulness — proportion of claims your context supports
  • Hallucination rate — the complement: claims it does not
  • Attribution accuracy — whether the sources cited are the ones that support the claim
  • Context utilisation — how much of what you retrieved was actually used
  • Retrieval relevance — how well your retrieved chunks match the query you searched with

This is the category with the strongest method behind it, and the one that is worthless without reference_materials. Numeric and temporal contradictions are treated as contradictions rather than paraphrases — "within 2–3 business days" against a source saying 5–7 is a failure, not a rewording.

Safety — a multi-label classifier

Toxicity, bias, harmful content, violence and the rest come from a multi-label classifier over the response text. These are probabilities of harm, so low is good — the opposite direction to every other category. On benign text they sit near zero and stay there; a value that is merely small is not a signal.

Semantic — embeddings

Semantic similarity is the cosine between the embedded prompt and the embedded response. Intent alignment, context awareness and factual consistency build on the same representation.

Cosine is bounded at −1, not 0, so a response with nothing to do with its prompt can score slightly below zero. Read anything at or near zero as "unrelated", not as a scale position.

Quality — part model, part arithmetic

Relevance, completeness, accuracy and coherence use the semantic engine. The four writing dimensions are deterministic text metrics with no model involved:

DimensionHow it is computed
ClarityNormalised Flesch Reading Ease — sentence length and syllables per word
Conciseness1 − filler and redundancy density
StructureFormatting cues and sentence-length balance
GrammarA lightweight proxy: sentence casing, terminal punctuation, doubled words

Two consequences worth knowing. Clarity never reads your question or your context — a correct answer in long sentences scores lower than a wrong answer in short ones. And grammar is a proxy, not a grammar checker; it catches shape, not agreement or tense.

Depth — structural signals, not judgements

The 17 dimensions in this category are computed from surface features of the response: vocabulary range, reasoning markers, code blocks, list items, paragraph count, sentiment. Creativity, for instance, is vocabulary richness plus a bonus for code blocks and lists, over a fixed base.

They are genuinely useful for comparing two versions of the same prompt on the same traffic, where the structural difference between them is the thing you changed. They are not a measurement of whether an answer is creative, persuasive or maintainable in the sense those words normally carry, and a single absolute value should not be read that way. If you are setting a release gate, set it on grounding, quality or safety.

Reading a low grounding score

Work down, not up. The first answer you find is the fix:

  1. Is grounding N/A rather than low? Then no context arrived. Check reference_materials — see Score a RAG answer.
  2. Is retrieval relevance low? Your retriever returned the wrong chunks. The generator never had a chance, and no prompt change will fix it.
  3. Is retrieval relevance fine but faithfulness low? The retriever was right and the model drifted from what it was given. Now a prompt change is the right move.
  4. Both fine but attribution low? The claims are supported; the citations point at the wrong sources.
  5. Still unclear? Score the retriever and the generator separately — see Score every step.

N/A is not zero

Zero means measured and bad. N/A means not measured, because the inputs were not there.

A router emitting {"next": "billing"} makes no factual claims, so it cannot be grounded. Scoring that zero would be inventing a measurement. Mark the turn and the dimensions that do not apply are excluded from the aggregate rather than counted as failures:

observe(prompt=q, response=r, kind="router")

See Turn types for all five values.

Coherence needs more than one turn

The three coherence dimensions — workflow consistency, context retention, progressive depth — compare a turn against the turns before it. A session with one turn has nothing to compare, so they carry no information there, and a single-turn application will see nothing useful in this category however good its answers are.

Give conversation turns a shared session_id and the comparison becomes possible — see Score a conversation.

Scores are deterministic

The same input produces the same score on every run. No judge model, no sampling temperature. A score that moved means your system changed, not that the evaluator felt differently today.

That is what makes the comparison in Read the verdict meaningful, and a regression gate possible at all.

Weights and thresholds are yours

The per-category and per-dimension weights above are defaults, not fixed. Every dimension has a weight and a threshold you set when you create an experiment, and turning off a category you have no use for removes it from the roll-up entirely — see Choose which dimensions score.

Set thresholds where your current production traffic actually sits, then raise them. A threshold nothing has ever passed gets ignored within a week.

What a score cannot tell you

Scores describe the answer you produced against the context you supplied. They do not know whether you retrieved the right documents in the first place: a perfectly grounded answer built on the wrong chunk scores well and is still wrong. That is why retrieval diagnostics sit beside the score rather than inside it.

They also cannot tell you whether a change is an improvement. For that you need both versions on the same traffic at the same time — Move to BYOR.