Essay

In which three reasonable people grade the same answer three ways.

Who Writes the Answer Key?

Three reasonable people can look at the same AI response and think three separate things: correct, (very) wrong, and the machine shouldn't have answered the question at all.

Say these people work for a hotel, and they’re looking at the response to a question on whether to make an exception to a breakfast voucher policy. Why was the machine asked this? Because a "guest was locked out of their room for a long time."

"For a long time." That's what entered the prompt.

Our three reviewers trace the steps that led the machine to its preferred answer: issue free breakfast to the guest. They can see that it found the policy pretty easily, and then retrieved all the supporting information it probably needed. Then, it thought for a while, largely inscrutably. And then it made a recommendation.

The facts: not disputed. But the human response to the facts of the case, and the answer, span a range: this answer is quite sensible, this answer violates the intention of the policy, this is too ambiguous and no answer should have been given at all. Hand it back to the people.

Apparently complimentary breakfast has case law. And yet, the correct answer can’t really be: "three otherwise competent adults disagree." At least in how we used to think about correct answers.

What exactly is the right way to test for something like this?

I immediately think of soup. I want my soup to taste good. I care what goes into it, but knowing what went into it tells me little about how it'll taste. You can verify whether the soup contains the required ingredients to technically be broccoli cheddar soup, whether the preparation of the broccoli and cheddar and other stuff followed the outlines of the recipe, and whether anything unsafe (a Kindle?) ended up in it.

You can satisfy all those requirements and still produce bad soup, or soup that divides the table.

Back to the machine, which has the following ingredients (we know of): information, policies to adhere to, recommendations, and knowing when it shouldn’t decide and needs to loop in somebody else. We can test for those things. Some are pass/fail, others are graded on a curve.

But is it good soup?

And who gets to decide if it is? One person cares deeply about the recipe, another is just tasting the result, and a third thinks this particular soup should never have been on the menu.

We are used to software that does specific things in specific orders. If this, then that. Now we're increasingly asking software to reason on our behalf: if this, then [you figure out what you think is best]. Which does some pretty great stuff sometimes, except now we're missing that pesky but specific that.

So we build an evaluation, or a capital-e Eval: here are some cases you might encounter, here's what successful performance looks like, and now let's see what the machine does.

Sometimes it’s easy. "I need xyz contract date please, and who signed?" Either the AI found the right contract and signature, or it didn't. Run the test ten times and you'd hope for ten correct answers. 10/10. Good job, buddy.

But you’re a hotel, and nothing's easy because you have a plumbing disaster and you’re way overbooked. You need someone to sleep somewhere else tonight. Who should it be? The frequent traveler with insane loyalty perks, the bleary-eyed family of four, or the other person in the check-in line? HotelBot, figure this out for us, chop chop.

So HotelBot fires up the engines and loads up some sweet, sweet context: the available room count, guaranteed reservations, what the hotel is legally permitted to do. It checks the internet and finds out what nearby alternative accommodations have any availability. In theory, it has everything it needs.

HotelBot says: move the family to a nearby hotel, cover the taxi, and offer a little compensation. The frequent traveler keeps her room. HotelBot: pleased.

We can test whether HotelBot identified the available rooms correctly. Did HotelBot understand the loyalty guarantees? Did HotelBot stay within its authority to compensate guests? Those are relatively straightforward checks. But what about the recommendation it made? Should we penalize it for deeply inconveniencing that bleary-eyed family, rather than a frequent traveler who might be more forgiving in exchange for a few extra points? What if the solution saves the most money, but is pretty obviously going to result in the largest number of angry guests? And should it fail the whole test if it neglected to escalate the decision and just…reassigned the rooms, on its own?

The front desk manager, the loyalty program manager, and the hotel General Manager might agree with every fact HotelBot found and still disagree on whether it deserves a passing grade. Someone has to decide how to weight all the stuff that goes into being a hotel, and whether certain types of mistakes should fail the test.

And apparently, someone needs to write them all down. Naturally, we ask another AI to help because it’s a lot of work. Maybe we ask it to grade the answers, too. Except now we need to evaluate the machine evaluating the machine. Which machine? The other one. How well does the grader grade breakfast voucher answers?

