← Back to selected work

03 / AI evaluation

Better according
to what?

A new prompt. A different model. A higher score. Before calling it an improvement, I want to know what changed—and what the score leaves out.

PythonPydanticAsyncIOMLflowPrivate source

Same input.
Two different habits.

One candidate uses simple rules to route support messages. The other always answers “other.” Both repeat their answers perfectly. Only one follows the expected labels across all four examples.

Choose a message and change what gets scored. The input-level result and the aggregate score answer different questions.

Interactive snapshot
Consistency ≠ correctness02 / EVALUATION

“I was charged twice this month.”

Expected: billing · escalate: yes

Careful rulesMatch
category: billing
escalate: true

This message 100%

Always otherMismatch
category: other
escalate: false

This message 0%

100%Careful rules
25%Always other

Repeat each message three times: both candidates are 100% consistent. Being reliably wrong is still being wrong.

Deterministic rules on four synthetic cases. An adaptation of VeroLoop’s offline example; no live AI calls.

One task. A common yardstick.

VeroLoop is a Python SDK for evaluating a typed AI task consistently across provider candidates. A task defines the inputs, expected output structure, examples, and repetitions. Candidates describe the provider, model, and prompt.

The evaluation layer then records what came back and evaluates it against the same contract. The current source repository is private.

Keep the measurements separate.

  • Schema validity: did the output follow the required structure?
  • Correctness: did the evaluated fields match the expected answers?
  • Stability: how often did repeated validated outputs agree?
  • Latency and cost: how long did the attempts take, and what usage can be accounted for?

Pydantic models define the canonical output contract. Provider adapters check whether they can support it. Unsupported schema features are surfaced as errors, rather than quietly changing the task.

Unknown cost stays unknown. Missing usage or pricing information should not be interpreted as a free run.

The machinery around the model.

The SDK includes provider adapters, asynchronous execution, configurable concurrency and retries, repeated attempts, and console, JSON, and optional MLflow reporting. A deterministic offline provider makes examples and tests runnable without credentials.

Real-provider use requires explicit configuration. The project is still developing; its current scope does not include a model registry, automatic schema fallbacks, caching, or an LLM judge.

A tiny example, with clear boundaries.

This browser demo adapts the offline example using four synthetic support messages and two deterministic rules. Category accuracy scores one field per message. The combined score gives equal weight to category and escalation, for eight field comparisons in total.

The careful rules get all eight fields right. The always-other rules get one category and three escalation flags right: four of eight fields. The displayed scores are calculated from the cases as you explore them.

Both candidates give identical outputs over three repetitions. These are not measurements of OpenAI, Anthropic, Gemini, or any live model.

Keep exploring

A market, from the inside.

Always up for a good conversation

Have something
on your mind?

yohanze@icloud.com