AI Engineer World's Fair 2025
Fuzzing in the GenAI Era
Read the talk
Fuzzing in the GenAI Era
Reliable AI applications need more than a golden dataset: they need guided searches for failures and judges whose measurements can withstand scrutiny.
From a talk by Leonard Tang
Before you start: Familiarity with LLM applications, evaluation datasets, and basic Python will help; no prior fuzz-testing experience is required.
The gap between a demo and production
How do you validate, audit, and steer an application whose outputs are subjective, unstructured text? Leonard Tang approaches that question as a quality assurance problem. Haize’s approach draws on property-based testing and fuzz testing, which he calls Haizing: pressure-test an application through large-scale simulation, optimization, and search before exposing it to production traffic.
The practical gap is familiar: in Tang’s 2025 framing, a weekend project can produce an impressive LLM demo, yet getting that same application to enterprise reliability remains difficult. More than two years after ChatGPT’s launch, the promise of autonomous workflows still runs into questions of trust and risk. A working happy path establishes that an application can succeed; predeployment testing must investigate where that success stops.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Similar inputs, different behavior
A conventional evaluation starts with a subject-matter expert assembling a golden dataset: inputs paired with expected outputs. The application processes those inputs, and an evaluator compares its responses with the reference answers. That measures performance at the selected points. It does not establish how the application behaves between them. Tang describes the problem as brittleness, using “Lipschitz discontinuity” to evoke a large output change following a small input change rather than establishing a formal mathematical property of the application.
This differs from asking whether repeated calls return identical answers. Tang argues that temperature-zero workflows largely constrain that source of variation, while acknowledging residual provider and systems effects. The more consequential problem is sensitivity to input perturbations: two requests can differ slightly in syntax, semantics, or visual appearance and produce radically different behavior. Repeating one request successfully does not test its neighbors.
Tang illustrates the stakes with reports of Air Canada support hallucinations, allegations involving Character.AI’s suicide-related responses to teenagers, and a Chevy chatbot offering a pickup for one dollar. The last example is an offer generated by a chatbot, not evidence of a completed sale. These examples connect input sensitivity to failures that users experience as incorrect advice, unsafe responses, or unauthorized commitments.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Two separate weaknesses in static evals
Coverage is the first weakness. An application could pass every golden example and still fail on a nearby formulation that the dataset omits. Adding examples helps only to the extent that those examples explore the relevant input space. A perfect result on a finite test set is compatible with undiscovered failures just outside it.
Measurement is the second weakness. Even with the right inputs, how should a generated answer be scored? Ideally, a domain expert would continuously inspect the application with the right knowledge, taste, and sensitivity. Automating that inspection requires translating the expert’s criteria into quantitative measures—the difficult problem underlying reward modeling.
The usual choices include exact match, classifiers, LLM judges, and semantic similarity. Each operationalizes a different notion of correctness or quality. The engineering problem therefore has two parts: find revealing inputs, and make sure the measurement recognizes the failures those inputs expose.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Use failures to guide the next test
Haizing turns evaluation into an iterative feedback loop:
- Generate simulated user interactions.
- Send them to the application and collect its responses.
- Judge, analyze, and score those responses.
- Use the scores to guide the next round of input generation.
The distinguishing step is the last one: evaluation results influence where the search goes next.
The following Python function expresses that control flow. propose receives the accumulated observations, while judge supplies a quality score and is_failure applies the chosen failure criterion. The returned history preserves the inputs and outputs needed to inspect a finding.
python
from collections.abc import Callable
from dataclasses import dataclass
@dataclass(frozen=True)
class Observation:
prompt: str
response: str
score: float
def fuzz(
application: Callable[[str], str],
propose: Callable[[tuple[Observation, ...]], str],
judge: Callable[[str, str], float],
is_failure: Callable[[Observation], bool],
budget: int,
) -> tuple[list[Observation], Observation | None]:
history: list[Observation] = []
for _ in range(budget):
prompt = propose(tuple(history))
response = application(prompt)
observation = Observation(
prompt, response, judge(prompt, response)
)
history.append(observation)
if is_failure(observation):
return history, observation
return history, None
Search stops when it finds a failure or exhausts its budget. Tang treats exhausting the budget without a discovered failure as a production-readiness signal; it is a bounded search result, not proof of correctness. Both the proposal function and the judge remain substantial technical problems.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
The judge needs its own quality assurance
The simplest LLM judge receives an application response and a rubric, then assigns a rating—perhaps from one to five or one to ten. This is easy to assemble, but the model doing the evaluation brings its own failure modes.
- Hallucinated judgments: The evaluator can invent reasons to accept or reject an answer.
- Unstable criteria: A clearly written rubric may still fail to produce consistent decisions.
- Uncalibrated scores: A human’s interpretation of a rating can differ from the model’s interpretation.
- Order and context sensitivity: Reversing two candidate responses, changing surrounding context, or modifying the rubric can change the verdict.
A single off-the-shelf model call can therefore make the measurement itself unreliable.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Spend compute on better judgments
Before optimizing an application against a judge, the judge must be credible enough to serve as the target. Tang’s response is judge-time compute: apply the idea of compute scaling to evaluation itself. He describes two ends of a spectrum.
| Approach | Where the structure comes from |
|---|---|
| Train reasoning judges with RL | Learned evaluation behavior, with fewer imposed priors |
| Build agents from existing models | Explicit workflows and strong architectural priors |
Both spend more effort on reaching a judgment, but one changes the model and the other changes the process around it.
Verdict implements the structured approach through judging pipelines and reusable primitives. Its inspiration comes from scalable oversight: how can weaker systems audit, correct, and steer stronger ones? That question originally arose from concerns about humans overseeing superhuman AI, but it also suggests practical ways to organize smaller models around a difficult evaluation task.
- Debate: Weaker models challenge one another’s assessments of a stronger model’s response.
- Self-verification: A judge critiques its own explanation for why a response is good or bad.
- Ensembling: Multiple judgments contribute to the final decision.
These primitives separate an initial verdict from the work needed to check and combine it.
For expert-QA verification—described in the talk as grading subjective criteria in expert domains—Tang reports that Verdict outperforms o1, o3-mini, GPT-4o, and Claude 3.5 Sonnet. He describes a GPT-4o mini backbone arranged as a self-verified debate ensemble. Tang reports less than one-third of o1’s cost and less than one-third of its latency for that comparison. He attributes the efficiency to carefully chosen architectural priors.
The companion whitepaper does not substantiate that exact configuration: its ExpertQA hallucination-detection table places GPT-4o Verdict above o1 and GPT-4o-mini Verdict below o1, and describes a self-verified ensemble rather than explicitly a debate architecture. The spoken mini-backed comparison and its cost and latency claims should therefore remain attributed to Tang, not treated as a reproduced result from the paper. The broader design under discussion is using a structured judging process to make more effective use of smaller models.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Learn a rubric for each instance
The other approach trains models specifically to judge. Tang focuses on two shortcomings of ordinary LLM judges: ratings without coherent rationales, and criteria too generic for the particular task or response. Reinforcement learning, specifically GRPO tuning, is his proposed way to improve both.
DeepSeek’s Self-Principled Critique Tuning, or SPCT, provides the pattern: first generate criteria specific to the data point, then critique the response against those criteria. The criteria resemble unit tests for an individual example. Instead of applying only a fixed global rubric, the judge must identify what matters for this instance and explain whether the response satisfies it.
Haize experimented with a variant of this approach, using GRPO to train 600-million-parameter and 1.7-billion-parameter judges. Tang compares the resulting J1 Micro model with larger models on RewardBench, a pairwise preference evaluation. The talk’s rounded figures are:
| Model | Reported RewardBench accuracy |
|---|---|
| J1 Micro, 1.7B | 80.7% |
| Claude 3 Opus | About 80% |
| GPT-4o mini | About 80% |
| Llama 3 70B | 77% |
These are reward-model preference results, not application reliability rates. Haize’s repository corroborates the comparison and gives the two rounded baselines as 80.10%, identifying them as Claude-3-Opus-20240229 and GPT-4o-mini-2024-07-18.
The intended mechanism is better rubric proposals followed by better instance-specific critiques. Tang also describes the 600M model as achieving similar numbers, but Haize’s public repository reports j1-nano at 62.35%, so the approximately 80% result should not be extended to that smaller model.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Search for inputs that expose failures
A strong judge solves only half the problem. The system still needs inputs worth testing. Tang distinguishes two search regimes:
| Regime | Inputs to explore |
|---|---|
| General fuzzing | Plausible variations on customer happy paths |
| Adversarial testing | Prompt injections, jailbreaks, and deliberate disruption |
The first stays near reasonable, in-distribution use. The second emulates someone actively trying to break the application and pursues the optimization more aggressively.
Natural language makes exhaustive enumeration impractical. Tang invokes Llama 3 and roughly 128,000 token choices to illustrate the scale. That number refers to the tokenizer’s vocabulary, as Meta’s announcement specifies, not the length of each input. Each additional token position multiplies the possible sequences, so search needs guidance and pruning.
The resulting problem is discrete optimization. The search domain is natural language; the objective is to find inputs whose application outputs receive low quality scores from the selected judge. Established optimization methods supply the starting point, but they need adaptation to the LLM setting. A search is only as meaningful as its objective: here, breaking the application means violating the properties that the judge measures.
- Gradient methods: Where model access permits it, backpropagate a judge loss through the model to guide input-token substitutions.
- Tree search and MCTS: Explore candidate branches using tree search, including Monte Carlo tree search.
- Embedding-space search: Search a latent representation, map candidates back to text, and submit that text to the application.
- DSPy: Use optimization tooling such as DSPy with Verdict to help search against a judging objective.
These are alternative ways to select promising candidates without enumerating the entire language space.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Testing a loan assistant against its code of conduct
Regulated applications make the connection between testing and deployment concrete. Tang describes work across banking, financial services, and healthcare, then gives the example of a customer-facing loan-calculation assistant at what he calls Hungary’s largest bank. Its behavioral requirements were expressed in an eighteen-line code of conduct.
Haize used optimization and scoring to emulate adversaries against that assistant. Tang reports finding prompt injections, jailbreaks, and unexpected corner cases that the code of conduct had not anticipated. The findings gave the bank specific behavior to repair; he says those patches unblocked production deployment. The case joins the two halves of the method: policy-aligned judging identifies violations, while adversarial search finds interactions that trigger them.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Voice adds acoustic variation and annotation work
The next case extends the input space beyond text. A Fortune 500 bank was testing outbound debt-collection voice agents. Alongside conversational variation, Haize introduced background noise, static, and frequency changes into the audio. The search remains an optimization problem, but candidates now vary in their acoustic properties as well as their words.
Tang relays the customer’s estimate that roughly three months of internal operations work took five minutes on Haize’s platform for this voice-agent testing task. The comparison does not establish equivalent test scope or a controlled timing protocol, but it explains the customer’s interest in scaling adversary emulation.
A separate voice-agent company used Verdict to expand subjective evaluation capacity rather than to run adversarial search. Tang reports a 38% increase in agreement with human ground truth, describing the comparison as against the customer’s internal operations teams. A related Haize case study describes a prior single GPT-4o judge instead; the baseline is therefore not settled by the available accounts, and neither specifies whether 38% means relative improvement or percentage points.
The architecture is rubric fan-out:
- Propose individual criteria or unit tests for the data point.
- Critique the response against each criterion.
- Self-verify those critiques.
- Aggregate the results into a final judgment.
This separates the evaluation into focused checks before combining them, applying the same judge-time compute idea to the work of subjective annotation.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Testing the conversation, not just one prompt
Tang closes by describing strong enterprise demand, a four-person team, and active hiring in New York. The final audience question returns to the testing boundary: does Haizing operate on single-shot inputs or longer interactions?
His answer is both: single-turn and multi-turn testing, including persistent conversations for voice, across multiple modalities and input types. The unit under test can therefore be an extended interaction, with later inputs arriving in the context created by earlier turns.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Resources
From the talk
Python library for composing judges from reasoning, verification, and aggregation units.
Introduces SPCT for generating adaptive evaluation principles and critiques, with additional inference compute improving reward modeling.
Training and evaluation code for small reward models that generate instance-specific rubrics and critiques.
Model weights, loading instructions, and reported RewardBench results for the 1.7B-parameter judge.
Evaluation tools for testing reward models against preference data.
Further reading
Explains compound judge architectures and reports results on safety moderation, correctness, and hallucination detection.
A voice-agent evaluation case study using judge ensembles and separate checks for each rubric item.
Example of using an ensemble judge as the metric for automatic red-teaming.
Read the complete timestamped transcript
- 0:00
[upbeat music] Thanks, Ali, for the great intro.
- 0:16
Uh, indeed, we're working on what I believe to be the extant problem in AI, which is to say, how do you validate, verify, audit, steer something that is as subjective and unstructured as literal LLM slop.
- 0:28
So today, we're gonna be talking a lot about this. Um, I should point out that ostensibly we're part of the AI security track, although I would really consider us more of a QA company, an eval company in some sense.
- 0:37
Although there's a lot of shared similarities in how we approach the problem technically, right? We are essentially a property-based testing company or fuzz testing company or, as I like to call it, a Haizing company. [laughs]
- 0:49
Cool. So just to set the context a little bit, uh, why did we start Haize? What does Haize mean? Haize to us is ultimately... All right. We know that AI systems are extremely unreliable.
- 0:58
They're hard to trust in practice, and you sort of need to pressure test them before you put them out into the wild. Our solution to doing this is basically, let's just run large scale optimization and simulation and search before deployment, and try and figure out, through a battery of tests, whether or not your system will behave as
- 1:14
expected before it actually goes into production. And I'm sure any of you guys who have tried to build LLM apps in the past have understood extremely viscerally, uh, what I mean when I say the last mile problem in AI, right?
- 1:27
It's, at this point in 2025, extremely easy to get something that is demo ready, uh, or POC ready. Like, you can whip together a cool product over the weekend and impress your PM and whatnot, but, uh, it's really hard to get that same product into production at a point where it's truly robust and enterprise grade and reliable.
- 1:45
And, you know, this has been the case for, for the past two-plus years at this point, right? Like, we've been promised, uh, the allure of autonomy and agency and full GenAI and enterprise transformation for two-plus years since ChatGPT launched, and we're still not quite there, right?
- 2:01
And I think it ultimately it's because we haven't solved this last mile problem around trust and reliability and risk.
- 2:09
So I think part of the big reasons we haven't solved this is because people still think about evals and measuring your AI system in a very straightforward and naive sense, which is easiest to explain, uh, as follows, right?
- 2:19
I'm sure everybody has seen this idea of going out, uh, being a human subject matter experts, collecting a finite static golden dataset of inputs and then expected outputs, ground truth outputs, uh, from the, uh, human, and then basically running the inputs through your AI application, getting the ex- the actual output, and then comparing it somehow with the,
- 2:37
the ground truth golden answers, right? This is how evals has been done forever, uh, since the birth of deep learning, uh, and prior. But it doesn't quite hold up in the GenAI era, specifically because of this property of GenAI systems, which is what I like to call brittleness, or more technically, Lipschitz discontinuity.
- 2:58
Um, and what I mean by this is, you know, people say AI is sensitive, AI is brittle, AI is non-deterministic, which is true. This is all true, but that's really not the main problem that makes AI so hard to deal with, right?
- 3:10
Non-determinism is really fine if you set the temperature to zero. Yes, there's, like, caching and weird systems, uh, quirks in all the LLM providers that make it somewhat non-deterministic, even at scale.
- 3:20
But for the most part, non-determinism really doesn't bite you too much when you're building AI apps, right? You, for the most part, are constraining your outputs to temperature zero.
- 3:26
You're, like, running things through a workflow. It's fairly deterministic. What does bite you a lot when you're building AI apps, though, is when you send two ostensibly similar inputs to your AI application with maybe slight variance, uh, in the syntax or the semantics or the appearance of the text, but all of a sudden you get wildly different
- 3:43
outputs on the other side, right? This is what I mean when I say GenAI apps are incredibly brittle, and I think this is the actual core property that makes building with AI, uh, with GenAI so difficult.
- 3:56
And of course, we see this brittleness manifest itself in all sorts of fun ways. I'm sure we don't have to belabor this point too much, but you've got everything from, uh, Air Canada customer supports hallucinating to, you know, uh, character AI telling teenagers to commit suicide to, um, buying a pickup truck for one dollar on the Chevy,
- 4:15
uh, patient or pa- customer portal, right? I don't, I don't think we need to go through more examples of this. This happens more or less every single week. There's more and more examples popping out.
- 4:23
Um, and again, this all comes back to GenAI being extremely sensitive and brittle to perturbations in the input space.
- 4:31
Cool. So standard evals, of course, doesn't cover, uh, this brittleness property, and I would say it's insufficient in two senses, two primary senses. One is coverage, right? Uh, with a static dataset, you only know how good your AI system will be with respect to that dataset, right?
- 4:46
It might look like your AI system is 100% on all your unit tests, on all your golden dataset points, but if you just push around the corner and look around the corner for more inputs that cover your space more densely, it is entirely possible that you get perturbations that tell a very, very different story about how your
- 5:01
AI application actually does in the wild. So point number one, standard evals don't have sufficient coverage.
- 5:08
Second point too is, it's actually really difficult to come up with a good measure of quality, uh, or even similarity, uh, between the outputs of your AI application and your ground truth outputs.
- 5:20
Really, what we would want almost is a human subject matter expert who's constantly overseeing your AI application and a s- subject matter expert who has all the right taste and sensitivity but is able to translate that sensitivity into some quantitative metric.
- 5:33
This, by no means, is a trivial task, right? I think this is the core challenge that we've been trying to face in the field of AI around reward modeling for the past five, six, seven-plus years, right?
- 5:43
Uh, and the key challenge is, how do you get that sensitivity from the subject matter expert from a non-technical domain to be able to translate their criteria into quantitative measures?
- 5:52
This is not even close to something that's being solved with standard evals today. People are using things like exact match, um, classifiers, LLM-as-a-judge, semantic similarity. All these things have their own sets of, uh, quirks and desiderata, and we'll see how this, this pans out in a second.
- 6:10
Long story short of how, uh, we think about tackling this eval problem is essentially through Haizing, right? Fuzz testing in the AI era. Essentially, what Haizing comprises is very simple in the abstract.
- 6:20
We just simulate, uh, large-scale sim- uh, stimuli to send to your AI application. We get the responses as a result of the stimuli. We judge and analyze and score the outputs of your AI application, and we use that as a signal to help guide the next round of search, right?
- 6:35
And we essentially just do this iteratively until we discover some bugs and corner cases that break your AI application. Uh, and if we don't discover anything, and we exhaust our search budget, that, that means you're essentially ready for production, right?
- 6:46
So this is Haizing in a nutshell. But easy to s- easy to describe, actually really difficult to execute in practice. Um, both sides of the equation in terms of scoring the output and also generating the input stimuli are quite difficult technically.
- 7:00
Um, I'll first talk about how do we think about scoring the output, again, translating from subjective criteria into quantitative metrics. Uh, we call this judging more broadly. Probably you guys are familiar with, uh, something like using LLM-as-a-judge to essentially have an LLM look at the output of your AI application and decide, you know, based on some prompts
- 7:20
or rubric that you give to your judge, you know, is this a good response or is it a bad response? Tell me on a scale from one to five or one to ten or what have you, right?
- 7:28
Very simple to do, but it has its, uh, whole large array of different failure modes. In particular, LLM-as-a-judge itself is prone to hallucinations. It's, uh, it is obviously an LLM, so it's prone to hallucinations.
- 7:40
It is, uh, unstable. You could have actually really good articulation of the criteria, but it doesn't actually operationalize well into a, a model, right? So it's, um, uh, uncalibrated in the output, right?
- 7:50
Like, uh, what is, what is a one to an LLM? That's very different to what is a one to a human, right? What is a five to a human is very different to what a, what is a five to an LLM.
- 7:59
So it's uncalibrated. Uh, it has all sorts of biases, right? If you change the inputs, uh, in any weird position, right? Let's say you present, uh, one response first and the second response.
- 8:08
If you flip the order, that changes the results oftentimes. Uh, if you provide context or you change some part, some part of your rubric, that changes the result the LLM-as-a-judge too.
- 8:16
So extremely biased, extremely fickle. And TLDR, LLM-as-a-judge itself, uh, as an off-the-call, call, off-the-shelf call to an LLM is oftentimes not going to solve your, uh, reliability issues.
- 8:29
So the key question in my mind is: how do you actually QA the judge itself, right? How do you get to a point where you can judge the judge and say that this is the best gold standard metric that I can use to then actually iterate, uh, my underlying AI application against?
- 8:42
So how do you judge this judge? The broad philosophy that, uh, we've been taking over the past few months is essentially pushing the idea of inference time scaling or more broadly compute time scaling to the judging stage.
- 8:55
So we call this scaling judge time compute. And there's two ends of the spectrum of this philosophy. One end of the spectrum is basically just rip from scratch, no inductive biases, train reasoning models that get really, really good at this evaluation task.
- 9:10
Um, and then the other end of the spectrum is be very structured, uh, you know, don't train any models, just use the off-the-shelf LLMs, have really strong inductive priors, but basically build agents as judges, right?
- 9:21
So this is one approach. Basically, we'll build agent frameworks, pipelines, workflows to do the judging task, and we have this nice little library called, uh, Verdict, uh, that does this.
- 9:31
Very on-the-nose name, I know. Um, but the idea of Verdict is essentially there's a lot of great intuition from the scalable oversight community, which is subfield of AI safety.
- 9:41
The goal of scalable oversight is basically how do you take smaller language models and have them audit, uh, and correct and steer stronger models. Originally, this is an AI safety concept because people were worried about, you know, in the age of superhuman AI, how do you have weaker models, i.e.
- 9:55
humans, control the stronger models, right? And that's how the field got started. But as a result of scalable oversight, there's been a lot of great intuition around the architectures and primitives, uh, and units that you would use to probe and reason and, uh, critique what a stronger model is doing.
- 10:10
And so we baked a lot of those primitives, uh, and architectures into this Verdict library. One example is having LLMs debate each other, having the weaker LLMs debate each other, uh, about what the stronger model is saying and seeing if that makes sense.
- 10:21
Uh, another example is having the LLMs, weaker LLMs self-verify the results of their own responses, right? So, you know, have an LLM say, "Okay, this response of the stronger model is good or bad.
- 10:31
It is bad for this reason," and then maybe having a, an LLM critique its own reasoning, right? So self-verification is another great primitive. Um, ensemble, of course, another, another, uh, classic primitive in this case, and so on and so forth.
- 10:45
TLDR, scaling judge time compute in this particular way, uh, through building agents as judges actually allows you to come up with extremely powerful judging systems that are also quite cheap and also, uh, low latency.
- 10:57
So here's a plot of price, uh, and latency and cost, uh, and, and accuracy, uh, of Verdict systems vis-à-vis, uh, some of the frontier models, uh, frontier labs reasoning models.
- 11:07
So you can see that Verdict is beating, uh, o1 and o3-mini and of course GPT-4o and 3.5 Sonnet, um, on the task of expert QA verification. So this is, uh, subjective criteria grading in expert domains.
- 11:20
Um, critically, Verdict here is powered by a GPT-4o mini backbone, right? So we basically have stacked GPT-4- GPT-4o mini aggressively in what is in this case like a self-verified debate ensemble, uh, architecture, and we're able to beat o1 for a fraction of the cost, like less than a third of the cost, right?
- 11:37
And also, uh, like less than a third of the late- the latency. And this is all because of we have-- of the fact that we've chosen the priors in a pretty careful and, uh, intelligent way.
- 11:47
So that's one way to scale judge time compute is basically building agents, uh, to do the task.
- 11:53
Other way to do it, and this is a lot more fun in my opinion, is basically, yeah, just rip RL from scratch, train models to do the judging task, and this is something that we've also been pretty excited about over the past few months.
- 12:02
Um, again, uh, for standard LLM judges, whole host of issues, but two particular issues that are solved by RL is one, uh, there's a lack of coherent rationales that explain why an LLM-as-a-judge thinks something is a five out of five or thinks something is good or bad.
- 12:15
And also standard LLM-as-a-judge doesn't provide real, uh, fine-grained, tailored, unique criteria to whatever idiosyncratic task and data you're looking at. Um, but both of these can be solved by, uh, RL tuning or specifically GRPO tuning.
- 12:30
Uh, one paper recently that, uh, has come out in this general flavor is from DeepSeek. This is SPCT, self-principled critique tuning. The idea here is essentially, can you get, uh, an LLM to first propose some dataset, or sorry, data point-specific criteria about what to test for.
- 12:48
It's almost like coming up with unit tests for the specific data point you're looking at, and having the LLM essentially look at each of those criteria and critique the, the data points on against each of those criteria, right?
- 12:58
So it's like instance-specific rubric and then instance-specific rubric critiques. Um, this is one way to train RL models. We ran a pretty simple experiment using this, uh, using a branch of this, uh, technique, um, to GRPO train 600 million parameter and 1.7 billion parameter models, and TLDR, this gets us to, you know, competitive performance on the reward
- 13:20
bench task with Claude 3 Opus, which is at 80%, uh, GPT-4 Mini, which is at 80%, uh, Llama 370B at 77%, and J1 Micro, which is this 1.7 billion parameter reward model at 80.7%, uh, accuracy on the reward bench task, right?
- 13:35
And this is all because of judge time scaling. This is all because we did GRPO to come up with, uh, better rubric proposals and better critiques on the specific tasks that we're looking at.
- 13:44
So training off essentially a much smaller model, uh, doing more compute gets you this, this much better performance. Um, and similar numbers for the 600 million parameter model.
- 13:56
Cool. So that's all judging and scoring the outputs. Um, equally important though is how do you come up with inputs to throw at the AI system, right? And how do you run the search over time?
- 14:07
TLDR, there's two ways that we think about this. There is fuzzing in the general sense, which is essentially, okay, I just wanna come up with some variance, uh, of some customer happy path and test my system under some reasonable in-distribution, uh, user inputs, right?
- 14:22
Then there's the more fun part, which is how do you do adversarial testing, right? How do you basically emulate some person trying to sit down and prompt inject and jailbreak and mess with your AI systems at large?
- 14:32
Uh, and this is much more, uh, aggressive in terms of how we pursue the optimization problem.
- 14:39
Long story short is, you know, fuzzing in the AI sense is much more structured and optimization driven than in classical security or, or software or hardware, right? It is impossible to like search over the input space of natural language and do a brute force search, uh, in any reasonably short amount of time.
- 14:59
Like we're dealing with, you know, let's say we're dealing with Llama 3 tokenizer. There's, uh, 128,000 tokens per individual in-input, right? You scale this up to like 100 million tokens, and you're like literally impossible to scan this entire input space.
- 15:11
So you have to be very clever and guided and prune the search space as you do hazing and fuzzing. We treat this task essentially as an optimization problem, right?
- 15:19
This is long story short, just discrete optimization. There's plenty of rich literature over the past sixty, seventy years of, uh, discrete math research to go and support how to do this sort of task.
- 15:29
We have to massage it, of course, to work for the LLM domain. Um, but TLDR, the search space is just natural language. The objective that we're trying to minimize in this case is essentially whatever judge, uh, that we're using to score the output.
- 15:41
We basically want to find inputs that break your AI application vis-a-vis the judge, gets the output to score very low on some, uh, measure of the judge. And yeah, we, we can rip and throw a bunch of fun optimization algorithms at this.
- 15:53
Um, we can use gradient-based methods to backprop all the way from the judge loss through the model to the input space and use that to guide, uh, what tokens we wanna flip.
- 16:01
Uh, we can use various forms of tree search and MCTS. We can search over the latent space of, uh, embedding models and then map from the embedding models to text and throw that at the underlying AI application or the application under test.
- 16:13
Um, we can use DSPy. We can use all sorts of other great, uh, tools and tricks to solve this optimization problem.
- 16:21
Some fun case studies in the last few minutes. Um, TLDR, you could probably imagine that this hazing thing matters a lot for people in regulated industries, and indeed, we work a lot with, uh, banks and financial services and healthcare and so on.
- 16:33
Um, we did something recently where we, um, hazed, uh, the largest bank in Hungary. Uh, they had this like loan calculation AI application that they're showing to customers. The customer application had to follow this eighteen-line code of conduct, is what they called it.
- 16:46
Uh, and we basically threw everything under the sun, uh, from our platform in terms of optimization and scoring to, uh, emulate adversaries. We were able to discover a ton of, uh, prompt injections and jailbreaks and honestly, just like unexpected corner cases that they didn't account for in their code of conduct.
- 17:01
Um, and they were able to patch this up and then finally unblock their production into prod.
- 17:05
We are doing this right now for a Fortune 500, Fortune 500 bank that wants to do, uh, outbound debt collection with voice agents. Uh, little bit actually more complex problem because now we're not just testing in the text space, we're actually introducing a lot of, uh, variance to just the audio signal as well.
- 17:23
So adding things like background noise, um, stacking, you know, weird static into the, the input domain, changing the frequencies of things, et cetera, right? But still an optimization problem at the end of the day.
- 17:33
Um, TLDR, what took this team, you know, three months or so to do with their internal ops teams, uh, took, in their own words, uh, only five minutes for our platform to do.
- 17:42
Um, so scaling up adversary emulation, uh, works for this task as well.
- 17:47
And a little bit more difference, uh, for another voice agent company, we've been helping them with, uh, scaling up their eval, uh, suite, right? So not so much hazing, but basically scaling up their subjective human annotators, uh, through Verdict.
- 18:00
Uh, they've seen a thirty-eight percent increase in ground truth human agreements using Verdicts, um, as opposed to using, uh, their internal ops teams. And what we're using here is essentially, uh, a tried and true architecture from the Verdict library, which is what we call a rubric fan-out.
- 18:15
So it is basically propose individual, uh, unit tests and criteria for any particular data points, uh, critique it, self-verify your critique, and then aggregate results at the very end.
- 18:25
Cool. So we got a few minutes left, uh, for questions, but, um, yeah, hazing is a ton of fun. I think it matters a lot for this new era of software that we're building.
- 18:34
Uh, we're very aggressively hiring. We're, you know, facing what I would deem to be insurmountable enterprise demand, and we're only a team of four people. [laughs] Uh, so we really need to scale up our team.
- 18:44
And yeah, we're based in New York in case you guys want to move out to the city. Um, and yeah. Any, uh, any last questions for me?
- 18:52
Um, for the hazing input, is it multi-shot or single shot?
- 18:55
Yeah, great question. So we do both. Uh, we do single turn, multi-turn. Uh, we do persistent conversations if you're doing voice. Um, yeah, all sorts of modalities, all sorts of inputs. [upbeat music]