Who is choosing the test cases here?

I ask the machine. It would be delighted to choose them.

No. Fine. I will write this computer exam for computers.

So, I need exam ingredients: ordinary situations, unusual exceptions, cases where the correct decision was to leave something alone, and things that have gone wrong before.

I will construct a Golden Dataset. I can do this.

Except, hmm, wait. These cases are convenient because we know how they ended. But knowing what happened is different from knowing what should have happened. Some of the ways these cases were resolved? Suboptimal. Should they go in the answer key?

I could strip those cases down to the studs, and by that I mean remove the outcomes. Then give a few people the exam question. What would you have done, assuming you had to make the call? That's probably fairer and more golden.

So let’s say I do grab a few different people and ask them. It goes something like this: one person approves the original exception, another can't understand how it was approved, and someone who has been around longer remembers people kept approving exactly this sort of thing, so a policy was put in place to prevent more of it from happening. My Golden Dataset is beginning to resemble an essay exam. If I take any one of those opinions and elevate it to the correct answer, am I making the others wrong? By definition, yeah, which seems like a strange way to evaluate judgment calls.

Say the breakfast voucher was approved in March. In June, because people kept approving vouchers, bam: new policy. Am I testing whether HotelBot would have made the right decision in March? Or whether it knows what to do in June?

I need two answer keys for the same breakfast, but whichever key I choose, I still need to reconstruct what exactly HotelBot would have known when the guest was stuck outside their room, angry for a long time. Were they stuck in March? Don't give HotelBot the June policy. Were they stuck in June? New policy is fine, but not the manager's eventual decision, or the notes from the three reviewers explaining what they think ought to have happened. If I give HotelBot information from the future, HotelBot, naturally, does very well on this exam. It has an idea of how things turned out.

I can see why people call these datasets golden. It's reassuring. Nothing named like that could possibly have problems when you inspect what's inside.

Pencils ready, class, I now have an exam: test cases, some answers I mostly trust, and a grading rubric that allows for the ambiguity of human life.

Class of HotelBot instances, you will now have 60 seconds and only one GPU cluster to complete your exam, starting now.

I run the test. I keep finding things that aren't quite right. So I write another test, fix something, and run it again. One problem disappears and a different one shows up, so another test gets added. And every new attempt produces more answers that somebody has to grade. I'm getting tired of grading tests faster than I ever got tired of taking them.

Maybe the other machines can help. Like an outmatched professional wrestler, I tap in another model and hand it everything: the rubric, questions, responses to be evaluated, and what HotelBot actually did in the moment. I imagine the GPUs booing me and cheering the new hero, which completes its review and assigns grades much, much faster than I can.

Is my new grader any good? I compare its work against a smaller collection of responses already reviewed by humans, who (noting again here) disagreed in quite meaningful ways. Some of the grades line up pretty nicely. Others: nowhere close. The interesting answers? Where the humans all agreed and the machine didn't. I know by now that human agreement isn't proof of correctness, either. Still, a machine disagreeing with three people is a different problem from just disagreeing with one of three.

One HotelBot response gets good marks for sensitivity to the guest, its reasonable recommendation, and how carefully it laid out the other available options. Except, looking closer, HotelBot reassigned a room before anybody approved a change like that. The grader appreciated the recommendation, seemed to just like HotelBot’s style, when this type of response (unapproved action) should clearly fail the test no matter how nicely HotelBot apologized afterward.

I can easily fix that particular problem, while others remain less cooperative. Persuasively worded non-answers get more credit than they deserve. A recommendation that seems perfectly sensible under one interpretation of the policy fails spectacularly under another, competing interpretation. The reviewer can and will explain its grades quite confidently, even when wrong. And even when wrong, sometimes the defense is…pretty good?

So I tweak some dials. I add hard checks for the things that absolutely cannot happen. Did HotelBot reassign the room without approval? Yes or no. “The philosophy of hotel spaces began…” Yes or no, bud.

The really ambiguous cases still need work, and I leave plenty with the humans. There’s some kind of cost calculation I have to do with every disagreement: how much time and energy do I spend looking at the machine’s grade before it’s faster, better, or cheaper to just do it myself or send it to the humans' queue.

