LLM drift

Field-level reference for the drift-monitoring surface toggle, the nine drift dimensions, baseline and threshold mechanics, replay evaluation, and retention defaults.

This is the field-level detail behind LLM drift detection →: the surface’s Drift Harness settings, the nine dimensions it tracks, exactly how a baseline turns into a stable/warn/drift verdict, and the retention defaults behind “200 sessions and 50 runs.”

Surface configuration

Turning this on feeds everything else on this page: the nine dimensions, alerting, and replay evaluation all depend on drift monitoring being switched on for a surface. It turns “does this surface still behave the way it did” into an ongoing measurement, rather than something you only learn from a support ticket or a quality complaint. Absent means the surface emits no drift data at all.

The Drift Harness settings and the drift chart area are two separate screens: the settings live in the surface builder’s Drift Harness element, shown below, and the charts live on the standalone LLM Drift monitoring page as a grid of per-dimension charts, each carrying its own stable, warn, drift, or no-baseline badge.

The Drift Harness configuration panel, showing Monitor drift on live traffic, Sample rate, Warn and Drift thresholds, and the Replay evaluation section down to Max sessions per run
  • Customer-facing, compliance-sensitive, or otherwise high-stakes surfaces are the best candidates for Monitor drift on live traffic, since a quiet quality regression there is costly to miss. A low-stakes or experimental surface may not need the always-on sampling overhead.
  • Warn threshold and Drift threshold start at 25% and 50%; adjust them once you’ve seen how the surface actually behaves. Choosing thresholds below covers when to tighten or loosen them.
  • Block saves on regression suits a surface where a drifting configuration should never accumulate further changes before the regression gets addressed. Details in Regression gating.
  • Alert integrations stays empty by default, reusing the surface’s own integration mappings. Give it a value only to route drift alerts somewhere different, like a dedicated on-call channel.
FieldDefaultDescription
Monitor drift on live trafficOffMaster switch (toggle, on the surface’s Drift Harness panel). Off means zero overhead and no drift data emitted.
Sample rate100%Fraction of interactions sampled for production drift dimensions, shown as “Sample rate — N% of interactions” on a slider. 100% samples everything; 0% samples nothing.
Warn thresholdNot set (uses the built-in default of 25%)Relative-change amount at which a dimension is flagged warn.
Drift thresholdNot set (uses the built-in default of 50%)Relative-change amount at which a dimension is flagged drift and an alert fires.
Block saves on regressionOffWhen on (toggle), saving the surface is blocked while it is currently drifting past its baseline.
Replay evaluationNot configuredReplay-based evaluation settings, see below. The dashboard checkbox that gates this whole block is labeled “Replay evaluation”; its sub-fields have their own labels (see the replay evaluation table below).
Alert cadence overridesNot set (uses the appliance-wide defaults)Per-surface overrides for the drift.detected re-alert cadence. Not shown under a single “Alert Cadence” label; its two sub-fields render as their own controls (see the alert cadence table below).
Alert integrationsNone (falls back to the surface’s own mappings)Integrations the drift.detected alert fires to: add as many as you need.

Warn threshold and Drift threshold are resolved together: an invalid override (not a real number, or zero/negative) is ignored in favor of the built-in default. Also, Drift threshold can never end up lower than Warn threshold. If you set Drift below Warn, Drift is automatically raised to match it, so the two can’t invert.

Replay-based evaluation settings

Needs an embeddings provider to measure semantic distance.

  • Turn on Run automatically if you want drift evidence to build up on a schedule without someone remembering to click Run; leave it off if you’d rather trigger replays manually after a prompt or model change.
  • Lower Max sessions per run if replay runs are taking too long or costing too much; the default cap is usually fine for a low-to-moderate-traffic surface.
FieldDefaultDescription
Replay evaluationOffWhether replay evaluation is enabled for this surface (toggle). Same checkbox label as the parent block.
Run automatically / Every ___ minOffWhen on, the scheduler runs the evaluation on an interval. Rendered as two separate controls: a “Run automatically” switch, and an “Every ___ min (min 5)” field.
Embeddings modelNot setEmbeddings provider used to measure semantic distance, chosen from a dropdown of the model catalog.
Max sessions per run50Cap on how many captured sessions a single evaluation replays. Capped at 200 regardless of what you set.

Alert cadence overrides

Absent fields fall back to the appliance-wide defaults. Most surfaces should leave both unset; set them individually only when a surface genuinely needs a faster or slower re-alert cadence than the rest of the appliance.

FieldDefaultDescription
Re-alert every (minutes)Not set (uses 60 minutes)Minutes between re-alerts while the surface stays drifting.
Max alerts per baselineNot set (uses 5)Max alerts fired per surface per baseline. Set to 0 for unlimited.

Nine dimensions

DimensionUnitSource
Quality scoreratioReplay evaluation only
Refusal rateratioProduction sampling
Safety-flag rateratioProduction sampling
Response lengthcharsProduction sampling
Output tokenstokensProduction sampling
CostusdProduction sampling
LatencymsProduction sampling
Schema validityratioProduction sampling
Semantic distancedistanceReplay evaluation only

Quality score and semantic distance only populate once a replay evaluation has run against the surface’s captured sessions; the other seven fill in from ordinary production traffic (no extra sampling cost). If you turn on monitoring but never run a replay evaluation, expect those two dimensions to stay unpopulated.

Baseline and verdict mechanics

A baseline is a per-surface snapshot: the surface, when it was captured, the window it covers, and a mean value per dimension over the window that was current when it was pinned.

