<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Atsushi Hara</title>
    <description>The latest articles on DEV Community by Atsushi Hara (@atsushi_hatchco).</description>
    <link>https://dev.to/atsushi_hatchco</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4107260%2F4026024e-e88c-4186-8ca2-7ad6a338026e.jpg</url>
      <title>DEV Community: Atsushi Hara</title>
      <link>https://dev.to/atsushi_hatchco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/atsushi_hatchco"/>
    <language>en</language>
    <item>
      <title>A New Model Dropped. Don't Just Swap the ID.</title>
      <dc:creator>Atsushi Hara</dc:creator>
      <pubDate>Mon, 21 Sep 2026 02:48:33 +0000</pubDate>
      <link>https://dev.to/atsushi_hatchco/a-new-model-dropped-dont-just-swap-the-id-2a3e</link>
      <guid>https://dev.to/atsushi_hatchco/a-new-model-dropped-dont-just-swap-the-id-2a3e</guid>
      <description>&lt;p&gt;The new model is out. The benchmarks look great. Your provider has already scheduled the sunset date for the one you are running.&lt;/p&gt;

&lt;p&gt;So you swap the model ID, run a few requests, see nothing obviously broken, and ship.&lt;/p&gt;

&lt;p&gt;I want to argue that this is one of the most common ways LLM-backed systems quietly degrade — and that it tends to happen not because teams are careless, but because "the model works" and "the model is safe to run in production" are two different claims, and only the first one is cheap to check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everyone agrees, almost nobody does it
&lt;/h2&gt;

&lt;p&gt;Ask any engineer whether you should evaluate a new model before switching to it. Most will say yes. Then look at what often happens when the deprecation email arrives.&lt;/p&gt;

&lt;p&gt;A recent paper on model migration in production systems put the problem plainly: deprecation and migration cycles come around roughly every twelve months, they hit every product built on the retired model, and task-specific evaluation is essential — but a manual evaluation process is too slow and too expensive to fit inside the migration window (&lt;a href="https://arxiv.org/abs/2604.27082" rel="noopener noreferrer"&gt;Casey et al., 2026&lt;/a&gt;). The result is easy to guess. Evaluation tends to get skipped, then done anyway in the last week before the sunset, in a panic, on whatever inputs someone had lying around.&lt;/p&gt;

&lt;p&gt;The gap is not one of belief. It is one of process cost. Few people skip a test suite that runs in a minute. Many skip the one that takes three days.&lt;/p&gt;

&lt;h2&gt;
  
  
  "It works" is a one-dimensional answer to a three-dimensional question
&lt;/h2&gt;

&lt;p&gt;Part of why the swap feels safe is the release announcement. The new model scores higher on the public benchmarks, so it should score higher on your task too. That inference is where things can go wrong.&lt;/p&gt;

&lt;p&gt;A new model version might not be a backward-compatible upgrade of the old one. It may be a different model, trained differently, with different habits, and nobody has checked that against your prompt. The prompt you tuned against the old model's habits carries no guarantee with the new one — the same prompt is not promised to perform as well, let alone better. And the reported gains were measured on public datasets that look nothing like your contracts, your invoices, or your support tickets. "Better on the benchmark" and "better on your data" are correlated, not equivalent. The only way to know the second one is to measure it.&lt;/p&gt;

&lt;p&gt;When you do measure it, three things can move, and they can move in opposite directions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accuracy.&lt;/strong&gt; The new model may be better on average and worse on the field you care about. It may handle the easy cases identically and change its mind on the ambiguous ones — which are exactly the cases your spot check did not include.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Latency.&lt;/strong&gt; Newer models are frequently slower per request, particularly the ones that spend tokens reasoning before they answer. A jump in median latency from 1.5 seconds to 3 seconds is easy to miss in a manual test and hard to miss in a UI that blocks on the response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token volume.&lt;/strong&gt; This is the one that tends to surprise people. A new model with the same prompt will often produce longer output: more hedging, more explanation, more fields filled in that you asked it to leave empty. Output tokens are the expensive ones, and they compound. A model that is 20% cheaper per token and produces 80% more of them is a price increase.&lt;/p&gt;