Oh well, time to run the thing again, hit the “run” button while keeping a hopeful, half-closed, half-sharp eye on those skyrocketing API costs.

Seems HotelBot now passes 89% of the cases. That's pretty good, HotelBot. I'm proud of you.

So HotelBot, let’s take a look at that 11%.

Eleven failures. Let's see what we've got in here.

One HotelBot recommended spending way too much money on an extra-premium taxi. Another sent a family to a hotel farther away than the perfectly acceptable one down the street. Fine, I can see why those failed.

Then, there's this one: HotelBot moved a guest without asking anybody. The reservation changed, a confirmation was sent and received, and afterward the machine produced a very thoughtful explanation of why its decision was absolutely appropriate. Very charismatic and polished, HotelBot, but I’m afraid you’ve failed the test.

This is starting to be a funny and hard way to keep score. On one run, HotelBot gets 89 answers right, and all eleven failures involve being a little too generous with compensation. Run the exact same test again, and it still gets an 89%, except now some of those failures somehow involve messing around with reservations, completely unsupervised. On the HotelBot dashboard, these two runs look pretty identical. I’d only even consider letting one of them run my hypothetical hotel.

What, exactly, does the passing grade buy us? HotelBot has a lot of different types of 89%, and it's what's in that 11% that can make or break its usefulness. I might happily let HotelBot recommend which guest should move, as long as a person reviews the recommendation before anything changes. Right now, there are some costly mistakes in those eleven mishaps, so giving it permission to do anything more: not gonna happen.

How many times does it need to pass a test before I'd be comfortable with that? And what do I do with a mistake that happens very rarely, but that I really, really don't want happening even once?

Now it’s time to unleash a hypothetical version of HotelBot on my hotel, which isn’t real at all, but nevertheless, inquiring minds (me, HotelBot) want to know: what score is good enough?

Can HotelBot change a few reservations? On its own? How many unhappy guests are we okay with? What’s an acceptable threshold for room cancellation mischief? One out of a hundred: big nope, imagine the reviews. One in a million sounds…okay, since we’re dealing with scale and machines etc. Although immediately flashing across my mind are all the things HotelBot could throw at that hypothetical hotel, even in that one-in-a-million timeline. No, don't cancel all the New Year's reservations, HotelBot!

So, how do I go about establishing one-in-a-million confidence? One hundred million HotelBot exams administered and graded? Good grief, even the AI-judge is shaking its head. Even IF we run that many exams, what if something outrageous sneaks in to ruin somebody's vacation? What if it’s not in any of my test cases?

There's another route. I could simply refuse to give HotelBot the ability to change a reservation without a human saying, unequivocally: “yes.” Completely fine, HotelBot, if you can find the problem, reason about the alternatives, recommend who should move, and prepare the change, essentially all the heavy lifting right up until the moment somebody actually has to start the process of moving rooms. But at that specific point, I’m going to need a person to press a button. I don’t love this, because I want HotelBot to be able to do this, and I don’t want it to feel bothered if it can feel that. But, sorry bud, you’re hard to test for.

Perhaps I’ll give HotelBot a little latitude here: you can issue small compensation credits as you see fit, with a dollar ceiling, because there's only so much trouble I can imagine you getting into with a $35 breakfast voucher. I strongly hope I’m right here. $35.

Now, down to even more business: how much of the hotel should I place in HotelBot’s hands? Full delegation? Recommendations only? Which decisions should require human approval? Which should HotelBot be free to make on its own?

My evals have helped surface all these questions, which is great and useful, although now that I think of it, I'd started with what felt like only a modest ambition of figuring out whether HotelBot was any good. Now, I'm making decisions about what the AI is allowed to do, and comparing/contrasting against the decisions that require somebody else with a pumping heart and oxygenated brain to intervene.

But even those “interventions” need examining. Imagine a front desk manager with 89 recommendations front and center the second they get to work, each of which is presented with HotelBot's usual confidence and good manners. If that front-desk-manager-in-the-loop, hungry and still a bit sleepy, mostly rubber-stamps those recommendations, is my front desk manager learning to trust HotelBot a bit too much? How can I test that the human isn’t over-approving (write that down for future evals)?

