LinkedIn

Scaling Legal Judgment

Give three attorneys the same suggested contract edit (known in the legal industry as a redline), and you typically get three different outcomes. One might accept it as is, another may adjust the language because of their interpretation of the risk it creates, and the third might rewrite in their own words to be clearer, without materially changing the legal substance. Only the first counts as “accepted as written,” while the other two get a “rejected as written” label for completely different reasons.

At Crosby, our AI agents produce the first pass of a contract review, and an attorney makes edits where needed before the redlined contract goes back to the client. Every one of those attorney decisions is a potential training label. This post covers how we tapped into that potential: why legal data is hard to train on, what it took to build a Verifier model to predict attorney decisions, and how this model scales with data and model size.

Post-training Large Language Models (LLMs) for legal applications is challenging because the “quality” of model-generated text is hard to determine without a human in the loop. This leaves no verifiable reward signal of the kind that Reinforcement Learning (RL) depends on. The same algorithms that helped models make great strides in the domains of mathematics and computer programming, where checking a solution is cheap and deterministic (e.g., running a unit test), cannot be used out of the box here.

Our attorneys usually know things the model doesn’t: how impatient the counterparty is, how past similar deals went, what’s broadly standard for this kind of transaction. Sometimes the model reasons correctly and still reaches the wrong conclusion because it didn’t have access to all the information it needed. Either it didn’t fit in the prompt, or it was never in context at all.

So we wanted to start with a toy problem: take a single redline our agents suggest, and try to predict whether an attorney would send it to a client as written. Whether a redline is “good” is hard to agree on, multiple lawyers might reasonably debate this. But whether a single lawyer sends an AI-generated redline to a client is something we already record.

We call this model the Verifier. For each redline our agents suggest, we track whether the reviewing attorney sent it to the client unchanged or edited it. Given the deal context, the relevant playbook rules, and a suggested redline, the Verifier predicts the probability that an attorney will accept the AI-generated redline exactly as written.

The Verifier maps context to acceptance and rejection probabilities. The 0.7/0.3 outputs are illustrative.
A closer look at the decoder’s attention, feed-forward layers, and residual connections.

A good Verifier can unlock three things for Crosby:

  1. Escalation: If the Verifier can reliably identify the redlines our attorneys are going to accept, we can focus attorney time and attention on the edits that require a higher level of lawyer judgment.
  2. Evals: The judges we described in our evals post need a reference, an attorney-reviewed version of the same contract to compare against. The Verifier does not need a reference, so it can score our agents in production on contracts that no attorney has reviewed yet.
  3. Automation: If the Verifier’s predictions prove reliable enough, we could use its scores as a reward signal for training agents to generate better redlines that attorneys are more likely to accept.

Scaling the Verifier with data and parameters

To fine-tune multi-billion parameter LLMs with a binary classification objective in our domain, you need tens of thousands of contract reviews.1 Even with this volume, this data is noisy; as mentioned earlier, two attorneys can disagree on the quality of the same redline, so similar suggestions can end up with opposite labels. To find out whether the labels have consistent signal, we tested whether the Verifier improves predictably as data and model size grow. If it does, “more data should help” becomes a measured relationship we can build plans on, in the same spirit as the scaling laws for neural language models (Kaplan et al., 2020).

We ran two experiments: one varying model size and one varying training set size. Specifically, five models ranging from 0.8B to 27B parameters, fine-tuned on a training set of ~13,000 labeled redlines, and six training-set sizes ranging from 1/32 of the data up to all of it, with the 27B model. Each of these models were open-weight dense decoders, fine-tuned with a classification head to output an acceptance score, and evaluated on the same held-out set of production redlines that none of the models had seen before. The metric we tracked was PR-AUC, which is the area under the precision-recall curve. It ranges from 0.0 to 1.0 and summarizes how well the model separates accepted suggestions from edited ones across different score thresholds.

Scaling with Qwen3.5 model size

  • Observed
  • Least-squares fit

Validation PR-AUC

Majority-class floor: 0.5936

Non-embedding parameters, billions (log₂ scale)

Scaling with Qwen3.5 model size
LabelNon-embedding parameters, billionsValidation PR-AUC±1 bootstrap SD bounds
0.8B0.5460.65390.633–0.6748
2B1.4910.70210.6838–0.7204
4B3.3640.68950.6701–0.7089
9B6.9660.70150.681–0.722
27B24.4570.72970.7109–0.7485
Figure 1: Validation PR-AUC plotted against non-embedding model parameters (log₂ scale). Dashed line represents the least-squares fit. Error bars show ±1 bootstrap standard deviation.

Scaling with training data

  • Observed
  • Least-squares fit

Validation PR-AUC

Majority-class floor: 0.5936

Training examples (log₂ scale)

Scaling with training data
LabelTraining examplesValidation PR-AUC±1 bootstrap SD bounds
d324250.63830.6176–0.659
d168400.64930.6309–0.6677
d816670.66730.649–0.6856
d433510.68540.6663–0.7045
d266650.71630.6985–0.7341
d1 (full)133250.72970.7109–0.7485
Figure 2: Validation PR-AUC plotted against training set size (log₂ scale). Dashed line represents the least-squares fit. Error bars show ±1 bootstrap standard deviation.

