[
  {
    "startMs": 12800,
    "text": "Good afternoon, everyone. Um, thank you for coming. Hope you've had a great expo so far. We're in the last stretch, but I know it's been a wonderful, wonderful expo, at least for me. So hopefully you're learning a lot and we can teach you a little bit more. Um, so I'm Miguel. I'm the tech lead for, uh, our agent platform at Browserbase. For those of you who don't know, Browserbase is a infrastructure company for deploying agents on the web. Um, it basically unlocks all of the web, not just what is easily"
  },
  {
    "startMs": 42360,
    "text": "accessible, uh, by managing browsers in the cloud and all of the runtime that, uh, requires to do agentic web automation at scale. So, um, but-"
  },
  {
    "startMs": 54540,
    "text": "And I'm Corby. I'm a researcher at Microsoft, and, uh, I've been collaborating with, with Browserbase to help build really good verifiers."
  },
  {
    "startMs": 62480,
    "text": "So today we're here to talk about some research that we published about a month ago. Um, and it is regarding evals, it is regarding RL environments and LLM judges as verifiers. So early on-- So I've been working on this open source framework called Stagehand for about a year and a half now, and from the beginning, as any good agentic product needs to have, we were building evals to make sure that the changes that we"
  },
  {
    "startMs": 92560,
    "text": "were introducing in the framework and that the model capabilities continue to improve and hill climb on those evals. And at the beginning, all those evals were deterministic environments. Um, it was relatively simple. Model capabilities were some-some somewhat constrained, and so we were able to build a lot of deterministic environments. As model capabilities continued to improve, as we continued to make improvements on the agent harness, that just didn't scale. It-- we found ourselves constantly patching or generating static sites, um,"
  },
  {
    "startMs": 123140,
    "text": "coming up with longer trajectories with a lot of checkpoints to make sure that the evals were deterministically verifiable. And so there's many different project-- problems with automating the web at scale and verifying that what you intended to do actually succeeded. And it's that the web is very open-ended. There's not just one path to correctness. Um, there is no ground truth. Sometimes the web changes, and the product that you were checking for before is no longer there, so that"
  },
  {
    "startMs": 153740,
    "text": "breaks the whole determinism of your environment. And there's blockages. There's a lot of the environment errors that you face that don't let you get sort of a verifiable deterministic signal. So we recurred to what most people do, which is trying to use an LLM judge to help improve, um, and scale this operation. But we quickly found out that a lot of the leading benchmarks, and some of you may know about OSWorld, uh, for computer"
  },
  {
    "startMs": 183780,
    "text": "use, but there's some analogous benchmarks for web use called Online-Mind2Web and WebVoyager. Those come with LLM judges as verifiers. And what we noticed when we were using our sort of human expert annotators to verify the verifier is that in many instances, they're very confidently wrong, and that leads to results that you can't really trust."
  },
  {
    "startMs": 210880,
    "text": "So very quickly, we realized that even if you were using this as an RL reward or as a signal to improve your harness and auto research, you're not really training a better agent, you're just training a more confident liar."
  },
  {
    "startMs": 227380,
    "text": "And so in a real world use case at Microsoft, we trained this Fara-7B model, which is a, a web browser agent. And the same model on the same benchmark, we judged it according to the official WebVoyager judge, which is GPT-4o, uh, and it said that it had seventy-four percent, uh, success rate. But there's a huge gap between the real truth, which is when we used our new universal verifier, uh, which has high agreement with human labels, that, that number quickly becomes thirty-- like, thirty-eight percent. So there's a"
  },
  {
    "startMs": 257220,
    "text": "huge gap between what the ex-existing verifiers say and what is actually the ground truth, and so we needed to find a way to, to close this gap. The existing verifiers have lots of weaknesses. Um, they're u-- they use smaller and, like, much dumber models, uh, as the LLM, as a judge. They use o4-mini or GPT-4o. They don't even use rubrics. So rubrics are the most critical thing that you need to have because you need to assign credit to where credit is due. They don't look at the, the relevant screenshots or they, or they try to look"
  },
  {
    "startMs": 287260,
    "text": "at all the screenshots and they quickly get lost and overflow the context window of the LLM as a judge. And sometimes they don't even look at the final answer or the action history of the model. So our verifier checks all of these boxes. Um, and this is kind of how it works, uh, at a very high level. You can, you can look in the paper for more details. But given a task like book a cheapest flight from Seattle to Boston, the first thing we do is we generate a really good rubric, and I'll give some examples of that. And a rubric has like maybe N different criteria of what success looks"
  },
  {
    "startMs": 317280,
    "text": "like. And then given that, that criteria in the rubric, we look at the agent's trajectory. Uh, all of the screenshots in this case are the, the evidence of the ground truth. And we rank what are the most relevant screenshots in the trajectory for each criterion. And then we use that group of, of top K evidence to determine whether that criterion was met or not and if there's any like differences or contradictions between what the agent said it did and what the state of the environment"
  },
  {
    "startMs": 346980,
    "text": "actually showed. And then given that, we output, uh, a scored rubric which we call like a process score because it gives partial credit in some cases, and we give an-- we output a, uh, an outcome Boolean, uh, value to turn-- to basically say whether the agent accomplished the task according to what a reasonable user was ex-- would expect. Um- And so this is an example of what the rubric, uh, the rubric output is. It's basically a list of criteria, um, as"
  },
  {
    "startMs": 376948,
    "text": "well as the outcome verifier is basically a true-false flag with an explanation as to why a reasonable user would expect th-um, this trajectory to have succeeded or not. There were four guiding principles when we created this universal verifier. One is around rubric creation, which is we wanted to grade only what was asked and not any extraneous criterion. Uh, we also did not want errors to cascade from one rubric, uh, criterion to another. We wanted them to be isolated, and I'll give an"
  },
  {
    "startMs": 406728,
    "text": "example of that. You also wanted to look at the ground truth screenshots, like this is a must. The agents will often overconfidently claim that they did something when in fact they did not do it, and so you have to look at the ground truth state. And then we also needed to separate, um, what the agent could control versus what the agent could not control. The agent operates in a web browser. The web browser is an environment that it doesn't always have ability to control, and I'll show some examples of that too. So this is an example of what a good and bad rubric looks like. The task"
  },
  {
    "startMs": 436628,
    "text": "here is to, uh, find a cheap, uh, hotel in Jakarta for these dates, and then use the hotel's address to search for the closest coffee shop, and then output the name and address of that coffee shop. Now, a bad rubric, which we did see happen, would output a criteria saying like, \"Please tell me the total price for the stay at the hotel.\" This is actually an extraneous criterion that was not asked for in the task, but we saw a lot of rubrics naively generated do something like this, and they would artificially deflate the"
  },
  {
    "startMs": 466308,
    "text": "scores because the agent didn't do something it wasn't asked to do. Um, when it comes to not cascading errors, um, th-there are very subtle mistakes because a lot of tasks build on each other, uh, if they are like multi-step tasks. So in this example here, the task was to, um, determine the net worth of the individual with the longest last name from among the members of NSYNC and Backstreet Boys. Okay? And so the, the agent in this case"
  },
  {
    "startMs": 496348,
    "text": "mistakenly thought that Timberlake had the longest last name, which is only ten letters, whereas Kirkpatrick actually had the longest last name. So the, the model made one arithmetic mistake in one criteria of the rubric, and that should not cascade to the next criteria of the rubric, which is report the net worth of, of the person that you chose, right? So if you're able to report the net worth of Timberlake, uh, accurately, then you shouldn't get penalized in this criteria. You should only get penalized in that one. Hallucinations is the biggest one,"
  },
  {
    "startMs": 526848,
    "text": "uh, that we really wanted to focus on. So in this task, this is an example of a very subtle hallucination, uh, where you wanted to find some information about some image captioning model, and the agent said that this model had plus six point two percent in some CIDEr score. But in reality, the abstract of the underlying paper said it was only two point eight percent in CIDEr score. And so this was a, like a very subtle mistake that even humans will not catch unless an LLM will flag it. Um, so this"
  },
  {
    "startMs": 556828,
    "text": "kind of gives, uh, an overview of, of how process scores and outcome scores differ. Um, in the case we, we mentioned one of the principles was we wanted to separate controllable versus uncontrollable, um, failures. So if the task is to buy, say, this, uh, plushie toy from Amazon, and the agent accurately searched for the plushie toy but found that it was out of stock, it could not continue. And so here we say that the agent gets full marks for doing its best"
  },
  {
    "startMs": 586708,
    "text": "effort, uh, to achieve the goal, but the outcome was still not met because it couldn't buy the thing that it wanted to buy because it was out of stock. Um, so we basically enumerated a bunch of scenarios as to what could happen and how do we assign credit. If the agent was able to find a similar alternative plushie toy in a different way, um, it would still get success there, uh, for both, for both cases, and it would get penalized if it made a controllable mistake. Uh, it would get penalized if it made hallucinations, and so on and so forth. So we basically enumerated a, a"
  },
  {
    "startMs": 616828,
    "text": "schema of like all the possible failure modes and how we would assign credit to that, and the universal verifier adheres to those, to those schema. So-"
  },
  {
    "startMs": 625968,
    "text": "So basically, in, in order to evaluate the verifier and really tell whether or not we were able to hill climb the accuracy of that verifier, we started designing a lot of experiments with human experts and built a whole platform to collect data on what we call the ground labels that we've also released under CUAVerifierBench for others to train upon. But the process that we followed was the following. At first, we would show the full trajectory of"
  },
  {
    "startMs": 655968,
    "text": "evidence to the human verifiers, and the annotators would judge based on the evidence and the result of all the actions that the agent took. After that, they would be prompted to af-- seeing the judgment of the universal verifier to say whether they agree or disagree with the human-- uh, with the universal verifier. And we found this to be a very reliable signal to tell whether or not"
  },
  {
    "startMs": 685928,
    "text": "we were working in the right direction because... I'll jump to this one straight up, but the verifier started correcting humans at one point. They-- It would identify things that the humans were missing. And so ultimately, the result of the, of the universal verifier on these golden labels was that we were able to reduce false positives from almost half to zero. And Cohen's kappa is a metric to measure inter-annotator,"
  },
  {
    "startMs": 715408,
    "text": "inter-annotator agreement. Um, and what we can see here is that the hu- universal verifier agrees with humans as often as humans agree with one another. So we can see that point five eight Cohen's kappa score, uh, versus the two annotators per task, um, w-where we computed Cohen's kappa as well to see how much they agreed with one another"
  },
  {
    "startMs": 740938,
    "text": "Another way, another way to, uh, verify the-- another way to verify the quality of our verifier is to actually train on data filtered by it. So what we did was we did-- ran an experiment where we held constant the number of training examples. In this case, it was three K or nine K training trajectories. But we filtered those training trajectories based on whether our verifier said they were pass or not. And so when you're doing SFT, which is what we did here, you wanna train only on SFT examples where"
  },
  {
    "startMs": 771098,
    "text": "they were true, uh, like successful trajectories. And so if you train on three thousand trajectories filtered by the process score of our universal verifier, you will get a much higher quality model than if you were to train on a worse verifier, like our own, uh, a baseline verifier. And this held at larger scales as well. And so this basically-- this experiment told us that, uh, if you have a higher quality verifier, it means you can filter higher quality data, uh, and training on that data leads to a higher"
  },
  {
    "startMs": 801058,
    "text": "quality model. And so this was like the ultimate experimental proof, in addition to the, um, uh, to the, to the human agreements, uh, that this model, this verifier is working and is, and is reliable, um, in a real production, uh, scenario. Um, the last thing we did kind of as a side project is we wanted to determine whether AI in auto research can build the same verifier that we built. So basically what I did, and what Miguel and I did, is we"
  },
  {
    "startMs": 830958,
    "text": "sat down for three weeks, um, to build the universal verifier and to tweak the prompts and to write the code for it. And we basically ran about thirty different experiments over the course of three weeks to determine whether the verifier we were building agrees with human labels. Okay? And so that's what the Cohen Kappa score here on the y-axis is measuring. It, it measures whether an individual verifier system is agreeing with the human labels. And so the blue line here is the model Miguel and I-- the, the system Miguel and I"
  },
  {
    "startMs": 860758,
    "text": "were, were creating, this auto research, uh, this, uh, universal verifier. And then we wanted to see if, if we stripped everything that we did away, could AI, um, in an auto research loop, build the same verifier that we built with the same level of quality and fidelity? And that's what the red and green lines here are. The red line is, if we took away all of our code and prompts, could AI replicate that? The conclusion that we got from this is that while we took about three weeks to build this verifier, uh, an auto research loop"
  },
  {
    "startMs": 890758,
    "text": "could do it in about one day. It ran the same number of experiments in about one day. However, it only reached about seventy percent of the agreement that our verifier, uh, was able to reach. So there's still a gap there. And so the-- kind of the conclusion that I would draw here is that, uh, you can use auto research to build, uh, metrics and verifiers, um, at least to help you speed up, uh, experimentation. Um, but you probably still need some level of human intervention here. Um, then"
  },
  {
    "startMs": 920658,
    "text": "again, these, these results were from Opus four point six. I haven't tried it with Fable yet. Maybe it will do better. But it's a pretty powerful baseline, and it got pretty far, um, along the way. So not only can auto research help you build a model, but in this case, auto research can help you build a verifier as well, which we thought was a pretty cool, um, thing. And, and building verifiers is as important as building the models themselves, is one of the takeaways I wanna leave you with. So..."
  },
  {
    "startMs": 947878,
    "text": "Yeah. And just to double emphasize, um, the green line is the auto research verifier, um, primed with a lot of the findings that we had gotten from the three weeks of experimentation. And in that optimization, it was able to reach higher percentages than we were ever before. So combining that human intuition with auto research loops has proven to be the most powerful recipe for many research tasks. Um, so"
  },
  {
    "startMs": 977878,
    "text": "the-- all of the work is open source. The paper is published under this, uh, as a preprint, um, on arXiv. Um, and the Microsoft Fara repo contains the golden labels on CUAVerifierBench. It contains the code to run the experiments. But beyond that, um, this research also yielded an entire new benchmark. So we've talked briefly about Online-Mind2Web and WebVoyager. I"
  },
  {
    "startMs": 1007758,
    "text": "spend a lot of time working with labs, helping make sure that we can provide a quantitative signal to improve their models. A lot of those open source benchmarks are very quickly getting saturated, and it is very difficult to provide any sort of signal because it feels like the, the test data is already in the distribution of the training data. And so this new benchmark has proven to have the biggest gap to complete success, and it's my daily driver"
  },
  {
    "startMs": 1037838,
    "text": "to make sure that I can tell whether model capabilities are strong, whether they lack, and how to continue to close the gap. So..."
  },
  {
    "startMs": 1047778,
    "text": "Did you have more slides?"
  },
  {
    "startMs": 1048838,
    "text": "No."
  },
  {
    "startMs": 1049218,
    "text": "Okay."
  },
  {
    "startMs": 1050118,
    "text": "We can take a little bit of, I think, questions, but, uh-"
  },
  {
    "startMs": 1053118,
    "text": "Yeah"
  },
  {
    "startMs": 1053178,
    "text": "... we're good on time."
  },
  {
    "startMs": 1055618,
    "text": "Thank you. Yes. So my question is on universal verifiers. Have you tried other things like just computing tasks and other kinds of services? Yeah. So the question is, the question is whether we've used the, uh, the universal verifier for other kinds of tasks beyond just web, web tasks. So one thing we're working on in Microsoft right now is to apply a version of this verifier for desktop tasks, like things that you would do on your laptop, like kind of enterprise workflows. And so we hope to publish another benchmark, uh, of not"
  },
  {
    "startMs": 1085578,
    "text": "just web data, but also, like, enterprise-style desktop data. Uh, and we would have basically the sim-- the same kind of verifier for that too. It would look at a little bit more information, because on desktops you have the terminal, you have more telemetry, more logs than just the browser. So the verifier would take those things into account as well. Yeah. Any other questions? Yeah."
  },
  {
    "startMs": 1109750,
    "text": "So I personally never built a verifier, so I'm just curious. Um, but when you did the presentation, I was thinking about, like how do you think about, uh, ensuring that you're not overfitting, uh, you know, trajectories? Because if you do a supervised learning trajectory-"
  },
  {
    "startMs": 1124290,
    "text": "Yeah"
  },
  {
    "startMs": 1124390,
    "text": "... you also have-- You did show some diverse use cases, so it tells me like you are definitely thinking about it. But what, what would you say in terms of like any guidance or prompting about not overfitting when you're building versus supervised learning?"
  },
  {
    "startMs": 1140950,
    "text": "Yeah."
  },
  {
    "startMs": 1142390,
    "text": "How do you do it? Uh, how-"
  },
  {
    "startMs": 1143350,
    "text": "Yeah, so the question is about how do you make sure you're not overfitting the verifier to the human labels, because that is a problem. Uh, Miguel and I spent a lot of time,  uh, working on this question. And so, like one thing that we did was we, uh, kind of held out, uh, two sets of labels. One-- We, we basically had a set of like a hundred and fifty trajectories. Um, on about fifty of those trajectories, I labeled them myself, and I used them to hill climb the-- in those 30 experiments. But for the other hundred trajectories, they were"
  },
  {
    "startMs": 1173310,
    "text": "basically held out to us. They were done by humans, uh, that we had paid, uh, with like two X overlap. So once our verifier was done being built, we gave it to those human annotators, and each human labeled each trajectory. Sorry, two humans labeled each trajectory, and then that's what we published in CUAVerifierBench. And so those are the numbers that we report here. Um, so we're pretty confident that we didn't overfit because we held out at least two-thirds of the labels."
  },
  {
    "startMs": 1203370,
    "text": "Um, like, we did not train, uh, like iterate on them. Yeah. So that's very important, is you don't wanna train on, like-"
  },
  {
    "startMs": 1214210,
    "text": "Thinking about your own, like, like personal verifier, I'm gonna have to hire new people to be able to actually like"
  },
  {
    "startMs": 1224350,
    "text": "Yeah. Yeah, yeah, the gold standard is, uh, is to hire humans, um, and train them to do the t- the verification task themself, and then see whether your system agrees with it. Yeah. Any other questions? Anyone wanna help us build more benchmarks?"
  },
  {
    "startMs": 1243470,
    "text": "Yeah. Oh, yeah. Okay. Okay. Yeah, yeah, yeah."
  },
  {
    "startMs": 1249910,
    "text": "Awesome. Well, thanks a lot. Uh, hopefully you enjoy the rest of the expo. It was a pleasure. Um-"
  },
  {
    "startMs": 1254530,
    "text": "Thank you so much."
  },
  {
    "startMs": 1255130,
    "text": "Thank you so much."
  },
  {
    "startMs": 1273090,
    "text": "Yeah, yeah."
  }
]
