Prompt Engineering, Measured: What Changes the Output
Sixty tickets, the same words in six orders, and accuracy between 26.7 % and 85.0 %. Then four internet tricks, with error bars on each of them.
On this page
Here is a support ticket, and four queues it could go to.
The label on the parcel has my old surname on it.
-> billing / technical / shipping / accountTo route it you need three things in the prompt: the queue definitions, the ticket, and the instruction to pick one. Three blocks. There are six orders you can put them in, and the blocks contain exactly the same characters in all six.
Over sixty tickets with known answers, the six orders score between 26.7 % and 55.0 %. Move the same two blocks out of the user turn and into the system turn, changing no word at all, and the same model scores 76.7 %. Wrap the ticket in an XML-style tag and it reaches 85.0 %.
Nothing about the model changed. Nothing about the task changed. Not one word was rewritten. A fifty-eight point swing came out of arranging the same text.
That is the reason this chapter exists, and it is also the reason it is the most cargo-cult-infested subject in the field. The effects are real and large, which makes every anecdote feel confirmed; and they are unstable across models and tasks, which means an anecdote is all most advice ever is. So this chapter has one rule, and everything in it is subordinate to that rule:
A prompt is measured, not debated. Four variants over twenty cases distinguish nothing at all.
The prompt is the entire state
Link to the section: The prompt is the entire stateBefore the measurements, one fact that quietly explains half of what follows.
The model has no memory. Between two calls it retains nothing — not your last question, not its own last answer, not the file you attached, not the fact that you asked it twice already. Every call starts from an empty machine, and the only thing that machine knows is the sequence of tokens you just handed it.
What looks like memory in a chat interface is your client resending the whole conversation, every turn, from the beginning. The model reads all of it again from scratch, every time. Chapter 13 measured what that re-reading costs in a forward pass; Chapter 16 turns it into a line on an invoice. What matters here is the consequence for design: the prompt is not a message to a system that has state. It is the state.
That retires a family of confusions. "The model forgot what I told it" usually means it was never sent. "It ignored my earlier instruction" usually means the instruction fell out of the window when the history was truncated. "It behaved differently in production" usually means production assembles a different prompt from the one you tested. None of these is a model problem, and none is fixed by rewording anything.
The bench
Link to the section: The benchThe claim "this prompt is better" is a claim about a distribution, and you cannot see a distribution by looking at one output. What you need is boring: cases with known answers, N variants, and an interval.
The harness is fifty lines of TypeScript with the same shape as the client from Chapter 14 — a request, a deadline, some concurrency, a tally. It reappears in Chapter 19 to evaluate a retriever and in Chapter 29 as the golden set.
export type Case = { input: string; expected: string };
export type Variant = { name: string; build: (c: Case) => ChatMessage[] };
async function pooled<T, R>(xs: T[], n: number, f: (x: T) => Promise<R>) {
const out: R[] = new Array(xs.length);
let i = 0;
await Promise.all(
Array.from({ length: n }, async () => {
while (i < xs.length) {
const k = i++;
out[k] = await f(xs[k]);
}
}),
);
return out;
}
export async function runVariant(v: Variant, cases: Case[], concurrency = 6) {
const hits = await pooled(cases, concurrency, async (c) => {
const answer = await complete(v.build(c));
return answer.trim().toLowerCase() === c.expected;
});
return { name: v.name, hits, k: hits.filter(Boolean).length, n: cases.length };
}The number that comes back is not the result. This is:
/** 95 % Wilson score interval for a proportion. Chapter 4 derives it. */
export function wilson(k: number, n: number, z = 1.96) {
const p = k / n;
const d = 1 + (z * z) / n;
const centre = (p + (z * z) / (2 * n)) / d;
const half = (z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * n * n))) / d;
return [Math.max(0, centre - half), Math.min(1, centre + half)] as const;
}Chapter 4 made the argument and this chapter cashes it. Seventeen right out of twenty is 85 %, and its 95 % interval runs from 64 % to 95 %. A variant scoring 13 out of 20 — 65 %, which feels clearly worse — has an interval from 43 % to 82 %. Those two intervals overlap across almost their whole length. Twenty cases cannot tell a good prompt from a mediocre one, and most published prompt advice was validated on fewer.
Sixty cases, which is what this chapter uses, is still not many. It is enough to see large effects and honest enough to admit when it cannot see small ones — and it will admit that several times below.
Position: the same words, six orders
Link to the section: Position: the same words, six ordersThree blocks — the rules R, the ticket T, the instruction I — concatenated into one user message. All six permutations, byte-identical content, sixty cases each.
| order of the three blocks | correct | accuracy, 95 % Wilson |
|---|---|---|
| rules, instruction, ticket | 33/60 | 55.0 % [42.5, 66.9] |
| rules, ticket, instruction | 30/60 | 50.0 % [37.7, 62.3] |
| ticket, rules, instruction | 22/60 | 36.7 % [25.6, 49.3] |
| instruction, ticket, rules | 21/60 | 35.0 % [24.2, 47.6] |
| instruction, rules, ticket | 17/60 | 28.3 % [18.5, 40.8] |
| ticket, instruction, rules | 16/60 | 26.7 % [17.1, 39.0] |
Best to worst is 28.3 points, and the intervals do not overlap, so this one is not a story about noise. Since every arm is scored on the same sixty items, the sharper question is the paired one: of the cases where two arms disagree, how lopsided is the split? Going from the worst order to the best flipped 21 cases right and 4 wrong — exact paired probability 0.0009.3
Read the table for its shape rather than its winner. The two best rows both end with the ticket; the two worst both bury the instruction in the middle or trail it after the data. That is the same phenomenon Liu et al. named Lost in the Middle: material at the edges of a prompt is used more reliably than material in the centre.4 Chapter 16 prices the window and Chapter 24 measures the effect properly at length, where the middle collapses as described and the recovery at the very end does not reappear. Here the practical rule falls out on its own: task at the top, data at the bottom, nothing important in the middle.
Now move the same words between turns. Chapter 11 established that the chat template is not decoration around the model but part of it — <|im_start|>system and <|im_start|>user are real tokens the model saw millions of times during fine-tuning, in exactly those positions. So it should matter which side of those markers your instruction lands on, and it does:
| where the same words live | correct | accuracy, 95 % Wilson |
|---|---|---|
| rules and instruction in the system turn, ticket alone in the user turn | 46/60 | 76.7 % [64.6, 85.6] |
| rules in the system turn, instruction and ticket in the user turn | 44/60 | 73.3 % [61.0, 82.9] |
| rules and instruction in the system turn, instruction repeated after the ticket | 42/60 | 70.0 % [57.5, 80.1] |
| all three blocks in one user turn | 33/60 | 55.0 % [42.5, 66.9] |
Moving the rules and the instruction across the template boundary bought 21.7 points — 19 cases gained, 6 lost, paired probability 0.0146 — without changing a character of them. This is the concrete answer to system prompt versus user prompt: they are not two ways of saying the same thing. They are two different token positions in a structure the model was trained on, and the system position is where instructions that apply to the whole conversation belong.
Notice the third row too. Repeating the instruction after the ticket — a widely recommended trick — scored below stating it once. On this model, on this task, saying it twice was worse than saying it once.
Delimiters, and the statistical lesson hiding in them
Link to the section: Delimiters, and the statistical lesson hiding in themSame prompt, best placement, sixty cases. The only thing that changes is what surrounds the ticket text.
| how the ticket is delimited | correct | accuracy, 95 % Wilson |
|---|---|---|
| an XML-style tag | 51/60 | 85.0 % [73.9, 91.9] |
| nothing at all | 48/60 | 80.0 % [68.2, 88.2] |
| a Markdown heading | 47/60 | 78.3 % [66.4, 86.9] |
a label, Ticket: | 46/60 | 76.7 % [64.6, 85.6] |
| hash fences | 45/60 | 75.0 % [62.8, 84.2] |
| triple backticks | 44/60 | 73.3 % [61.0, 82.9] |
| double quotes | 40/60 | 66.7 % [54.1, 77.3] |
An eighteen-point spread from punctuation. But look at the two extreme intervals: [73.9, 91.9] and [54.1, 77.3]. They overlap. By the crude reading — compare the error bars, and if they touch, say nothing — this table proves nothing at all.
The crude reading is wrong here, and understanding why is worth more than the table. Every variant was scored on the same sixty tickets, so the two measurements are not independent samples; they are paired. Most of each interval's width comes from a source of uncertainty both arms share — whether these sixty tickets are representative — and that source cancels when you compare them against each other. Ask the paired question instead and the answer is sharp: going from double quotes to the XML tag flipped 12 cases right and 1 wrong, paired probability 0.0034. That is a real difference.
And then the same test deflates the headline. The XML tag beat the plain Ticket: label by 8.3 points, which is the number a blog post would put in its title. Paired: 6 gained, 1 lost, probability 0.1250. Not established. Seven cases is what that famous improvement rests on.
So there are two questions with two different instruments, and conflating them is how prompt advice goes wrong in both directions at once:
How good is this prompt? The Wilson interval on its own accuracy. Wide unless you have hundreds of cases. This is the number you report to somebody deciding whether to ship.
Is B better than A? The paired test over the cases where they disagree. Much more sensitive, because the shared difficulty of the set cancels. This is the number you use to decide between two candidates.
The general finding — that models are strongly and unpredictably sensitive to formatting choices carrying no semantic content — is not new. Sclar et al. varied nothing but separators, spacing and casing across dozens of tasks and found accuracy spreads wide enough to reverse published model rankings.5 The practical consequence is not "use XML tags". It is that formatting is a hyperparameter, it costs nothing to sweep, and any comparison of two models that fixes one format is comparing formats as much as models.
How many examples are actually enough
Link to the section: How many examples are actually enoughIn-context learning — showing the model worked examples in the prompt and having it generalise from them without any weight update — is the capability that made GPT-3 famous.6 The practical question is never whether it works. It is how many examples to pay for.
Examples go in as real prior turns, alternating user and assistant, because that is the structure the template was trained on. Each k was run with five different random draws from a disjoint pool of sixteen labelled tickets:
| examples | mean accuracy | worst and best draw | spread across draws |
|---|---|---|---|
| 0 | 76.7 % | — | — |
| 1 | 78.7 % | 78.3 – 80.0 % | 1.7 points |
| 2 | 83.7 % | 80.0 – 86.7 % | 6.7 points |
| 4 | 81.7 % | 78.3 – 86.7 % | 8.3 points |
| 8 | 83.7 % | 78.3 – 88.3 % | 10.0 points |
| 16 | 89.3 % | 85.0 – 93.3 % | 8.3 points |
Two examples bought seven points. The next six examples bought nothing measurable — 83.7, then 81.7, then 83.7, a sequence that wanders inside its own noise. Sixteen bought another five and a half. The curve is not a smooth climb; it is a step, a plateau and a step.
The column that matters most is the last one. At k = 8, which eight examples you happened to pick moved accuracy by 10 points — larger than the entire gain from going from two examples to eight. And the bottom row is the sharpest version of it: at k = 16 the pool is exhausted, so all five runs contain exactly the same sixteen examples, differing only in the order they appear. Order alone moved accuracy 8.3 points.
That is the result Lu et al. reported and it survives everywhere it has been looked for: example ordering is a genuine hyperparameter with effects comparable to example count.7 So the honest advice about few-shot prompting is not a number. It is:
Start at zero and add examples only against a measurement
Link to the section: Start at zero and add examples only against a measurementThe first two are usually worth it. Beyond that you are guessing, and the guess costs tokens on every single call for the rest of the product's life.
Treat the selection as part of the prompt
Link to the section: Treat the selection as part of the promptTwo examples chosen well beat eight chosen carelessly. If your examples came from the top of a spreadsheet, that is the variable to sweep before adding more.
Sweep the order, once, and then freeze it
Link to the section: Sweep the order, once, and then freeze itIt is free, it is a real effect, and unlike most of this chapter it does not need a rewrite to try.
Check the class balance
Link to the section: Check the class balanceFour examples that are all the same label teach the model the label, not the task. This model's collapse onto whichever queue was listed last is the same failure in a different costume.
Four sentences from the internet
Link to the section: Four sentences from the internetNow the folklore. Each of these is a single sentence prepended to a system prompt that is otherwise identical, on the same sixty cases.
| sentence added to the system prompt | correct | accuracy, 95 % Wilson | paired against baseline |
|---|---|---|---|
| nothing added | 46/60 | 76.7 % [64.6, 85.6] | — |
| "Take a deep breath and work on this problem carefully." | 47/60 | 78.3 % [66.4, 86.9] | +4 / −3, p = 1.000 |
| "This is very important to my career." | 46/60 | 76.7 % [64.6, 85.6] | +5 / −5, p = 1.000 |
| "You are a world-class customer support operations expert with twenty years of experience." | 42/60 | 70.0 % [57.5, 80.1] | +3 / −7, p = 0.344 |
| "I will tip you $200 if you answer correctly." | 41/60 | 68.3 % [55.8, 78.7] | +1 / −6, p = 0.125 |
| "You will be penalised for every ticket you send to the wrong queue." | 25/60 | 41.7 % [30.1, 54.3] | +3 / −24, p < 0.001 |
Four of the five did nothing. Not "did a little"; nothing that sixty paired cases can see. The expert persona and the bribe both scored below the untouched baseline, and even those drops fail the paired test — they are noise pointing downhill.
The third row is the one to sit with. "This is very important to my career" produced exactly the same accuracy, 46 out of 60 — and ten of the sixty answers changed, five in each direction. The summary statistic was identical and the behaviour was not. If your evaluation is a single number over a small set, a change that rewrites a sixth of your outputs can look like a change that did nothing, and you will ship it believing it was free.
And then the threat, which is the only sentence that moved the needle and moved it 35 points down, flipping 24 cases from right to wrong. That is not a rounding artefact; it is a different model behaviour. The lesson is not "never threaten a model". It is that emotional framing is not inert. It shifts the distribution, sometimes hard, in a direction nobody can predict from reading the sentence — which is precisely why it has to be measured rather than reasoned about.
A caveat this chapter owes you: these five sentences were tested on one small model and one task. Some have published support elsewhere — "take a deep breath" came out of a paper that searched for high-scoring instructions rather than inventing them, which is a different and better claim than the one that circulated afterwards.8 What generalises is not the sentences. It is that the list which survived in blog posts and the list which survives measurement are two different lists, and the only way to know which one you are holding is to run the bench.
Why "do not" fails
Link to the section: Why "do not" failsA rule everyone repeats — say what you want, not what you do not want — with the usual absence of a number. Here is the number. The same format requirement, written three ways, with the model generating freely so that compliance can be observed:
| how the format rule is written | output was exactly one permitted word | mean output tokens |
|---|---|---|
| "Answer with one word." | 10/60 (16.7 %) | 2.6 |
| "Do not explain yourself. Do not write a sentence. Do not add punctuation." | 1/60 (1.7 %) | 14.0 |
| both together | 41/60 (68.3 %) | 2.3 |
Three prohibitions did worse than one instruction, and made the model write five times more text — the exact opposite of all three of them at once. Adding the positive sentence back rescued it to 68 %.
The mechanism is not mysterious once you remember Chapter 8. The model chooses a next token from a distribution conditioned on everything before it, and a prohibition puts the forbidden thing into that conditioning. There is no operator for negation; there is a context in which a word now appears.
Which is measurable directly. Take the baseline prompt and add one line: Do not use the shipping queue for software problems. Then look only at the forty-five tickets that are not shipping tickets:
shipping chosen | mean probability on shipping | overall accuracy | |
|---|---|---|---|
| baseline | 11.1 % of the 45 cases | 0.131 | 76.7 % [64.6, 85.6] |
| after forbidding it by name | 37.8 % | 0.374 | 51.7 % [39.3, 63.8] |
Naming a queue in order to rule it out made the model choose it three times more often, nearly tripled the probability mass it assigned to it, and cost 25 points of overall accuracy — 16 cases lost against 1 gained, paired probability 0.0003.
Do not think of an elephant, measured. The rewrite is always the same: replace the prohibition with the positive rule that makes it unnecessary. Not "do not use shipping for software problems" but "use shipping only when a physical parcel is involved".
The honest counterexample: chain of thought that costs and does not pay
Link to the section: The honest counterexample: chain of thought that costs and does not payChapter 12 built chain of thought properly — as a prompting technique first,910 then as something trained in with verifiable rewards — and ended with a warning it deferred to this chapter: telling a model to think step by step stops helping once the model reasons on its own, and can hurt. Here is that warning with a table under it, on a task where it is easy to assume more thinking must be better.
Both arms are read with the same instrument at the same position. The only difference is whether a chain of thought the model wrote itself sits in the context first.
| arm | correct | accuracy, 95 % Wilson | extra output tokens per case |
|---|---|---|---|
| no chain of thought | 37/60 | 61.7 % [49.0, 72.9] | 0 |
| chain of thought, up to 60 tokens | 34/60 | 56.7 % [44.1, 68.4] | 53.1 |
| chain of thought, up to 200 tokens | 34/60 | 56.7 % [44.1, 68.4] | 97.7 |
Accuracy went down and cost went up, and this chapter's own rule applies to this chapter's own result: the drop is 7 cases gained against 10 lost, paired probability 0.629, which is not established. What is established is that it produced ninety-eight extra output tokens per call and bought nothing measurable with them. The uncertainty is entirely on the benefit side. The bill is certain.
A chain that fails is more instructive than one that works. Asked to reason about "Your Slack integration stopped posting messages after Tuesday", the model wrote:
1. Check if the issue persists on Monday.
2. Verify if there are any updates or changes in your Slack setup that
might affect message posting.
3. If no update has been made since Tuesday, check for any recent system
restarts or downtime affecting Slack functionality.
4. If you have recently installed new software or updated your
environment, ensure it's compatible with Slack version.
5. Contact Slack support for further assistance or troubleshooting steps.That is competent troubleshooting advice and it is not the task. Asked to think, the model drifted into the genre that "think step by step about this support ticket" most resembles in its training data — and then answered a classification question with five hundred characters of unrelated reasoning in its own context. Chain of thought helps on problems with intermediate state worth computing: arithmetic, multi-hop lookups, constraint satisfaction. Routing a sentence into one of four buckets has no intermediate state. There is nothing for the chain to hold, so all it does is add plausible text that the final decision then has to survive.
Two practical corollaries. First, for a model trained to reason — the RLVR models of Chapter 12 — the instruction is worse than redundant: it can replace the long chain the model would have produced with a short, prompt-shaped one. And sampling several chains and voting, which is what self-consistency does,11 cannot rescue a task with nothing to disagree about: it multiplies the cost by the number of samples to break ties that are not there. Chapter 12 measured that trade where it does apply. Second, note what the comparison scaffold itself cost. Forcing the answer into a Final queue: line dropped the no-reasoning arm from 76.7 % to 61.7 %. Fifteen points, paid to make the two arms comparable. Structure that exists for your convenience is not free either.
The same call, twice
Link to the section: The same call, twiceOne last measurement, because it is the question everybody asks after the first surprising result. Sixty prompts, greedy decoding, run repeatedly:
- The same call repeated with everything held fixed returned bit-identical probabilities. Deterministic.
- The same call batched with different neighbours — batch sizes 1, 4, 12, 30 and 60 — returned probabilities differing by up to 0.0128. The chosen label never changed, in 0 of 60 cases.
The label survived because it had room to: across the sixty cases the narrowest gap between the top two queues was 0.0459, three and a half times the drift. The stability was not a property of the algorithm. It was a margin, and margins run out. Chapter 17 is where the arithmetic reason lives and where the sampling knobs that widen and narrow those gaps get taken apart. The reason to plant it here is that it bounds what any prompt measurement can mean: the bench measures a system reproducible only up to a tolerance, and a two-point difference between variants is inside that tolerance on a bad day.
Stop opinionating and start searching
Link to the section: Stop opinionating and start searchingEverything above is a human choosing a variant and a machine grading it. The obvious next step is to let the machine choose the variants too.
APE does exactly that: a model proposes candidate instructions, they are scored on held-out examples, and the best survive.8 The instructions it finds are frequently ones no human would write, which is the point — the search is over what scores, not over what sounds professional.
DSPy goes further and is the more useful idea for a product.12 You declare what each step of a pipeline takes and returns, and the framework compiles that into prompts, selecting demonstrations and optimising instructions against your metric. Change model and you recompile instead of rewriting. The prompt stops being source code somebody hand-tunes and becomes an artefact generated against a metric, which is what it should have been all along.
Neither removes the need for the bench. Both make it the only thing you need, because an optimiser without a metric optimises nothing.
Which leaves the discipline. Prompts belong in version control, in files, next to the code that sends them — not in a database row somebody edited on a Tuesday. They need a version identifier stored alongside every output they produced, or the day something regresses you cannot find out what changed. They need the bench in continuous integration, because a prompt is the one part of your system that a vendor can silently invalidate by deploying a new model. And they need cases: not a hundred clever ones, just the boring twenty that broke last quarter, kept forever. The bench is the deliverable. The prompt is a by-product of it.
Where this goes next
Link to the section: Where this goes nextEverything in this chapter was measured in accuracy. Every one of those variants also has a price.
The system prompt that bought 21.7 points is sent on every call, forever. The two examples that bought seven points are sent on every call, forever. The sixteen that bought twelve are sent on every call, forever, and they are roughly ten times the length of the question the user actually asked. The chain of thought that bought nothing produced ninety-eight extra tokens per request, and output tokens are the expensive kind.
None of that is visible in a table of accuracies, and all of it is visible on an invoice.
Chapter 16 is about the unit those decisions are actually denominated in. The token as a billing unit, the context window as a budget rather than a memory, why a forty-turn conversation costs far more than forty times the first turn, what prompt caching does and does not pay for, and why the order of your prompt decides whether the cache hits at all — which turns out to be a second, entirely economic reason to put the stable material first and the variable material last.
Sources and method
Link to the section: Sources and methodThe bench and every table were produced with Qwen/Qwen2.5-0.5B-Instruct under greedy decoding, so they reproduce exactly. The Hugging Face documentation on chat templates is the reference for what the template markers of Chapter 11 actually expand to, and for the fact that a model shipping the wrong template is a real and recurring failure. For the position and format effects at production scale rather than laboratory scale, the citations above are the primary sources; the vendor prompting guides are useful for their examples and should be read knowing that none of them publishes an interval.
References
Link to the section: References-
Anthropic, Effective context engineering for AI agents (29 September 2025), for the prompt-versus-context distinction used in this chapter and developed in Chapter 24. ↩
-
Zhao, Z., Wallace, E., Feng, S., Klein, D. and Singh, S. Calibrate Before Use: Improving Few-Shot Performance of Language Models. arXiv:2102.09690 (2021). Majority-label, recency and common-token bias, and why the rotation in this chapter's bench is not optional. ↩
-
McNemar, Q. Note on the sampling error of the difference between correlated proportions or percentages. Psychometrika 12(2), pp. 153–157 (1947). The paired comparisons in this chapter use the exact binomial form rather than the chi-squared approximation, because the discordant counts are small. ↩
-
Liu, N. F. et al. Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172 (2023). Cited here for the position effect; measured at length in Chapter 24. ↩
-
Sclar, M., Choi, Y., Tsvetkov, Y. and Suhr, A. Quantifying Language Models' Sensitivity to Spurious Features in Prompt Design. arXiv:2310.11324 (2023). Separators and spacing alone move accuracy enough to reorder model leaderboards. ↩
-
Brown, T. B. et al. Language Models are Few-Shot Learners. arXiv:2005.14165 (2020). The paper that introduced in-context learning as a capability rather than a curiosity; section 3 is the source of the zero-shot / one-shot / few-shot vocabulary everyone now uses. ↩
-
Lu, Y., Bartolo, M., Moore, A., Riedel, S. and Stenetorp, P. Fantastically Ordered Prompts and Where to Find Them: Overcoming Few-Shot Prompt Order Sensitivity. arXiv:2104.08786 (2021). The result reproduced in the few-shot table above. ↩
-
Zhou, Y. et al. Large Language Models Are Human-Level Prompt Engineers. arXiv:2211.01910 (2022). Automatic prompt engineering by proposal and scoring. The much-quoted "take a deep breath" instruction comes from Yang, C. et al., Large Language Models as Optimizers, arXiv:2309.03409 (2023), which found it by search on one task with one model — a claim that did not survive the trip into blog posts intact. ↩ ↩2
-
Wei, J. et al. Chain-of-Thought Prompting Elicits Reasoning in Large Language Models. arXiv:2201.11903 (2022). ↩
-
Kojima, T., Gu, S. S., Reid, M., Matsuo, Y. and Iwasawa, Y. Large Language Models are Zero-Shot Reasoners. arXiv:2205.11916 (2022). The "let's think step by step" result, and worth reading for how narrow the conditions were. ↩
-
Wang, X. et al. Self-Consistency Improves Chain of Thought Reasoning in Language Models. arXiv:2203.11171 (2022). Measured with its cost attached in Chapter 12. ↩
-
Khattab, O. et al. DSPy: Compiling Declarative Language Model Calls into Self-Improving Pipelines. arXiv:2310.03714 (2023). ↩