LangSmith blueprint · AI product engineering
Pairwise comparison of two app versions
Runs the baseline and candidate app versions as two experiments on the same pinned dataset, scores them head to head with a pairwise LLM judge and a pairwise annotation queue, and gates the release on the result. It must never compare outputs from different dataset versions or let answer position bias the verdict.
- Steps
- 8
- Subjective questions
- 33
- Objective questions
- 33
The problem and the outcome
Problem: Absolute 1–10 scores from LLM judges drift and cluster, so two app versions often look identical on aggregate metrics even when users would clearly prefer one. Teams end up shipping on gut feel.
Outcome: Every release candidate gets a per-example A-vs-B verdict from both an LLM judge and blind human reviewers on the same inputs. The ship decision rests on win rate, agreement and zero regressions on hard checks.
Architecture
How it works, step by step
- Pin both sides: the baseline prompt stays on its production tag in the Prompt Hub, the candidate is a new commit, and the dataset is pinned to one version so both experiments see identical examples.
- Run evaluate() once per version against the same dataset version, with repetitions to smooth non-determinism, bounded concurrency, and metadata recording the prompt commit, model and app version.
- Attach code evaluators to each experiment for hard checks such as schema validity, refusal rules, token cost and latency; any regression here blocks the release regardless of preference.
- Run a pairwise evaluator by passing both experiment names to evaluate() with an LLM-as-judge that sees the input and both outputs, with randomized order so the judge cannot favour position A or B.
- Open the experiment comparison view to read the per-example preferences, win/tie/loss counts and side-by-side diffs, and note examples where the judge was split across repetitions.
- Create a pairwise annotation queue from exactly the two experiments, set a rubric, reviewer count per item and reservations, so domain reviewers pick the better answer blind to which version produced it.
- At the ship gate, promote B only if humans and the judge both prefer it, judge–human agreement is acceptable, and no code evaluator regressed; otherwise iterate on a new commit.
- After moving the production tag to B, run an online evaluator on a sampled share of production runs with alerts, and feed failing traces back into the dataset for the next comparison.
Tech stack
- LangSmith datasets with versioned examples
- LangSmith evaluate() with repetitions and concurrency
- Pairwise LLM-as-judge evaluator with randomized order
- Code evaluators (Python/TypeScript functions)
- LangSmith pairwise annotation queue
- Prompt Hub commits and tags
- @traceable / wrap_openai tracing on the app
- Online evaluators with automation rules and alerts
Key design decisions
- Pairwise over absolute scoring for the ship decision, because relative preference is more stable than a judge's 1–10 scale; absolute code checks stay as hard gates.
- Pin a single dataset version for both experiments so example IDs align row by row; a new dataset version means rerunning both sides.
- Use the LLM judge for full coverage and the pairwise queue for a reviewed subset, then measure how often they agree before trusting the judge alone.
- Require more than one reviewer per queue item for subjective tasks, using reservations so reviewers do not collide on the same item.
- Deploy by moving a Prompt Hub tag rather than editing prompts in place, so rollback is a tag move.
Common mistakes
- Running A and B on different dataset versions, which makes the pairwise comparison meaningless because rows no longer match.
- Leaving answer order fixed, letting the judge's position bias decide the winner instead of quality.
- Using the same model family as the candidate for the judge without checking for self-preference against human labels.
- Treating ties as losses or dropping them, which inflates or hides the real win rate.
- Letting reviewers see version labels or metadata, which turns blind preference into confirmation bias.
What to measure
- Pairwise win/tie/loss rate of B over A from the judge and from human reviewers
- Judge–human agreement rate on the queued subset
- Inter-reviewer agreement on pairwise items
- Number of examples regressing on code evaluators (target zero)
- Judge consistency across repetitions and swapped orderings
Most-asked interview questions
Subjective questions 33
1Why use pairwise evaluation instead of scoring each version independently?Asked almost every time
Absolute scores from an LLM judge tend to bunch up, say everything gets a seven or eight, and they drift when the judge model changes. Two versions can look tied on averages while users clearly prefer one. Asking 'which of these two answers is better for this input' is an easier, more stable judgement for both models and humans. In LangSmith I run both versions as experiments on the same pinned dataset, then pass both experiment names to evaluate() with a pairwise evaluator. I still keep absolute code evaluators for things like schema validity and latency, because preference cannot tell you that a response broke a contract. So pairwise answers 'which is better' and code checks answer 'is anything broken'.
Sourced from Docs by LangChain (MCP)
2Walk me through the end-to-end architecture of this pairwise release workflow.Asked almost every time
There are four layers. Versioning: the baseline prompt sits on its production tag in the Prompt Hub, the candidate is a new commit, and the dataset is pinned to one version. Execution: evaluate() runs once per app version against that dataset version, with repetitions, bounded concurrency and metadata for prompt commit, model and app version. Scoring: code evaluators on each experiment handle hard checks, then a pairwise LLM judge compares the two experiments with randomized order, and a pairwise annotation queue collects blind human preferences. Decision and feedback: a ship gate combines judge, human and code results, the production tag moves to B, and online evaluators on sampled production runs feed failures back into the dataset for the next comparison.
Sourced from Docs by LangChain (MCP)
3Why do code evaluator regressions block the release even when the judge and humans prefer the candidate?Asked almost every time
Preference and correctness measure different things. A judge or reviewer may prefer a richer, friendlier answer that breaks the output schema, ignores a refusal rule, or costs more tokens and time. Those are hard contracts with downstream systems, users and budgets, so they act as vetoes, not inputs to a weighted score. If I let preference outweigh them, a pleasant answer that crashes a parser would ship. Keeping them separate also makes the gate easy to explain: first pass every hard check, then win on quality. When a code check fails, the fix is a new candidate commit and a fresh comparison, not an override at the gate.
Sourced from Docs by LangChain (MCP)
4At the ship gate, the judge prefers B but human reviewers prefer A. What do you do?Asked almost every time
I do not ship B. The gate requires both humans and the judge to prefer the candidate, and humans are the ground truth the judge is supposed to approximate. Next I investigate the disagreement: which examples split, whether they cluster in a slice, and whether the judge is rewarding something humans dislike, such as verbosity or confident tone. That usually leads to two pieces of work: improving the judge prompt with those cases as few-shot examples, and improving the candidate in a new commit. Then I rerun the comparison on the pinned dataset. The disagreement itself is a valuable signal that the judge is not yet ready to gate alone.
Sourced from Docs by LangChain (MCP)
5After moving the production tag to B, an online evaluator alert fires. How do you respond?Asked almost every time
First, assess severity from the alert and the dashboards: which metric moved, on which filtered runs, and since when. If it is a hard-rule failure like schema breaks or unsafe answers, I move the production tag back to the baseline commit, which is the fast, low-risk rollback this design gives us. Then I inspect the failing traces, find the pattern the offline dataset missed, and add representative examples to the dataset, creating a new version. The next candidate is compared against the restored baseline on that new version. The post-incident question is why the offline comparison did not catch it, usually a coverage gap.
Sourced from Docs by LangChain (MCP)
6How do you make sure the pairwise LLM judge is trustworthy enough to gate a release?Very often asked
First, randomize the order of the two outputs so position bias averages out, and ideally check that verdicts hold when the order is swapped. Second, run repetitions and look at examples where the judge flips; those are low-confidence. Third, calibrate against humans: I put the two experiments into a pairwise annotation queue, have domain reviewers choose blind, and compute agreement between the judge and reviewers. If agreement is weak, I refine the judge prompt with a clearer rubric or few-shot examples and rerun. I also avoid relying on a judge from the same model family as the candidate without that human check. Only once agreement is acceptable do I let the judge cover the full dataset.
Sourced from Docs by LangChain (MCP)
7How would you set up the human review part so it is fair and efficient?Very often asked
I create a pairwise annotation queue from exactly the two experiments, so each item shows one input with both outputs side by side. Reviewers should not see which version produced which output. I write a short rubric covering correctness, helpfulness and tone, and set the reviewer count per item above one for subjective tasks so I can measure inter-reviewer agreement. Reservations stop two people working the same item at once. To save effort I do not queue everything; I prioritise examples where the judge was split, tied or disagreed across repetitions, plus a random sample to estimate overall agreement honestly. The human preferences then feed the ship gate alongside the judge's win rate.
Sourced from Docs by LangChain (MCP)
8Why keep the baseline on its production tag instead of rebuilding it from whatever is in the repository?Very often asked
The baseline must be exactly what users get today, otherwise the comparison answers the wrong question. The repository may already contain half-merged edits, and a tag in the Prompt Hub points to the specific commit serving production. Resolving the baseline through that tag, and recording the resolved commit in experiment metadata, makes the run reproducible and auditable. It also means promotion is a simple, reversible action: move the production tag from the baseline commit to the candidate commit. If something goes wrong later, moving the tag back restores the known-good version without a redeploy of prompt text.
Sourced from Docs by LangChain (MCP)
9How do you detect and handle a dataset change that happens between the baseline run and the candidate run?Very often asked
Prevention comes first: both evaluate() calls reference the same pinned dataset version rather than the latest state, so edits by teammates create a new version that neither run sees. As a check, I record the dataset version in each experiment's metadata and have the gate script refuse to compare experiments whose versions differ or whose example sets do not match. If a mismatch slips through, I do not try to compare the overlapping subset and call it done; I rerun both versions on one chosen dataset version. Partial overlap silently changes the mix of easy and hard examples, which can flip a win rate.
Sourced from Docs by LangChain (MCP)
10Why run repetitions, and what do you do with examples where the judge splits across them?Very often asked
LLM apps and LLM judges are both non-deterministic, so a single run can produce a lucky or unlucky output and a lucky or unlucky verdict. Repetitions let me see whether a preference is stable. In the comparison view I look for examples where the judge picked A in some repetitions and B in others. Those are not noise to average away; they usually mark genuinely close calls, ambiguous inputs or a weak rubric. I send them to the pairwise annotation queue with priority, consider tightening the judge criteria, and treat stable wins as much stronger evidence than split ones when deciding the gate.
Sourced from Docs by LangChain (MCP)
11What metadata do you attach to each experiment and why does it matter?Very often asked
At minimum: the resolved prompt commit, the model name and parameters, the app version or git SHA, and the dataset version. I often add the judge prompt version and the repetition count. This metadata turns an experiment from a loose pile of scores into a reproducible record. It lets the gate verify both sides used the same dataset version, lets reviewers filter and group experiments in the UI, and lets anyone months later explain why version B shipped. Without it, you cannot tell whether a difference came from the prompt change, a silent model upgrade or a different set of examples.
Sourced from Docs by LangChain (MCP)
12How would you write the pairwise judge prompt itself?Very often asked
I give the judge the input, both outputs labelled neutrally as A and B, and the reference output when the dataset has one. The criteria are explicit and ordered, for example factual correctness against the reference first, then instruction following, then clarity, with a note that length alone is not a virtue. I ask for a short justification before the verdict, allow a tie when the answers are equivalent, and constrain the output to a fixed format the evaluator can parse. I add a few labelled examples from human decisions as few-shot guidance, and I version the judge prompt so its changes are tracked like any other prompt.
Sourced from Docs by LangChain (MCP)
13How would you estimate the cost and runtime of one comparison?Very often asked
I work from formulas rather than guesses. App calls equal examples times repetitions times two versions. Judge calls equal examples times repetitions, doubled if I run both orderings instead of a single random one. Human effort equals the number of queued items times reviewers per item. Token cost comes from measured average tokens per call in previous traces, and runtime is roughly total calls divided by effective concurrency, times average latency. Plugging in real numbers from my own traces tells me whether to sample the dataset for quick iterations and reserve the full dataset and full repetitions for the final gate run.
Sourced from Docs by LangChain (MCP)
14What security and privacy concerns arise in this workflow, and how do you handle them?Very often asked
Datasets built from production traces may contain personal or confidential data, and that data then flows to judge models and human reviewers. I scrub or mask sensitive fields before examples enter the dataset, and mask inputs and outputs in tracing where needed. Access to the project, datasets and annotation queues is restricted to people who need it, and reviewers see only what they need to judge. I am careful about which judge model provider receives the data, given contracts and data residency, which matters for Indian users under the DPDP Act. I also remember that online evaluation extends retention of evaluated traces, so sampling filters should avoid sensitive traffic where possible.
Sourced from Docs by LangChain (MCP)
15Feeding failing production traces back into the dataset sounds good. What are the risks?Very often asked
Three main risks. Overfitting: if every candidate is tuned against the same growing set of past failures, you can win on the dataset while losing on new traffic, so I keep a held-out slice that is not used during iteration. Skew: failures over-represent rare cases, so I tag examples by source and slice and report win rates per slice instead of one blended number. Privacy: production traces may contain personal data that must be scrubbed before becoming permanent examples. Also, each addition creates a new dataset version, so the next comparison reruns both versions on it rather than mixing old and new results.
Sourced from Docs by LangChain (MCP)
16Besides position, what other biases does a pairwise judge have, and how do you counter them?Very often asked
Common ones are length or verbosity bias, preferring the longer answer; style bias, rewarding confident or polished tone over correctness; and self-preference, favouring outputs that resemble its own model family. I counter them in the rubric by stating that correctness against the reference comes first and that length is not a criterion, by giving the judge the reference output where available, and by choosing a judge model independent of the candidate when possible. Few-shot examples drawn from human verdicts, especially ones where the shorter answer won, help. Finally I check agreement with human labels per slice to see whether a bias remains.
Sourced from Docs by LangChain (MCP)
17How do you decide in advance what counts as the candidate winning?Very often asked
I write the gate criteria before running anything, so the result cannot be rationalized afterwards. The criteria cover: no regression on any code evaluator; the judge prefers B over A overall and on each critical slice; human reviewers in the pairwise queue also prefer B; and judge–human agreement meets the threshold the team agreed for that dataset. I do not use a universal number; teams pick thresholds from their own risk tolerance and past agreement data. I also define how ties and split examples are treated. Writing this down in the gate script makes the decision repeatable across releases.
Sourced from Docs by LangChain (MCP)
18Why not skip offline pairwise evaluation and just run an A/B test in production?Very often asked
An online A/B test exposes real users to a possibly worse version and needs enough traffic and time to reach a conclusion, while offline pairwise evaluation catches many regressions before anyone sees them. Offline runs are also controlled: identical inputs on both sides, repetitions and side-by-side diffs, which production traffic cannot give you. User signals in production are often sparse and noisy. The two are complementary. This workflow uses offline pairwise comparison as the gate, then online evaluators on sampled production runs to catch what the dataset did not cover, feeding those cases back offline.
Sourced from Docs by LangChain (MCP)
19How do you handle examples that error out in one experiment but not the other?Very often asked
An error is a result, not something to drop silently. If B fails on an example where A succeeded, that is a regression and the code evaluators or the gate script should count it. If failures are infrastructure noise, such as timeouts or rate-limit errors, the experiments become uneven and the pairwise comparison loses examples, which can bias the win rate. I look at the error traces, fix the cause, often by lowering concurrency or adding retries, and rerun so both experiments cover the full pinned dataset. The gate should refuse to pass if coverage on either side is incomplete.
Sourced from Docs by LangChain (MCP)
20How would you scale this workflow when many teams ship prompt changes every week?Very often asked
I make it a shared pipeline instead of a manual ritual. Each team owns a versioned dataset per feature and a standard gate script with the same steps. To control cost, quick iteration runs use a sampled subset with fewer repetitions, and the full dataset with full repetitions is reserved for the gate run. Judge prompts are shared and versioned, with agreement checked periodically against human labels. Human review is the true bottleneck, so queues get reviewer counts sized to the risk of the change and only contested or high-risk examples go to humans when the judge has proven reliable on that dataset.
Sourced from Docs by LangChain (MCP)
21How do you choose the concurrency level for evaluate() in this workflow?Often asked
Concurrency is bounded by the slowest shared limit: the model provider's rate limits for the app, the rate limits for the judge model, and any downstream tools the app calls. Too high and you get throttling errors, retries and failed examples that make the two experiments uneven. Too low and the comparison takes so long that people skip it. I start conservatively, watch error rates and latency in the traces, and raise it until throttling appears. I also keep both experiments on similar settings, because heavy throttling on one side can distort latency metrics that the code evaluators are checking.
Sourced from Docs by LangChain (MCP)
22How should ties be treated in the win/tie/loss counts?Often asked
Ties are information, not failures. A high tie rate usually means the change is small, or the rubric cannot separate the answers. I report ties separately rather than splitting them half and half into wins, because merging them hides whether the candidate truly wins or simply rarely loses. For the gate, the question is usually whether B wins more than it loses on the examples where a preference exists, and whether the slices that matter most show any losses. If ties dominate and code evaluators show B is cheaper or faster, that can still justify shipping, but the decision should be stated in those terms.
Sourced from Docs by LangChain (MCP)
23Would you randomize order once per comparison or run every pair in both orders?Often asked
Randomizing once per judgement is cheaper and, across many examples, removes systematic position bias from the aggregate. Running both orders doubles judge cost but gives a per-example consistency check: if the verdict flips when positions swap, the judge is not really preferring either answer and I treat it as a tie or send it to humans. For quick iteration I randomize once. For the final gate, or when early runs show strong position effects, I run both orders on at least the contested examples. Either way, the order used should be recorded so position effects can be audited.
Sourced from Docs by LangChain (MCP)
24When is caching in evaluate() helpful here, and when can it mislead you?Often asked
Caching helps when I rerun only part of the pipeline, for example iterating on evaluators or the judge prompt while the app outputs stay fixed, so I do not pay again for identical model calls. It misleads when the thing I am trying to measure is the model's variability. If repetitions hit a cache, they return the same output and the repetitions stop smoothing non-determinism. It can also hide a model or prompt change if cache keys do not capture it. So for the gate runs of both versions, I make sure repetitions produce fresh generations and that the experiment metadata reflects the actual configuration.
Sourced from Docs by LangChain (MCP)
25How do you pick the sampling rate for the online evaluator after rollout?Often asked
It is a trade-off between detection speed and cost. Each evaluated run costs a judge call, and running an online evaluator upgrades that trace to extended retention, which has storage and privacy implications. Right after a release I sample more heavily because that is when regressions are most likely, then reduce the rate once metrics stabilize. I use filters to target risky traffic, such as specific features, error-adjacent runs or negative user feedback, rather than sampling everything uniformly. Cheap code checks can run at a higher rate than LLM judges. Alerts are set on the evaluator metrics so nobody has to watch dashboards continuously.
Sourced from Docs by LangChain (MCP)
26What do reservations in the pairwise annotation queue solve, and what if a reviewer abandons an item?Often asked
Reservations temporarily assign an item to a reviewer who opens it, so two people do not unknowingly work on the same comparison at the same moment, which wastes effort and skews the reviewer counts. The reviewer count per item says how many independent judgements each pair needs before it is complete. If a reviewer opens an item and walks away, the reservation lapses and the item returns to the pool for someone else. Operationally I watch queue progress before the gate date, because a gate that waits on unfinished human review should be visible early, not discovered the morning of the release.
Sourced from Docs by LangChain (MCP)
27How would you run this comparison in CI rather than by hand?Often asked
I would script it. The CI job resolves the baseline from the production tag and the candidate from the new commit, runs evaluate() for each against the pinned dataset version with fixed repetition and concurrency settings, attaches the code evaluators, then runs the pairwise evaluator on the two experiment names. A gate step reads the results and fails the build on any code evaluator regression. Hard assertions can also live in pytest files with the LangSmith pytest integration, which records them as experiments. Human review cannot finish inside a CI job, so the pipeline opens the pairwise queue and the final promotion waits for it.
Sourced from Docs by LangChain (MCP)
28The app is an agent with tool calls. What changes in the comparison?Often asked
Final answers are not enough, because two agents can reach the same answer by very different paths, one of them expensive or unsafe. I add trajectory evaluation, for example a trajectory LLM-as-judge from agentevals, to check whether the tool calls and their order were sensible, and code evaluators for things like forbidden tools, step counts and cost. The pairwise judge still compares final outcomes, but I may give it a summary of each trajectory too. Repetitions matter even more since agent paths are highly variable, and reviewers in the pairwise queue should be able to see the trace, not only the final message.
Sourced from Docs by LangChain (MCP)
29Does anything change if the candidate differs in model rather than in prompt?Often asked
The workflow is the same, but a few things need extra care. Metadata must record the exact model identifier and parameters on both sides. Code evaluators for latency and token cost become more important because model swaps often move those more than prompt edits do. Output formatting can shift subtly, so schema checks must be strict. If the judge model comes from the same family as the new candidate, I watch for self-preference and validate against human labels. Rate limits may differ between models, so bounded concurrency settings might need adjusting so one side is not throttled into different behaviour.
Sourced from Docs by LangChain (MCP)
30What makes a good dataset for this kind of comparison?Often asked
It should reflect the traffic and risks that matter. I combine curated cases written by domain experts, production traces that show real user behaviour and past failures, and synthetic examples to fill gaps such as rare languages or edge inputs. Each example has inputs and, where possible, a reference output the judge can use. I tag examples by slice, for example feature, language or difficulty, so results can be broken down. Size is a balance between statistical confidence and cost per run. And the dataset is versioned, so every comparison names exactly which examples it used.
Sourced from Docs by LangChain (MCP)
31Why use tags for production and commits for candidates in the Prompt Hub?Often asked
Commits are immutable snapshots, so a candidate referenced by commit is exactly the text that was evaluated, with no chance of drifting while the comparison runs. Tags are movable pointers, so the application can load the prompt by its production tag and promotion becomes moving that tag from the old commit to the winning one. This separates evaluation from deployment: evaluation always talks about specific commits, deployment talks about which commit the tag points to. Rollback is the same operation in reverse. Recording resolved commits in experiment metadata keeps the link between what was tested and what shipped.
Sourced from Docs by LangChain (MCP)
32How would you compare versions of a multi-turn chatbot?Sometimes asked
Single-turn examples miss problems that build up across a conversation, like losing context or contradicting earlier answers. Offline, I build examples that contain the conversation history as input and ask both versions to produce the next turn, so the judge compares responses given identical context. For full-conversation behaviour I simulate several turns and judge the transcript. In production, threads group multi-turn conversations, and online evaluators can run at thread level to catch issues that only show up over a whole session. Failing threads are good sources for new multi-turn examples in the next dataset version.
Sourced from Docs by LangChain (MCP)
33The app is not built on LangChain. How do its traces get into LangSmith for this workflow?Sometimes asked
There are several routes. In Python, the @traceable decorator traces your own functions and wrappers such as wrap_openai trace model calls, with tracing switched on through LANGSMITH_TRACING. There are integrations for frameworks like the Vercel AI SDK. If the team already uses OpenTelemetry, LangSmith accepts traces natively through its OTLP endpoint, and a collector can fan out the same spans to LangSmith and the existing observability backend. For the offline comparison itself, evaluate() just needs a callable for each version, so the framework does not matter; tracing mainly helps debugging and online evaluation.
Sourced from Docs by LangChain (MCP)
Objective questions 33
1In this workflow, what blocks a release regardless of judge or human preference?Asked almost every time
Why: Step 3 states that a regression on hard code checks blocks the release regardless of preference.
Sourced from Docs by LangChain (MCP)
2How is the baseline prompt referenced during the comparison?Asked almost every time
Why: The baseline stays on its production tag, which points at the commit serving users today.
Sourced from Docs by LangChain (MCP)
3Where do you read per-example preferences, win/tie/loss counts and side-by-side diffs?Asked almost every time
Why: Step 5 uses the experiment comparison view for these results.
Sourced from Docs by LangChain (MCP)
4Which combination is required to promote version B at the ship gate?Asked almost every time
Why: Step 7 requires all three conditions before promotion.
Sourced from Docs by LangChain (MCP)
5How many experiments does a LangSmith pairwise annotation queue compare?Very often asked
Why: Pairwise annotation queues are built from exactly two experiments so reviewers choose between two outputs for the same input.
Sourced from Docs by LangChain (MCP)
6Why should a pairwise LLM-as-judge randomize the order of the two outputs?Very often asked
Why: LLM judges often favour the first or second answer by position; randomizing order keeps that bias from deciding the winner.
Sourced from Docs by LangChain (MCP)
7How is the candidate prompt referenced?Very often asked
Why: The candidate is a new immutable commit, so exactly what was evaluated is recorded.
Sourced from Docs by LangChain (MCP)
8Why are repetitions used in evaluate() here?Very often asked
Why: Repetitions reveal whether outputs and preferences are stable rather than one-off results.
Sourced from Docs by LangChain (MCP)
9Which metadata does the workflow record on each experiment?Very often asked
Why: Step 2 records prompt commit, model and app version for reproducibility and audit.
Sourced from Docs by LangChain (MCP)
10What does a pairwise LLM judge in this workflow receive for each example?Very often asked
Why: The pairwise judge sees the input and both outputs so it can choose between them.
Sourced from Docs by LangChain (MCP)
11An example shows the judge picking A in some repetitions and B in others. Best action?Very often asked
Why: Split verdicts signal uncertainty that humans should resolve, and may reveal rubric gaps.
Sourced from Docs by LangChain (MCP)
12A teammate edited the dataset after the baseline ran but before the candidate ran, without pinning. What should you do?Very often asked
Why: The workflow must never compare outputs from different dataset versions, so both must run on the same version.
Sourced from Docs by LangChain (MCP)
13With N examples and R repetitions, and one randomized ordering per judgement, roughly how many pairwise judge calls are needed?Very often asked
Why: Each example in each repetition gets one pairwise judgement; running both orderings would double it.
Sourced from Docs by LangChain (MCP)
14Judge–human agreement is low on the examples reviewed. What is the right conclusion?Very often asked
Why: The gate requires acceptable agreement; low agreement means the judge cannot yet be trusted.
Sourced from Docs by LangChain (MCP)
15After moving the production tag to B, online alerts show a serious schema regression. Fastest safe rollback?Very often asked
Why: Tags are movable pointers, so pointing production back at the baseline commit restores the known-good prompt.
Sourced from Docs by LangChain (MCP)
16What must be true for two experiments to be compared pairwise example by example?Often asked
Why: Pairwise comparison matches outputs row by row, so both experiments must be run against the same dataset examples, ideally the same pinned version.
Sourced from Docs by LangChain (MCP)
17Which environment variable switches on LangSmith tracing?Often asked
Why: Tracing is enabled through LANGSMITH_TRACING per the docs.
Sourced from Docs by LangChain (MCP)
18Which Python decorator traces an arbitrary function in LangSmith?Often asked
Why: The @traceable decorator records a function call as a run in a trace.
Sourced from Docs by LangChain (MCP)
19What happens to a production trace when an online evaluator runs on it?Often asked
Why: The notes state running an online evaluator upgrades a trace to extended retention.
Sourced from Docs by LangChain (MCP)
20Which pytest marker turns test cases into LangSmith datasets and experiments?Often asked
Why: The pytest integration uses @pytest.mark.langsmith.
Sourced from Docs by LangChain (MCP)
21Why is concurrency bounded in evaluate()?Often asked
Why: Too much concurrency causes throttling and failures that skew coverage and latency metrics.
Sourced from Docs by LangChain (MCP)
22In a pairwise annotation queue, what does the reviewer count per item control?Often asked
Why: Reviewer count sets how many human judgements each item collects.
Sourced from Docs by LangChain (MCP)
23What do reservations in an annotation queue do?Often asked
Why: Reservations stop two reviewers working on the same item at the same time.
Sourced from Docs by LangChain (MCP)
24How should human reviewers see the two outputs in the pairwise queue?Often asked
Why: Step 6 requires reviewers to choose blind to the version to avoid bias.
Sourced from Docs by LangChain (MCP)
25What is the trade-off of running both orderings (A,B and B,A) for each pair?Often asked
Why: Both orders give a per-example position-consistency check at twice the judge cost.
Sourced from Docs by LangChain (MCP)
26What happens with failing production traces after the release?Often asked
Why: Step 8 feeds failing traces back into the dataset for the next comparison.
Sourced from Docs by LangChain (MCP)
27Which features belong to single-run annotation queues rather than pairwise ones in the notes?Often asked
Why: Single-run queues offer rubrics, assertions and export to datasets for individual runs.
Sourced from Docs by LangChain (MCP)
28Which helper wraps an OpenAI client so its calls are traced?Sometimes asked
Why: wrap_openai is the LangSmith wrapper for OpenAI clients.
Sourced from Docs by LangChain (MCP)
29Which package provides trajectory evaluators such as a trajectory LLM-as-judge?Sometimes asked
Why: agentevals provides trajectory evaluators for agents.
Sourced from Docs by LangChain (MCP)
30What does LangSmith use to group the runs of a multi-turn conversation?Sometimes asked
Why: Threads group multi-turn conversations.
Sourced from Docs by LangChain (MCP)
31How can an app already instrumented with OpenTelemetry send traces to LangSmith and another backend?Sometimes asked
Why: LangSmith supports native OTLP ingestion, and a collector can fan out to multiple backends.
Sourced from Docs by LangChain (MCP)
32Which sources can dataset examples come from, per the docs?Sometimes asked
Why: The notes list curated cases, production traces and synthetic data as sources.
Sourced from Docs by LangChain (MCP)
33What controls which production runs an online evaluator scores?Sometimes asked
Why: Online evaluators are configured with filters and sampling rates.
Sourced from Docs by LangChain (MCP)
Track your progress through every blueprint in your dashboard.
Start learning