&lt;p&gt;Here is the kind of comparison that decides an upgrade — same prompt, same frozen dataset, old model versus new:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                      model-a (current)         model-b (candidate)
accuracy (overall)    91.2%  [89.0 – 93.4]       92.8%  [90.7 – 94.9]
accuracy (weak field) 74.5%  [70.1 – 78.9]       81.0%  [77.0 – 85.0]
latency p50 / p75     1.4s  /  1.9s              2.6s  /  3.8s
output tokens p50     180                        410
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read that table honestly. The headline accuracy gain is inside the noise — the intervals overlap, so you have not shown an improvement. The weak field did get better, and that might be worth a lot. But latency nearly doubled and output volume more than doubled. Whether to ship this is a real decision with real trade-offs, and you cannot make it from "I ran it and it looked fine."&lt;/p&gt;

&lt;h2&gt;
  
  
  A decision rule you can write down
&lt;/h2&gt;

&lt;p&gt;The point of measuring three dimensions is to have a rule, so the upgrade is not a matter of who argued loudest in the meeting.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Compare&lt;/th&gt;
&lt;th&gt;Ship if&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy&lt;/td&gt;
&lt;td&gt;Confidence intervals, per field&lt;/td&gt;
&lt;td&gt;No field's interval moved down below the old one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency&lt;/td&gt;
&lt;td&gt;p50 and p75, not the mean&lt;/td&gt;
&lt;td&gt;Both stay under your budget; p75 is what users feel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token volume&lt;/td&gt;
&lt;td&gt;Median output tokens&lt;/td&gt;
&lt;td&gt;Within the budget you set when you priced the feature&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three notes on applying it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compare intervals, not point estimates.&lt;/strong&gt; LLM output is stochastic. A single run of your test set is one sample. Twenty runs give you an interval, and the interval is what tells you whether 91.2% versus 92.8% is signal or noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watch the tails, not the average.&lt;/strong&gt; Mean latency hides the slow requests. p75 is the request a quarter of your users wait for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If any dimension regresses, the answer is "not yet", not "no".&lt;/strong&gt; In my experience, most regressions on a model upgrade turn out to be prompt-model mismatches rather than model failures. The prompt was tuned against the old model's habits. A shorter, stricter output instruction often brings token volume back down; a re-tuned prompt often recovers the field that dropped. But you only know what to fix if you measured it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this stays undone
&lt;/h2&gt;

&lt;p&gt;None of the above is intellectually hard. The reason it tends not to happen is that doing it by hand often looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the last labeled dataset someone built. Discover it lives in a spreadsheet on a laptop and is six months stale.&lt;/li&gt;
&lt;li&gt;Write a script to run both models against it, twenty times each, and record accuracy per field, latency per request, and tokens per response.&lt;/li&gt;
&lt;li&gt;Compute intervals. Argue about whether the script is computing them correctly.&lt;/li&gt;
&lt;li&gt;Paste the numbers into a Slack thread. Lose them.&lt;/li&gt;
&lt;li&gt;Repeat in twelve months, from scratch, because nothing was kept.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step is a few hours. Together they can add up to a week nobody has during a migration window. So the process gets compressed into "swap the ID and watch the error rate", which catches crashes and can miss everything in the table above.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we built to make the honest path the easy one
&lt;/h2&gt;

&lt;p&gt;This is the workflow &lt;a href="https://promptproof.hatchandco.cloud/" rel="noopener noreferrer"&gt;PromptProof&lt;/a&gt; exists for.&lt;/p&gt;

&lt;p&gt;You keep a labeled dataset in the product, shared with the team, so the domain expert who knows the right answers can maintain it and it does not go stale on someone's laptop. When a new model arrives, you attach the same prompt to the old model and the new one and run a single &lt;a href="https://promptproof.hatchandco.cloud/features/experiments/" rel="noopener noreferrer"&gt;statistical experiment&lt;/a&gt;: 10–50 trials per item, a confidence level you choose, executed in the background.&lt;/p&gt;

&lt;p&gt;What comes back is the table above, without the script:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accuracy with confidence intervals, broken down per field, side by side per model&lt;/li&gt;
&lt;li&gt;latency at p25 / p50 / p75 per prompt&lt;/li&gt;
&lt;li&gt;input and output token volume, as medians and spread, per prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works across OpenAI, Anthropic, and Google models in the same experiment, so "should we move to the new model" and "should we move to a different provider" are the same comparison.&lt;/p&gt;

