Contents Working with Large Language Models Code Course home

Chapter 19Steering LLMs: Decoding and Prompting

A distribution is not an answer

Part IV ends with a trained model which, given a context, produces a probability distribution over the next token, and that is Chapter 10’s task at transformer scale. A distribution is not an answer, though, so something has to choose.

That choice is decoding, and it is made outside the model after training is over, since nothing in this chapter changes a single weight. Two levers exist at that point, where decoding decides how a token is picked from the distribution and prompting decides what the distribution is conditioned on. Both are cheap, both are reversible, and both change the output more than most people expect.

Decoding: from distribution to token

Greedy, and where it fails

The obvious rule is to take the highest-probability token at every step, and it fails in a way that is easy to construct. Take a tiny model whose whole next-token tree is written out.

prefix choices greedy takes
(start) the 0.40, a 0.35, one 0.25 the
the cat 0.55, dog 0.45 cat
the cat sat 0.60, ran 0.40 sat

Greedy returns the cat sat, with probability 0.40×0.55×0.60=0.13200.40 \times 0.55 \times 0.60 = 0.1320.

Now rank every three-word sequence the model can produce.

rank sequence probability
1 a bird sang 0.2992
2 the cat sat 0.1320
3 the dog sat 0.0900
4 the dog ran 0.0900
5 the cat ran 0.0880

The best sequence is more than twice as likely as the one greedy found, and greedy went wrong at the very first step. It took the at 0.400.40 over a at 0.350.35 and could not see that a leads to bird at 0.900.90 and then sang at 0.950.95.

That is the general shape of the failure. A high-probability token can sit in front of a low-probability continuation, and a rule that looks one step ahead cannot know.

Beam search keeps the best ww partial sequences at every step instead of one.

width best found probability optimal?
1 the cat sat 0.1320 no
2 a bird sang 0.2992 yes
3 a bird sang 0.2992 yes
5 a bird sang 0.2992 yes

Width 11 is greedy by definition, width 22 already finds the optimum here, and wider beams cost more for nothing. Beam search is not guaranteed to find the best sequence, because it searches more of the space than greedy and less than all of it, and that is the honest description.

It also has a known bias, since optimising total probability favours short, safe, generic output. That is acceptable in translation where there is a right answer, and it is a problem in open-ended generation where the safest continuation is usually the dullest.

Temperature

Sampling introduces variety and temperature controls how much of it. Divide the logits by TT before the softmax, which is the same as raising each probability to the power 1/T1/T and renormalising.

TT the a one some any entropy
0.0 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.5 0.9903 0.0067 0.0022 0.0005 0.0001 0.0904
0.8 0.9239 0.0408 0.0202 0.0085 0.0036 0.5235
1.0 0.8500 0.0700 0.0400 0.0200 0.0100 0.9094
1.5 0.6585 0.1246 0.0858 0.0541 0.0341 1.7069
2.0 0.5211 0.1495 0.1130 0.0799 0.0565 2.1524

The distribution has seven tokens and the table shows the largest five, so a row sums to 0.990.99 rather than 11, with each and every holding 0.0050.005 apiece at T=1T = 1. The entropy column counts all seven.

T=1T = 1 leaves the model’s own distribution alone, below 11 it sharpens, and at T=0T = 0 it is greedy with zero entropy because nothing is left to choose, while above 11 it flattens. Both ends have a characteristic failure, since low temperature gives repetitive, safe text while high temperature gives varied text that drifts off topic and eventually stops making sense.

Top-kk, top-pp, and why the second replaced the first

Sampling from the full distribution has a problem, because a vocabulary of 50,00050{,}000 tokens holds a great many implausible options and their combined tail probability is not negligible. Top-kk keeps the kk most likely tokens and renormalises, while top-pp, or nucleus sampling, keeps the smallest set whose probability mass reaches pp. The difference shows the moment you try both on two distributions of different shape.

distribution top four entropy
peaked the 0.85, a 0.07, one 0.04, some 0.02 0.9094
flat red 0.14, blue 0.13, green 0.13, black 0.12 2.9977

Now apply a fixed kk to both.

kk peaked: kept mass kept flat: kept mass kept
1 1 0.8500 1 0.1400
2 2 0.9200 2 0.2700
5 5 0.9900 5 0.6400
8 7 1.0000 8 1.0000

Read the k=5k = 5 row. On the peaked distribution it admits four tokens the model had all but ruled out, and on the flat one it discards three tokens that were as good as the ones it kept. The same kk is too loose on one shape and too tight on the other, because kk cannot see the shape. Top-pp can.

pp peaked: kept mass flat: kept mass
0.50 1 0.8500 4 0.5200
0.90 2 0.9200 8 1.0000
0.95 3 0.9600 8 1.0000
0.99 5 0.9900 8 1.0000

At p=0.9p = 0.9 the peaked distribution keeps two tokens while the flat one keeps eight, so the candidate set now follows the model’s own confidence, which is exactly what a fixed kk could not do. That is why nucleus sampling became the default.

All of it, on one distribution

