When a team's LLM bill triples in a quarter, the reflexive explanation is 'usage grew.' Usually only part of that is true. Pull apart almost any runaway AI cost and you'll find the same five patterns underneath: prompts that quietly bloated over months of 'just add one more instruction,' zero caching on requests that repeat constantly, every request routed to the most expensive model regardless of difficulty, no batching on work that doesn't need to be synchronous, and no visibility into which feature or customer is actually driving the spend. None of these require sacrificing output quality to fix, they require the same engineering discipline any cost center gets once someone's actually watching it. Here's the concrete playbook, with realistic savings ranges for each technique.
Fixing context and prompt bloat
Every system prompt starts clean and accretes exceptions. Someone hits an edge case, adds a sentence to handle it. Someone else adds a few-shot example to fix a formatting issue. Six months later, the system prompt is three times longer than it started, most of it dead weight for 95% of requests, and every single API call pays the token cost of processing all of it whether or not it's relevant. This is the most common cost driver nobody notices, because it happens one small addition at a time and nobody re-audits the whole prompt against what's actually needed. The fix is a quarterly prompt audit: measure which instructions and examples actually change model behavior on your real traffic (an ablation test, remove one instruction at a time and check if outputs change on your eval set) and cut what doesn't earn its token cost. Teams that do this typically find 20-40% of their system prompt is doing nothing measurable and can be removed with zero quality impact, which is pure savings on every single request going forward.
Caching: prompt caching and semantic caching are different tools
Two caching strategies get conflated constantly and solve different problems. Prompt caching (offered by most major providers) reuses the model's internal processing of a static prefix, your system prompt, your few-shot examples, a long document you reference repeatedly, across multiple requests, so you pay full price for that prefix once and a steep discount (often 50-90% off the cached tokens) on every subsequent call within the cache window. This is nearly free money for any workload with a stable prefix and repeated calls, a customer support agent with the same system prompt processing thousands of tickets, a document-analysis tool referencing the same source document across many questions. Semantic caching is different: it stores the actual response to a previous query and serves it again (or an interpolated variant) when a new query is semantically similar enough, skipping the model call entirely. This works well for high-repetition, low-variance workloads, FAQ-style assistants, common classification tasks, and works poorly for anything where subtle differences in the request should produce meaningfully different answers. Applying semantic caching to a workload that needs precision (financial calculations, personalized recommendations) trades cost savings for a real quality regression; that's the one place on this list where cutting cost carelessly does hurt quality.
| Prompt caching | Semantic caching | |
|---|---|---|
| What's reused | The model's processing of a static prefix | A previous full response |
| Typical savings | 50-90% off the cached prefix's tokens | Up to 100% for a cache hit (no model call at all) |
| Best fit | Stable system prompts, repeated long context, tool definitions | High-repetition FAQ-style or classification queries |
| Quality risk | Essentially none, same model, same computation | Real risk if similarity threshold is too loose for the use case |
Model routing: stop sending easy requests to expensive models
The single biggest lever in most cost audits is routing. Teams that default every request to their most capable (and most expensive) model are paying frontier-model prices for requests a much cheaper model would have handled correctly, often the majority of traffic. A well-built routing layer sends requests to a cheap, fast model first, checks the response against a confidence signal (a self-reported confidence score, a lightweight classifier, or a cheap secondary check), and escalates to a more expensive model only when that signal is low or the task is flagged as inherently hard (long-context reasoning, ambiguous intent, high-stakes output). In practice, a well-tuned router can move 60-80% of requests to a model costing a fraction of the frontier price per token, while escalating the genuinely hard 20-40% that need it. The net effect is usually 30-50% of total spend recovered, because the distribution of real-world request difficulty is heavily skewed toward easy, and most systems were paying frontier prices across that entire distribution by default.
Batching: not everything needs to be synchronous
A meaningful share of LLM workloads don't require a live, sub-second response: nightly data enrichment, bulk classification of a backlog, generating summaries for a report that ships tomorrow morning, not in the next 200 milliseconds. Providers price guaranteed low-latency, synchronous requests at a premium over asynchronous batch processing, because batch requests can be scheduled against spare capacity. Moving genuinely non-urgent workloads to batch APIs typically cuts their cost by roughly half, sometimes more, for zero quality difference, since it's the identical model and the identical output, just processed on a different timeline. The audit question worth asking every quarter: which of our current synchronous, real-time calls are actually feeding a batch process downstream anyway, and just haven't been re-architected to use the cheaper path.
Visibility: you can't optimize spend you can't attribute
The fifth pattern isn't a technique, it's a precondition for the other four: knowing which feature, customer, or workflow is generating which slice of the bill. Teams that only see one aggregate monthly number from their provider can't tell whether a cost spike came from a genuinely valuable feature scaling with usage, or from a bug generating retry loops, or from one customer running an unexpectedly expensive workflow. Tag every request with the feature and, where possible, the customer or workflow that generated it, and build a dashboard that breaks the bill down accordingly before doing any of the optimization above. Without this, teams routinely spend engineering time optimizing the wrong 20% of spend because it's the part they happened to notice.
Realistic savings, technique by technique
Vendors and blog posts love round numbers like '90% cost reduction.' Real numbers are more modest and more honest, and they compound rather than stack cleanly (fixing bloat reduces the base the caching and routing percentages apply to). Here's a grounded estimate for a typical mid-size LLM-powered product.
| Technique | Typical savings | Where it applies best |
|---|---|---|
| Prompt/context bloat audit | 10-25% of total spend | Any system prompt untouched by a full audit in 6+ months |
| Prompt caching | 40-90% of the cached-prefix tokens | Stable system prompts, repeated documents, tool schemas |
| Semantic caching | Up to 100% on cache hits, 10-30% of eligible traffic overall | FAQ-style, low-variance, high-repetition queries only |
| Model routing (cheap-first, escalate on low confidence) | 30-50% of total spend | Any workload with a wide range of request difficulty |
| Batching non-urgent workloads | ~50% of batchable workload cost | Nightly jobs, bulk processing, reporting pipelines |
| Combined, realistic total | 30-60% of total spend | Most production LLM systems that haven't been audited before |