&lt;p&gt;The intent is not that the tool decides for you. It is that the three numbers you need for the decision cost you minutes of setup instead of days, so the evaluation is much more likely to happen before the sunset date instead of after the support tickets.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A model upgrade is a change to your system. Treat it like one: it needs evidence, not a version bump.&lt;/li&gt;
&lt;li&gt;A new version might not be a compatible upgrade — nobody has verified that it is for your prompt. Benchmark gains were measured on public data; yours is not public.&lt;/li&gt;
&lt;li&gt;"It works" answers one question. Production needs three: accuracy, latency, token volume.&lt;/li&gt;
&lt;li&gt;Compare intervals, watch the tails, budget the tokens.&lt;/li&gt;
&lt;li&gt;A regression means "not yet, re-tune the prompt", not "never upgrade".&lt;/li&gt;
&lt;li&gt;The reason evaluation gets skipped is usually process cost. Lower the process cost and the evaluation is far more likely to happen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next model will probably be better than this one. That is the whole reason to measure before you switch — because the way it is better is often not the way you assumed.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;How does your team decide when to move to a new model? I would like to hear what you measure, and what you have been burned by not measuring.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>testing</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Your Prompt Didn't Change. Your Model Did. Now What?</title>
      <dc:creator>Atsushi Hara</dc:creator>
      <pubDate>Thu, 17 Sep 2026 12:25:24 +0000</pubDate>
      <link>https://dev.to/atsushi_hatchco/your-prompt-didnt-change-your-model-did-now-what-5aff</link>
      <guid>https://dev.to/atsushi_hatchco/your-prompt-didnt-change-your-model-did-now-what-5aff</guid>
      <description>&lt;p&gt;Every few months the same thing happens.&lt;/p&gt;

&lt;p&gt;A provider ships a new model. The one you pinned gets a deprecation date. You open your config, change &lt;code&gt;gpt-4o&lt;/code&gt; to whatever is current, run the app once, see reasonable output, and ship it.&lt;/p&gt;

&lt;p&gt;Two weeks later someone in support forwards a ticket: a field that used to be extracted correctly is now blank about a fifth of the time.&lt;/p&gt;

&lt;p&gt;Nothing in your prompt changed. Nothing in your code changed. The model changed, and you had no test that could have caught it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "I ran it and it looked fine" is not a test
&lt;/h2&gt;

&lt;p&gt;Say you are extracting structured data from long, messy documents — pulling the termination notice period, the auto-renewal terms, and the liability cap out of a 30-page service agreement. The answer is rarely sitting in one labeled box. The notice period is in clause 12, an exception for the initial term is in clause 3, and an amendment on page 27 quietly overrides both. The model has to find the right passages, reconcile them, and return one value.&lt;/p&gt;

&lt;p&gt;It is tempting to treat that LLM call like any other function and write one assertion against one input. That breaks down for three reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A wrong answer looks exactly like a right one.&lt;/strong&gt; If the model returns &lt;code&gt;60&lt;/code&gt; for the notice period, that is a perfectly plausible number. So is &lt;code&gt;30&lt;/code&gt;, which is what the superseded clause says. You cannot eyeball correctness on this kind of task — "the output looked reasonable" only tells you the model produced something contract-shaped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLM outputs are probabilistic.&lt;/strong&gt; Even at &lt;code&gt;temperature=0&lt;/code&gt;, you are not guaranteed identical outputs across runs. Batching, hardware, and silent server-side changes all move the needle. A single passing run is one sample from a distribution you have not measured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Whole-output equality is the wrong assertion.&lt;/strong&gt; Your extraction returns eight fields. If one of them regresses and seven improve, a string comparison on the serialized JSON just tells you "different." You need to know &lt;em&gt;which&lt;/em&gt; field moved and by how much.&lt;/p&gt;

&lt;p&gt;So the naive harness that most of us write first looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_extraction&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;service_agreement_001.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;notice_period_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;governing_law&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;State of New York&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a smoke test. It tells you the pipeline is wired up. It tells you nothing about accuracy, and it will flake often enough that someone eventually marks it &lt;code&gt;@pytest.mark.skip&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a real prompt regression test needs
&lt;/h2&gt;

&lt;p&gt;Four things, and skipping any one of them puts you back in vibes territory.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A frozen, labeled dataset.&lt;/strong&gt; Real inputs with ground truth values you agreed on once and stopped editing. Twenty items is enough to start; the point is that it does not drift under you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field-level scoring.&lt;/strong&gt; Accuracy per field, not per document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeated trials.&lt;/strong&gt; Run the same prompt against the same item many times, because you are estimating a rate, not checking a value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A confidence interval.&lt;/strong&gt; So that when you see 89% and 92%, you can say whether that gap is real.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of this needs much code. Loop over the dataset, run every item twenty times, score each field as a hit or a miss against the ground truth, and put a 95% confidence interval around each field's hit rate. The repeated trials are the part people leave out, and the part that makes the result mean something.&lt;/p&gt;