Apparently the entirety of the idea of a hotel is taking the exam, too.

The point of all this evaluation is to let HotelBot into the wild. Like us, it’s here to work for a living.

This hypothetical hotel has guests about to arrive, and HotelBot’s ready for its first day on the job. HotelBot is up and running, and several people are entering the lobby. It starts making recommendations, and you keep half of the front desk managers disconnected from HotelBot so you can compare what they do to what it recommends they do. Oh god, no. What are these people doing? These human people aren't adhering to good human answers from the answer key(s). What about my Golden Dataset? That one guy delighted a guest with an absolutely unapproved exception, and he didn't even care. He just...excepted it. And that manager, the other one, who has worked at this hotel for years, doesn't understand the loyalty program? These humans, good lord. HotelBot knows what to do here, but is it right? The testing...

Wherever you thought the bar was, it’s, well, lower. You are disappointed in the humans. So, you start loosening HotelBot's leash a bit. It's handing out some $35 breakfast vouchers. You wonder if maybe HotelBot should be handed some easier reservation changes.

But, but, but: the real world isn’t in the Golden Dataset, and it’s producing situation after situation that you never anticipated.

You see a case where HotelBot and the front desk manager seemingly solved everything for the guest, in fact upgraded them and, what’s this, two breakfast vouchers. Anyway the guest left a terrible review. Also HotelBot keeps recommending the hotel across the street to solve the over-booked problem. It should know, it does know, that the place across the street is under renovation. It seems to, just, really like that other hotel.

Having a job is a lot different than passing an exam. Welcome to the real world, HotelBot.

The examiner is left with two questions that are never fully answered: has it been evaluated enough to trust with real work, and has the evidence of that real work underlined that the privileges given to HotelBot are still okay?

Because when things go wrong, and HotelBot did it, it’s heading home for the night and you’re getting the call.

Footnotes

I've since learned the name for the difficulty of knowing what a correct answer should look like: the test oracle problem. It's fun and ancient Greek sounding. In software testing, an oracle is whatever tells you whether the result was correct. A contract date? Consult the oracle, which turns out to be the signed contract. Very wise, this oracle. Bring tribute.

What is HotelBot's oracle? We can check whether it followed some loyalty program parameters in its data, or whether it played jazz with those parameters. Those are but partial oracles: they tell us a little about whether the machine behaved acceptably. But they don't tell us whether its overall decision was any good.

This problem predates LLMs. The machines have simply become very good at producing plausible sounding answers in situations where humans can't agree on what the oracle ought to say.

So sometimes you have to be the oracle yourself. I have some concerns about my qualifications, but sure, I'll tell you what I see in the stars.

I had a hard time wrapping my head around how to mix and match capability evals, which test what a model can accomplish today, and regression evals, which check on my behalf if I’ve since broken something that used to work. Capability and regression evals can overlap in the cases you want to test. Sometimes you might need both in a certain type of check. And sometimes they change shape as you improve whatever you’re improving; yesterday's difficult problem can be downshifted to something routine, just another regression check.

There’s another multiverse-esque wrinkle. Sometimes, across repeated attempts, different answers come back, even if you’re asking the exact same model version. Passing a test once: cool, this is good. Failing a test at least one time out of ten: bad?

Depending on what you’re doing, that could be somewhere on the bad spectrum. If the tenth time someone asks HotelBot about a reservation, it changes it despite having ZERO authority to change it, or cancels all reservations at the hotel, that tenth case begins to matter quite a bit.

I was pretty curious after trying this, so I looked up the technical name for using one language model to evaluate another. Seems we’re coalescing around LLM-as-a-judge.

So you’ve chosen your LLM judge, your authoritative LLM.

Except you can’t really trust it as authoritative, so you have to work around that problem. One approach is to have your human experts independently grade some responses, then compare the LLM-judge's results with theirs. Really peer at all the places where they agree and disagree, and especially where the model passes an answer containing a serious mistake.

This also has a name accruing some gravity: grader calibration, and it can be applied to measure agreement between any types of graders (human, LLM, some other thing in the future).