strategy the a tokens kept entropy
greedy 1.000 0.000 1 0.0000
temperature 0.7 0.954 0.027 7 0.3467
pure sampling, T=1T=1 0.850 0.070 7 0.9094
temperature 1.5 0.658 0.125 7 1.7069
top-kk, k=3k = 3 0.885 0.073 3 0.6219
top-pp, p=0.9p = 0.9 0.924 0.076 2 0.3882

Every row is the same model and none of them changed a weight. Which row to use follows from the task, since a factual answer wants a low-entropy row while a story wants one of the middle ones.

Try it yourself. code/worked_examples/decoding.py produces every table here. --beam shows greedy losing and beam recovering, --temp sweeps the temperature, --truncate contrasts top-kk with top-pp on both shapes, and --compare prints the last table.

Run it in ColabNotebookSource

Prompting: programming without weights

The second lever changes what the model is conditioned on. Chapter 18 noted that at sufficient scale a model can perform a task from a description in its input with no gradient update (Brown et al. 2020), and that capability is what makes prompting a technique rather than a formatting detail.

Three settings

Zero-shot gives an instruction and nothing else, few-shot adds a handful of worked examples in the prompt, and chain-of-thought asks the model to produce its reasoning before its answer (Wei et al. 2022). The third is the interesting one, and its mechanism is not mysterious.

A model produces one token at a time, each conditioned on what came before, so asking for an answer directly gives it one forward pass to reach the conclusion while asking for the steps first gives it many, with each step becoming context for the next. Chain-of-thought is therefore not the model thinking harder but the model being given room to compute.

What actually helps

Four things help, in rough order of reliability.

Be specific about the output, naming the format, the length and the allowed values, because most prompt failures are underspecification rather than model failure. Give examples rather than adjectives, since two demonstrations of the format you want beat a paragraph describing it. Ask for steps on multi-step problems, which is free and helps most where the task is arithmetic or logical. And put the constraints last, because the instruction nearest the generation point tends to dominate, which is a property of the architecture rather than a rule of style.

What prompting cannot do

Prompting selects from what the model already has, so it does not add knowledge the model lacks and it does not reliably remove behaviour the model learned. Two consequences follow, and they set up the next three chapters. If the model does not know a fact then no prompt will supply it, which is Chapter 21. And if the model’s default behaviour is wrong then prompting patches it case by case and never fixes it, which is Chapter 20.

The steering hierarchy

There are four ways to change what a model does, cheapest first.

method changes cost when
decoding the sampling rule none always available
prompting the conditioning none first thing to try
retrieval the context low missing knowledge
fine-tuning the weights high wrong default behaviour

Work down that list rather than up it, because a great deal of expensive fine-tuning has been spent on problems a decoding parameter would have solved. The order also has a diagnostic use, since if prompting cannot get close then the problem is usually knowledge or behaviour rather than phrasing, and that tells you which chapter to read next.

Further reading.

Brown et al. (2020) report in-context learning. Wei et al. (2022) introduce chain-of-thought prompting. Holtzman et al. (2020) is the nucleus sampling paper. Its account of why pure sampling degenerates is the clearest available. Jurafsky and Martin (2025) cover decoding alongside machine translation, where beam search has its longest history. Every strategy here is an argument to transformers’ generate, and its LogitsWarper classes are the operations of this chapter written out one per file, which makes them unusually easy to read.

Break greedy. Construct a next-token tree of depth three in which greedy decoding is at least three times worse than the optimal sequence. State the general property your construction relies on.

Beam width. On the tree in this chapter, find the smallest beam width that recovers the optimum. Then modify the tree so that width 22 is not enough, and say what you had to change.

Temperature by hand. Take the distribution (0.6,0.3,0.1)(0.6, 0.3, 0.1) and compute the result at T=0.5T = 0.5, 11 and 22. Confirm each sums to one, and compute the entropy of each.

Where kk fails. Construct one distribution where k=5k = 5 is far too permissive and another where it is far too restrictive. Then find a single value of pp that behaves sensibly on both, and explain why one parameter can serve both shapes.

Chain-of-thought, mechanically. Explain why asking a model for its reasoning before its answer changes what it can compute, in terms of tokens and forward passes. Then name a task where it should not help, and say why.

Pick a level. For each of these, name the cheapest level of the steering hierarchy that could work, and justify it: (a) output is too repetitive; (b) the model does not know your company’s refund policy; (c) the model answers in American spelling and you need British; (d) the model refuses a legitimate request in your domain.

Check the library against the table. Put this chapter’s peaked and flat distributions through transformers.TopPLogitsWarper at p=0.5p = 0.5 and p=0.9p = 0.9 and count how many tokens survive each time. All four cells agree with the table above, which is worth confirming rather than assuming. Then find min_tokens_to_keep in the signature and describe the distribution on which it would change the answer, and why a library needs it when the definition does not.

Code for this chapter

Each one reproduces the tables above. Open it in Colab, change an input and watch which numbers move.

From Natural Language Processing: From Corpus Statistics to Grounded LLMs, by Ramaseshan Ramachandran.