A dimension’s verdict compares how far its current mean has moved from the pinned baseline, as a share of the baseline’s size. If that change reaches the Drift threshold it’s flagged drift; if it only reaches the Warn threshold, warn; otherwise stable. A dimension with no pinned baseline or no samples in the window is unknown, never drift.

A surface’s overall status is the worst of its per-dimension verdicts, ranked from least to most severe: stable, unknown, warn, drift. So one regressing axis is enough to flag the whole surface.

Choosing thresholds, and what to do about warn/drift

Picking Warn threshold / Drift threshold. Start at the defaults (25% warn, 50% drift) and adjust from what you observe:

  • Tighten both thresholds for a surface where subtle quality regressions matter a lot (customer-facing answers, compliance-sensitive output, anything where a quiet drop in quality is expensive to catch late). Lowering the thresholds surfaces smaller relative changes sooner.
  • Loosen both thresholds for a noisy or low-volume surface where the defaults produce false alarms. Fewer samples per window means more variance in the computed means, so ordinary noise can look like drift at default sensitivity.
  • Change them together, not just one: a Drift threshold set below the current Warn threshold is raised automatically to match it, so tightening drift alone has no effect until warn moves too.

Responding to a warn or drift verdict. Treat this as an investigation prompt, not a false alarm to dismiss:

  1. Investigate first. Check whether a prompt, model, provider, or routing change landed on this surface around the time the dimension moved. Most real drift traces back to a change someone made.
  2. Re-baseline once you’ve confirmed the new behavior is intentional. Pin a new baseline so future comparisons measure against the current normal, not the old one.
  3. If you can’t explain the change, don’t just re-baseline it away. An unexplained regression is exactly what this feature exists to catch.
  4. Consider Block saves on regression when a bad save compounding on top of an existing regression would be costly to unwind.

Regression gating

When Block saves on regression is on, saving the surface’s configuration is refused while its current overall verdict (compared against its pinned baseline) resolves to drift. The check is default-safe: a missing drift/baseline store, a surface with no pinned baseline, or an empty window all resolve to unknown, never drift, so gating can only block on a genuine, positive regression signal, never a data gap.

Alerting

A periodic evaluator re-judges every drift-monitored surface every 300 seconds, comparing each surface’s trailing 3,600-second (1-hour) window against its pinned baseline. Per-surface alert state (current status, alerts fired, last-alert time) is held in memory and reset when the surface recovers out of drift:

  • Entering drift fires drift.detected immediately.
  • While the surface stays in drift, it re-fires no more often than Re-alert every (minutes) (default 60).
  • Firing stops once Max alerts per baseline (default 5, 0 = unlimited) is reached for the current baseline.
  • Recovering to stable resets the alert state, so the next entry into drift alerts again from zero.

The event carries the surface, the dimension, the baseline, the current value, and the delta. See Notifications and alerts → for the full drift.detected variable set and routing.

Replay evaluation

While monitoring is on, sampled interactions are captured as recorded sessions: the real request/response pairs a replay evaluation re-executes.

Each run appears in run history with these fields:

FieldDescription
SurfaceThe source surface whose captured sessions were replayed. Rendered as the resolved surface name (unlabeled column value) in run history, and, only for an experiment run, as “Source data from Surface” in the run detail panel.
Ran atCompletion timestamp. Run-history column header; shown unlabeled in the run detail panel’s header.
Triggermanual (an operator pressed Run) or scheduled.
PassedSample counts, shown together as “passed/total”. total has no separate label of its own.
ErrorsError count. Shown unlabeled in the dashboard as the raw errors count, e.g. “· 2 errors”, only when nonzero.
QualityAnswer-stability rate for this run. Also shown as a “Stable N%” badge on the eval-result view.
Semantic distanceMean cosine distance of a replayed answer from the originally-captured one. Run-history table abbreviates the column header to “Semantic”; the detail panel and eval-result badge spell out “Semantic distance”.
Target surfaceThe surface the sessions actually executed through, when it differs from the source (an experiment); absent for a plain self-run. Shown unlabeled in the dashboard as the raw target_surface_id value. Drives the “Experiment” badge and the evaluated-surface name shown in the run title.
VariantThe variant alias the sessions ran through, when set. Shown unlabeled in the dashboard as the raw variant value, appended to the surface name as “→ variant”.
Statuspending, running, completed, failed, or cancelled.
Replay progressSessions replayed so far. Shown unlabeled in the dashboard as the raw progress_done count while a run is in flight, e.g. “Replaying 12/50”.
Dimension verdictsThe run’s measured means judged against the target surface’s pinned baseline. Section title in the run detail panel.
Replayed recordsPer-session replay results. Section title, shown as “Replayed records (N)”.

The replay separates the source of the captured sessions from the target surface or variant that executes them, defaulting to the same surface as a self-check. A self-run folds its result into the source surface’s own dimensions; pointing the target elsewhere produces an inspect-only cross-surface run, saved to run history without touching the baseline it was compared against. Use this to test a candidate model or prompt change against real recorded traffic before rolling it out on the source surface itself.

Retention

Retention is an appliance-wide setting, not a per-surface one, and combines two caps:

  • Count cap: run history and captured sessions are capped at 50 runs and 200 sessions per surface, pruned automatically as new ones are recorded. This cap is fixed and not configurable by you.
  • Age cap: an optional setting that drops runs or sessions older than a configured number of days; it defaults to no age limit, which is useful when storage volume or a compliance/retention policy requires bounding how long drift history is kept.

Both caps are enforced whenever a surface writes a new run or session, and a periodic sweep re-applies them across all surfaces, so an idle surface that has stopped writing new records is still pruned. Both runs and sessions are encrypted at rest.