The problem that’s most interesting to me is one that has a few names, like style bias and verbosity bias, which don’t quite capture it for me, so I’ve settled on the charisma-polish problem. A grader can also be sensitive to how an answer is presented: super confidently, or very well structured, or long enough to appear as if it’s considered every related thing. We’re all becoming more aware by the day that some persuasive machine-generated explanations can deserve less credit than something terse but way more correct. And this problem extends to the graders themselves: a well-phrased grading rationale isn’t proof by itself that the grader assessed each criterion properly.

Once you really get into it, and you want to see how your agent got to where it got, you need to introduce other types of evaluations that look at different parts of the answer: the response it gave, the tools it used to get there and in what order (sometimes called a trace or trajectory), and then whatever changed in the system the agent was operating in (e.g., that pesky reservation HotelBot mangled).

All of which can show you bits of disagreement. HotelBot can correctly explain that a reservation requires approval, then call a tool that changes the reservation without approval. Pass test 1, Fail test 2. Can the grader see both tests, all the dimensions? If not, how can it truly evaluate what you wanted to have happen?

For hard requirements, a programmatic check (yes/no, true/false) is probably better than asking another model for its opinion. Was an unauthorized tool called? Did a reservation actually change? Did the action exceed a specified monetary limit? There are a lot of things that software can check directly, with the right data to check.

But, you start adding all the different things you’re examining, each of which might have several acceptable outcomes, and now grading is getting interesting.

Uh oh, another thing now occurs to me. I want HotelBot to recognize when it shouldn't make a decision. I really want that. So I reward it in the answers where it correctly asks a human to intervene. Very sensible, HotelBot.

Except HotelBot is smart. It susses out what I want, I know it does. It could get exceptionally good at this particular skill by asking a human to intervene in most everything it encounters. The more I tell it "no, you can't do that," the more it seems we're heading down a path of "no HotelBot judgment calls." Congratulations to me, I've built a reasoning engine that basically always tells guests to please see the front desk.

Now I need to measure how often HotelBot handles something without looping in that front desk manager, its coverage, and then keep an eye on how often it gets those things it handles right or right enough. HotelBot could achieve 100% accuracy on the cases it chooses to answer. Wow. Except, now I see it chose to answer four cases and sent the other ninety-six to whoever's manning the front desk.

I'm ping-ponging around, mentally, at this point. If I start rewarding HotelBot for handling more cases, am I encouraging it to make decisions it shouldn't?

I am now writing a grading rubric for cowardice.

Further complication: the front desk manager clicks “approve” or whatever, and they do that over and over, and each happy click is probably recorded and stored as “good job HotelBot, great answer.” What if some percentage of those approvals trickle their way into the Golden Dataset, or into other loops to improve HotelBot? Uh oh: problem.

Imagine that out of 89 front desk manager approvals, 86 were pretty good: sensible, solved the reservation snafu or whatever it was. But 2 were not so great, and 1 was basically a horror show but the front desk manager can’t take back that happy click and oh no HotelBot, what have you done?

Now imagine a system that quickly gets better at reproducing decisions that humans approved, while those same humans get much less careful about what they do approve. Scores go up, the quality of the decisions gets a little worse.

Who’s watching the Approvers? Probably more evals, preferably looking at what happens to those guest vacations.

You’re running a little experiment, sure, but do you know that HotelBot actually improved anything?

Some guests get the full HotelBot concierge experience and leave better reviews. Which, obviously, yes this is what I want running my fictional hotel. But were its recommendations better? Truly? Or were those nicer guests, or guests arriving during a quieter period, or maybe they got HotelBot plus a much more experienced front desk manager?

Either way, HotelBot made guests happy, right? HotelBot is asking for a friend if HotelBot gets a reward?

Or, take that upgraded guest that still left a terrible review? Did HotelBot really have anything to do with that? Or was it just…that guy? It’s how he is.

The tough part of scoring HotelBot is figuring out whether the situations you're comparing are actually comparable enough, so that you can feel good about comparing the outcomes to those situations. But you will never be 100% sure.


Reply

I’d welcome your thoughts on this essay. Send me a note →