In both slices, validation PR-AUC increased approximately linearly in the log of the quantity being scaled: roughly 1.3 percentage points per doubling of parameters and 1.9 percentage points per doubling of training data. The data-size experiment showed the clearest pattern. Increasing the training set from ~500 to ~13,000 redlines raised PR-AUC from ~0.64 to ~0.73. These results gave us a reason to keep collecting examples, but they also put the gains in perspective: an improvement of ~9 percentage points took roughly thirty times as much data, and because PR-AUC is bounded at 1.0, the line has to bend eventually.

We have evidence of steady progress over the range we tested, but not a guarantee that it continues. We suspect disagreement between attorneys sets a ceiling on how far it can go. But much of that disagreement isn’t random. There is some ground truth. Disagreement tends to track client context and deal history the model doesn’t have, as well as lawyer preferences/dispositions (which we think could be predictable and are testing in forthcoming research). This means ground truth can possibly be recovered by changing the model’s context or customizing agents around specific lawyer personas. So we’re working on two things in parallel: moving along the line, which happens on its own almost every time we review another contract, and raising the ceiling by getting more signal out of the reviews we already have.

Getting more signal out of contract reviews

We wanted to know whether we could make the examples we already had more useful. Most of the architecture and training changes we tried had little effect outside of model size. Changes to label construction and input context made larger differences. Reviewing disagreements with our attorneys helped us understand where to look, and let us categorize them into three sources:

  1. Preprocessing mistakes
  2. Deal context the model hadn’t seen
  3. Differences in attorney preferences.

All three can produce the same rejection label, but each calls for a different response; we share one example of each below.

Finding

Description

A preprocessing mistake

Our initial training runs normalized the text in our prompts, lowercasing it and stripping punctuation. This made the model blind to defined terms (capitalized terms with specific definitions in the contract) and typos, letting some lightly edited redlines count as exact matches. If our agent proposed “the Receiving Party shall not disclose confidential information” and the attorney capitalized it to “Confidential Information,” invoking the term defined earlier in the contract, our pipeline saw an unchanged redline and labeled it accepted. Retraining our 27B model after restoring defined terms across our dataset improved PR-AUC by 3 percentage points on the held-out set.

Missing deal context

Most of the LLM context comes from codified preference rules, which enable our AI agents to take different legal positions based on the deal context when reviewing and negotiating contracts. Playbooks can be large, and with the contract and system prompt, they often exceed the model’s maximum sequence length. This forces a trade-off: include the entire playbook and only about a third of our examples fit, or trim the playbook to only the cited rules and every example fits. On the same validation set, both experiments led to a 3 percentage point increase in PR-AUC over the baseline of using a third of our data with trimmed context. We decided to go with the latter in the interest of training and inference speeds.

Attorney preferences

Two attorneys can look at the same clause and make different, equally defensible redlines. For example, one might accept a suggested limitation of liability as written, but another might rewrite the whole sentence without radically changing what it means. Such stylistic edits are not without reason: that second lawyer may reasonably think, based on their experience, that their language is easier for a hypothetical judge to interpret in the event of dispute. In practice, litigation is exceptionally rare, so it’s almost impossible to know which lawyer was “right.”

This kind of disagreement is a byproduct of attorneys’ individual judgment and arguably shouldn’t be stamped out if the goal is to model individual taste. Nonetheless, we collaborate closely with Crosby attorneys to correct labels in clear-cut cases where the majority of attorneys would agree on a particular version of a redline.

Scaling Still Helps

Our domain is noisy in a way that coding and math are not. Some of that noise was a preprocessing bug, and we fixed it. Other parts of that noise come from disagreement between attorneys, and that isn’t a defect at all – it’s precisely these differences in legal judgment that we’re trying to model. And despite the disagreements, our Verifier still improves predictably with scale. This means that reviewing more contracts with our systems means a better Verifier, and that leads to better evals for our agents. Critically, each of these feeds back into the next review.

This is why we believe Crosby gets better for everyone the more contracts we review with our AI systems and our law firm’s oversight. Just as importantly, when experts disagree, don’t average the disagreement away. Work out which disagreements come from mistakes in the pipeline, which come from context the model is missing, and which are a matter of taste.

We still have a lot to learn about measuring legal judgment at scale. If that sounds interesting, we’re hiring at https://crosby.ai/careers.

Acknowledgements

Thank you to Teddi Worledge for her work on the technical implementation, and to Tricia Matibag and Ross Weiser for shaping our datasets.

Notes

  1. Our clients provide us with a range of data usage rights, many of which are restrictive given the sensitivity of live contract reviews. Accordingly, it took us over 1.5 years of lawyers reviewing contracts before we had data sufficient to be (1) aggregated and anonymized and (2) useful for AI research like this.

    ↩