Every time you ask a chatbot a question, accept a code suggestion in your editor, or hear a voice assistant answer in full sentences, a large language model (LLM) is doing one deceptively simple thing: predicting the next token, then the next, then the next. Teaching a model to make good predictions is training: weeks of feeding it trillions of tokens on thousands of GPUs. It happens once per model version, it's measured in days and dollars, and nobody is waiting on the other side of the screen. Putting the trained model in front of users is inference, a different problem entirely: it happens billions of times a day, each request is measured in milliseconds, and someone is always waiting.
Serving a model sounds simple (load the weights, run the forward pass) until you try it at scale.
- Every request needs GPU memory to remember the conversation so far (the KV cache).
- Thousands of requests arrive at once, with prompts of wildly different lengths.
- The GPU sits mostly idle unless you batch them cleverly.
A whole ecosystem of inference engines has grown up to solve exactly these problems.
- vLLM made memory management efficient with PagedAttention.
- SGLang made it cheap to reuse shared prompt prefixes with RadixAttention.
- NVIDIA's TensorRT-LLM squeezes every cycle out of NVIDIA hardware.
- llama.cpp brought LLMs to laptops and commodity hardware.
On top of these engines sit orchestrators that scale them across clusters, and on top of those, a crowded market of managed services that run the whole thing for you. Whether you build your own stack or buy one from a vendor, you face the same question: which option is good enough for my users? And what does “good enough” even mean?
Many teams never run an engine themselves; they buy one, wrapped in a service. The market looks like a pyramid, and every step up trades control for convenience.
Teams with deep engineering bandwidth build near the base; teams without that bandwidth climb toward the top. Either way, each step up hands one more decision to someone else, including how fast your users' tokens arrive. So how do you pick a level? It comes back to what “good enough” means.
Ask a product team what they need and you'll hear “feelings”. The chatbot should feel responsive. The voice agent should feel smooth, never breaking mid-sentence. The code completion should feel crisp and fast. Those feelings are real, but you can't hold a vendor to a feeling, and you can't tell whether last week's release made things better or worse. Lord Kelvin said it best, in an 1883 lecture:
“When you can measure what you are speaking about, and express it in numbers, you know something about it; but when you cannot measure it, when you cannot express it in numbers, your knowledge is of a meagre and unsatisfactory kind.”
It's usually paraphrased as what can't be measured can't be improved. So the first job is translation.
- “Responsive” becomes the time until the first token appears.
- “Smooth” becomes the gap between one token and the next.
- “Crisp” becomes the total time to finish a short completion.
Once a feeling becomes a number, three questions follow, and they make up the rest of this post:
- Measure (SLI): what number do we watch?
- Promise (SLO): what value of it do we commit to, and for how many requests?
- Contract (SLA): what happens when we break that promise?
The three answers nest inside one another, like rings.
Each ring has its own tribe.
- Academics live in the innermost one: a systems paper picks an SLI, builds a smarter scheduler, and shows the number moving the right way. When it states a promise at all, it's often borrowed from another paper and tested under traffic the authors chose.
- Serving teams live in the middle: they decide which SLIs matter and what to promise. Too often, that means whatever the dashboard already tracks, an average or a p50, rather than what a user actually feels.
- Management lives on the outside, where account teams, lawyers and finance turn promises into contracts. The remedy is usually a capped service credit, and the fine print defining the SLI is rarely what anyone negotiated over.
Each tribe tends to treat the other rings as someone else's problem. They aren't. An optimization that improves an SLI nobody promised is a paper, not a product. A contract written on an SLI nobody measures is a promise waiting to be broken. And as we'll see, LLM SLAs cover whether the service is up, not whether it's fast, and for a better reason than you might think.