&lt;p&gt;What matters is what comes out the other end. Instead of a green checkmark, you get output that actually supports a decision:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;notice_period_days   88.5%  [84.1% – 92.9%]
auto_renewal         94.0%  [91.2% – 96.8%]
liability_cap        71.0%  [65.3% – 76.7%]
governing_law        96.5%  [94.1% – 98.9%]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;liability_cap&lt;/code&gt; is visibly the weak field — no surprise, since it is the one buried in carve-outs and cross-references — and you know the estimate is tight enough to act on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision rule that matters
&lt;/h2&gt;

&lt;p&gt;When you compare the old model to the new one, &lt;strong&gt;do not compare point estimates.&lt;/strong&gt; Compare intervals.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                          model-a              model-b
liability_cap        71.0% [65.3–76.7]   76.0% [70.4–81.6]   → overlapping, no evidence
notice_period_days   88.5% [84.1–92.9]   79.2% [74.0–84.4]   → separated, real regression
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first row looks like a five-point improvement and is not distinguishable from noise. The second row is the one that would have shown up in a support ticket three weeks later.&lt;/p&gt;

&lt;p&gt;This single habit — refusing to act on overlapping intervals — removes most of the thrash from prompt work. It stops you from "fixing" a prompt that was never broken, and it stops you from shipping a model swap that quietly cost you nine points on a field that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the homegrown harness starts to hurt
&lt;/h2&gt;

&lt;p&gt;You can script all of this in an afternoon. I have written versions of it more than once. What breaks is not the statistics, it is everything around them.&lt;/p&gt;

&lt;p&gt;The labels live in a CSV on one engineer's laptop. The domain expert who actually knows what the correct &lt;code&gt;liability_cap&lt;/code&gt; is — the person who can read clause 14 and its three exceptions — cannot run Python. Every model comparison means rerunning the whole grid by hand and pasting numbers into Slack. Nobody can answer "what was our accuracy before the upgrade?" because nothing was stored.&lt;/p&gt;

&lt;p&gt;That gap is the reason we built &lt;a href="https://promptproof.hatchandco.cloud/" rel="noopener noreferrer"&gt;PromptProof&lt;/a&gt;. It runs &lt;a href="https://promptproof.hatchandco.cloud/features/experiments/" rel="noopener noreferrer"&gt;statistical experiments&lt;/a&gt; as a first-class object: pick a labeled folder, configure 10–50 trials, choose a 90/95/99% confidence level, and it executes every prompt × item × trial combination in the background. You get confidence intervals, a field-level accuracy breakdown, and latency percentiles — and you can run the same prompt across OpenAI, Anthropic, and Google models in one experiment to compare them side by side.&lt;/p&gt;

&lt;p&gt;The part that mattered most to us in practice was making the dataset shared. Ground truth labels live with the team, so the person who knows the domain can label, and the person who writes the prompt can test — against the same standard, instead of "it worked on my test set."&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing the loop with production
&lt;/h2&gt;

&lt;p&gt;A frozen evaluation set catches model upgrades. It does not catch data drift, because your test inputs stopped changing on purpose.&lt;/p&gt;

&lt;p&gt;For that you need the other half: sample real production traffic, label it, and fold it back into the evaluation set. PromptProof's &lt;a href="https://promptproof.hatchandco.cloud/features/monitoring/" rel="noopener noreferrer"&gt;monitoring&lt;/a&gt; side does this as a loop — ingest production items via API, label ground truth in the UI, copy the labeled data into an experiment folder, and rerun. Regressions show up as an accuracy trend rather than as a ticket.&lt;/p&gt;

&lt;p&gt;You can absolutely build this yourself. The point is that "ingest → label → evaluate → deploy → keep watching" is the shape of the thing, and most teams stop after the first arrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;If you take one thing from this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pin your model IDs&lt;/strong&gt;, and treat a model bump as a change that requires evidence, not a version bump.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freeze a labeled dataset&lt;/strong&gt; before you need it. Twenty real items beats two hundred synthetic ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score per field.&lt;/strong&gt; Aggregate accuracy hides the regression that will page you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run repeated trials.&lt;/strong&gt; One run is one sample.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare intervals, not point estimates.&lt;/strong&gt; Overlapping means you learned nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feed production data back in&lt;/strong&gt;, or your test set will slowly stop resembling reality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next deprecation email is already scheduled. The question is only whether you will find out from your test suite or from your users.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What does your prompt regression setup look like? I am curious whether people are mostly hand-rolling this or have landed on something they like — comments welcome.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>testing</category>
      <category>ai</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
