Chapter 13: Cost Control: Caching, Rate Limits, and Production Economics

Learning Objectives

Pre-Reading Check — Caching

1. Anthropic and OpenAI implement prompt caching differently. Which pair correctly describes their activation models?

2. On Anthropic, how do cache-write and cache-read prices compare to the base input price?

3. Why does prompt-cache reuse require that static content go first in the prompt?

4. How does a semantic (response) cache differ from a prompt/context cache?

5. For a personalized assistant, when is semantic caching dangerous?

Caching

Caching is the single highest-leverage cost control available to an assistant builder, because personalized prompts are mostly repetition. The system prompt, the tool definitions, the formatting instructions, the retrieved knowledge-base article — these bytes are identical across thousands of requests. Caching lets you pay full price to process them once and a steep discount to reuse them thereafter.

Key Points

  • Prompt (context) caching reuses the model's computation for a prompt segment: ~90% read discount and up to 80–85% lower latency.
  • Anthropic is explicit (cache_control breakpoints, write costs 1.25x–2.0x input) while OpenAI is automatic and free (prefix routing). Both need at least 1,024 tokens.
  • Cache hits require an exact prefix match, so static content must go first and variable content last — the static-first assembly from Chapter 4.
  • Semantic (response) caching matches query meaning via embeddings, cutting inference cost 30–70% by skipping the model for similar questions.
  • Cache reads are excluded from Anthropic's ITPM limit, so caching also buys throughput headroom.

Prompt / Context Caching Mechanics

Prompt caching (also called context caching) stores the model's internal computation for a portion of a prompt so that subsequent requests reusing that portion skip the recomputation. The model loads the already-processed representation and continues from there rather than re-reading cached tokens from scratch.

Anthropic (Claude) uses explicit caching: you mark cacheable content with cache_control breakpoints. Cache writes cost more than a normal input token (1.25x for a 5-minute TTL, or 2.0x for a 1-hour extended TTL), while cache reads cost only ~10% of the base input price. OpenAI uses automatic caching, routing each request to a server that recently processed the same prefix — no code changes, no extra fee — enabled automatically for any prompt of 1,024 tokens or more, reducing latency up to 80% and input cost up to 90%.

DimensionAnthropic (Claude)OpenAI
ActivationExplicit (cache_control breakpoints)Automatic (prefix routing)
Extra fee to enableCache write costs 1.25x–2.0x inputNone
Cache read price~10% of base inputDiscounted automatically (up to 90% off)
Minimum length1,024 tokens1,024 tokens
TTL5 min (standard) / 1 hr (extended), refreshed on accessRolling; prefix stays warm while reused
Rate-limit interactionCached reads excluded from ITPM limitsCached prefix reused via routing

The performance numbers are dramatic: Anthropic reports latency reductions up to 85% for long prompts — in a 100,000-token "book" example, response time dropped from 11.5 s to 2.4 s once caching was enabled. There is also a subtle rate-limit interaction: on Anthropic's current models, cache_read_input_tokens are excluded from the input-tokens-per-minute (ITPM) limit, so caching buys throughput headroom as well as cost savings.

Analogy: Prompt caching is like a barista who keeps your regular order on a sticky note. The first time, they take your full order slowly (the cache write, which even costs a little extra to write down). Every visit after, they glance at the note and start pulling shots immediately (the cheap, fast cache read). But the note only helps if your order starts the same way every time.

Cache-Friendly Prompt Ordering

Cache hits require an exact prefix match. The provider can only reuse computation up to the first byte that differs between two prompts. OpenAI caches the longest previously-computed prefix, starting at 1,024 tokens and growing in 128-token increments.

Figure 13.1: Prompt-cache hit/miss decision flow — an exact prefix match reads cheaply, otherwise the prefix is written to cache.

flowchart TD A[Incoming request prompt] --> B{"Prompt >= 1,024 tokens?"} B -->|No| C[No caching: process at full input price] B -->|Yes| D{"Static prefix matches a warm cache entry?"} D -->|"Exact prefix hit"| E["Cache read: ~10% of input price, TTL refreshed"] D -->|"No match / prefix differs"| F["Cache write: 1.25x-2.0x input price"] F --> G[Store computed prefix as new warm entry] E --> H[Model continues from cached representation] G --> H C --> H

The hard ordering rule: put static content first, variable content last. This is exactly the static-first prompt assembly pattern from Chapter 4 — instructions and tools before per-user context before the live turn — which turns out to also be the cache-optimal layout.

LayoutOrder of segmentsCacheable prefix
Anti-pattern"You are helping {user_name}..." → tools → instructions → user turnNearly nothing — the name in byte ~20 breaks the prefix for every user
Cache-friendlySystem instructions → tool definitions → few-shot examples → per-user memory → live user turnEverything up to per-user memory is shared and cached

A single misplaced variable — a timestamp, a session ID, a greeting with the user's first name at the top — can silently collapse your cache hit rate from 90% to near zero. Anthropic's multiple cache_control breakpoints do not increase cost; OpenAI's optional prompt_cache_key steers requests sharing a long prefix to the same warm server.

[Animation slot: interactive prompt-assembly demo — drag a "user_name" chip to the front vs. back of the prompt and watch the cacheable-prefix bar shrink or grow.]

Semantic and Response Caching

Prompt caching reuses computation for identical prefixes, but two users often ask the same question in different words — "What's your refund policy?" vs. "How do I get my money back?" A semantic cache closes that gap by comparing meaning: each query is embedded, compared against cached query vectors (usually cosine similarity), and if close enough in meaning, the cached response is served directly — no model call at all. This is a response cache.

Savings run roughly 30–70%. The open-source GPTCache (sentence-transformer embeddings + a vector DB such as Milvus, Weaviate, or FAISS) reduced API calls up to 68.8% with hit rates of 61.6–68.8%. The catch is the similarity threshold: too conservative and you miss safe reuse; too aggressive and you serve a wrong answer to a merely similar-looking query — a correctness failure worse than a cost failure. The remedy is category-aware caching: vary threshold and TTL by query category.

For a personalized assistant this is critical: semantic caching is safest for shared, non-personalized knowledge and dangerous for anything depending on a user's state. "What is my current balance?" and "What is my account balance?" are near-identical semantically but must never share a cached response. Scope semantic caches by tenant and exclude any query whose answer depends on per-user data.

Cache typeWhat it matchesWhat it reusesBest for
Prompt / context cacheExact prefixModel computation for that prefixLong static instructions, tools, retrieved docs
Semantic (response) cacheSimilar meaningThe entire prior responseShared FAQ / knowledge answers
Post-Reading Check — Caching

1. Anthropic and OpenAI implement prompt caching differently. Which pair correctly describes their activation models?

2. On Anthropic, how do cache-write and cache-read prices compare to the base input price?

3. Why does prompt-cache reuse require that static content go first in the prompt?

4. How does a semantic (response) cache differ from a prompt/context cache?

5. For a personalized assistant, when is semantic caching dangerous?

Pre-Reading Check — Rate Limits and Throughput

6. Which statement best captures the nature of provider rate limits?

7. What problem does adding jitter to exponential backoff solve?

8. When a 429 response includes a retry-after header, what should a correct backoff implementation do?

9. Why does a proactive LLM request queue need two buckets in parallel plus pre-flight token estimation?

10. In a multi-process deployment, why must distributed workers coordinate through a shared store like Redis?

Rate Limits and Throughput

Caching lowers how much you spend and how long each call takes. Rate limits govern how many calls you can make. Cross a limit and the provider rejects your request with an HTTP 429 — and in a personalized assistant under load, hitting limits is not an edge case, it is Tuesday.

Key Points

  • Rate limits are multi-dimensional: RPM, TPM, RPD, TPD — and Anthropic splits ITPM (input) and OTPM (output). Exceeding any one returns a 429.
  • A 429 often still consumes quota, and bursts can 429 you even under the per-minute ceiling (e.g., an RPM of 600 enforced as ~10/sec).
  • Exponential backoff doubles the wait after each failure; jitter randomizes it to prevent thundering-herd retry storms.
  • Always honor retry-after first, and cap backoff near 60 s because rolling windows refill in about a minute.
  • Prevent 429s proactively with a queue running parallel request and token buckets fed by pre-flight token estimation so it can never deadlock on TPM.

Token and Request Limits

A rate limit is a cap on your throughput, and the first surprise is that it is multi-dimensional: RPM (requests/min), TPM (tokens/min), RPD (requests/day), and TPD (tokens/day). Exceeding any one returns a 429. Anthropic further splits tokens into ITPM and OTPM, so a blended "TPM" can mislead you. Throughput — sustained useful work — is constrained by whichever dimension you saturate first: many tiny requests hit RPM; few huge personalized prompts hit TPM long before RPM.

Two facts sharpen this. First, a 429 failure often still consumes quota (for OpenAI, a rejected request still burned a slot and its tokens), so naive retry-immediately logic digs the hole deeper. Second, limits may be finer than "per minute": an RPM of 600 enforced as ~10 requests/second means a short burst can 429 you while technically under the per-minute ceiling.

ProviderTier 1 (entry)Top tier
OpenAI~500 RPM / 200K TPM (GPT-4o, after $5 spend)Tier 5: up to ~40M TPM / 30K RPM ($1,000+, 30+ days)
Anthropic~40K TPM (Opus) / ~80K (Sonnet) / ~100K (Haiku)Tier 4: up to ~2M TPM (Sonnet/Haiku), ~1M (Opus)

Recall the caching payoff: because Anthropic excludes cache reads from ITPM, aggressive prompt caching effectively raises your usable throughput on the input dimension without a tier upgrade.

Exponential Backoff and Retries

When a 429 arrives, wait and retry — but how long you wait determines whether you recover gracefully or trigger a cascade. Exponential backoff waits on failure and doubles the wait after each successive failure (1s, 2s, 4s, 8s...). Its flaw: if a thousand clients all fail at once and all wait exactly 1 second, they all retry at the same instant — the thundering herd. The fix is jitter: randomize each wait so retries spread out.

Two refinements separate correct from naive: (1) Honor the retry-after header (both providers return it on 429s; prefer it, fall back to computed backoff only when absent). (2) Cap the backoff near 60 seconds, because providers use rolling 60-second windows and a drained bucket refills over roughly a minute, so waiting longer buys no headroom.

Figure 13.2: Exponential-backoff-with-jitter retry loop — a 429 waits then loops back, honoring retry-after first and capping the computed backoff.

flowchart TD A[Send request] --> B{Response status?} B -->|Success| C[Return response] B -->|429| D{Attempts remaining?} D -->|No| E[Give up: raise to caller/queue] D -->|Yes| F{"retry-after header present?"} F -->|Yes| G["wait = retry-after seconds"] F -->|No| H["backoff = min(60, base * 2^attempt)"] H --> I["wait = random(0, backoff): full jitter"] G --> J[Sleep for wait] I --> J J --> A

Worked example — exponential backoff with jitter. Trace the no-retry-after path with full jitter, where backoff = min(60, base * 2**attempt) and wait = random(0, backoff):

AttemptBackoff ceilingWait drawn from
01 × 20 = 1 s[0, 1]
11 × 21 = 2 s[0, 2]
21 × 22 = 4 s[0, 4]
31 × 23 = 8 s[0, 8]
capped at 60 s[0, 60] max

Because each client draws an independent random wait, two clients that failed on the same millisecond almost certainly retry at different times — the herd disperses — and the 60 s cap ensures even a late attempt never sleeps past the point the bucket has already refilled.

[Animation slot: side-by-side simulation of 100 clients retrying — "no jitter" clusters into synchronized spikes, "full jitter" spreads smoothly across the window.]

Analogy: Exponential backoff without jitter is like a room full of people who all fall silent, then all start talking again at exactly the same second — instant chaos. Jitter is everyone silently counting to a slightly different number before speaking. And retry-after is the host announcing "give it 8 seconds" — at which point you should just listen instead of guessing.

Queuing and Concurrency Control

Retrying reactively after a 429 is damage control. The better posture is to never emit the request if it would exceed a limit. The core technique is a token bucket that refills at your permitted rate; each request removes a token, and when empty, requests wait. The essential LLM subtlety: one bucket is not enough. You need two buckets in parallel — one metering RPM, one metering TPM — and you must estimate a request's token count before sending it (via anthropic.count_tokens() or tiktoken). This pre-flight measurement prevents the worst failure mode: admitting 500 requests that each satisfy RPM but collectively blow past TPM, so none can proceed and the queue deadlocks.

ComponentPurpose
FIFO queueOrder incoming requests fairly; smooth bursts into a steady stream
Request bucket (RPM)Admit no more than N requests per rolling minute
Token bucket (TPM)Admit only if estimated tokens fit the remaining token budget
Pre-flight estimatorCount tokens (count_tokens / tiktoken) before admission
Concurrency capLimit simultaneous in-flight requests, guarding against per-second bursts

FIFO queues such as the open-source LLMRateLimiter coordinate TPM and RPM and prevent burst problems, including across distributed workers — because in a multi-process deployment, each worker enforcing its own local limit will collectively overshoot the shared account limit unless they coordinate through a shared store (commonly Redis).

Figure 13.3: Client-side request queue with parallel request and token buckets — pre-flight token estimation gates admission so RPM and TPM must both clear before a request is sent.

flowchart LR A[Incoming requests] --> B[FIFO queue] B --> C["Pre-flight estimator: count_tokens / tiktoken"] C --> D{"Request bucket: RPM slot free?"} D -->|No| B D -->|Yes| E{"Token bucket: estimated tokens fit TPM budget?"} E -->|No| B E -->|Yes| F{Concurrency cap available?} F -->|No| B F -->|Yes| G[Send request to provider]
Post-Reading Check — Rate Limits and Throughput

6. Which statement best captures the nature of provider rate limits?

7. What problem does adding jitter to exponential backoff solve?

8. When a 429 response includes a retry-after header, what should a correct backoff implementation do?

9. Why does a proactive LLM request queue need two buckets in parallel plus pre-flight token estimation?

10. In a multi-process deployment, why must distributed workers coordinate through a shared store like Redis?

Pre-Reading Check — Cost Modeling

11. Which optimization follows directly from the fact that output tokens are typically several times more expensive than input?

12. With caching in play, into which three rates does the input side of the cost formula split?

13. Why is monitoring aggregate spend (e.g., "we spent $4,200 today") described as "not actionable"?

14. What is the reliable way to ensure every request — including cron jobs and background refreshes — carries attribution metadata?

15. Where must budget/quota guardrails be enforced, and why?

Cost Modeling

You cannot control what you cannot count, and you cannot count what you cannot attribute. This section turns raw token counts into an accounting system that tells you not just how much you spent but who and what spent it.

Key Points

  • Output is the expensive term — commonly several times the input rate — so trimming output usually saves more than shrinking the prompt.
  • Caching splits input into fresh, cache-write (1.25–2.0x), and cache-read (~0.10x) rates; a long static prefix becomes cheap once warm.
  • Aggregate spend is not actionable — cost accounting is fundamentally an attribution problem.
  • Tag every request with user_id, tenant_id, feature, and environment via a mandatory thin SDK wrapper.
  • Enforce token budgets in the gateway layer before tokens are billed; for multi-tenant apps give each tenant a reserved TPM slice plus a shared burst pool.

Input vs. Output Token Pricing

The atomic unit of LLM cost is the token, and input and output are priced differently — output is almost always the expensive one, commonly several times the input rate. The base per-request formula is:

cost = (input_tokens × input_price) + (output_tokens × output_price)

Once caching is in play, the input side splits into three distinct rates:

cost = (fresh_input_tokens × input_price) + (cache_write_tokens × input_price × write_multiplier) + (cache_read_tokens × input_price × 0.10) + (output_tokens × output_price)

This decomposition explains several counterintuitive optimizations: a long static prefix is cheap once warm (its tokens shift to the 0.10x read rate), so bloating the static prefix costs far less than bloating the variable suffix; trimming output pays more than trimming input because output is the priciest term; and the cache write is a small up-front tax that breaks even almost immediately for content reused more than once or twice.

Per-User and Per-Feature Cost Accounting

The most expensive mistake in LLM operations: monitoring aggregate spend without attribution answers no actionable question. "We spent $4,200 today" tells you nothing about which user, feature, or tenant to fix. Cost accounting is fundamentally an attribution problem. The solution: pass metadata with every single API requestuser_id, and ideally tenant_id, feature, and environment. The critical word is every: cron jobs, internal tools, and background refreshes all cost money. The reliable enforcement is a thin client wrapper at the call site the whole team must use, so no raw untagged call escapes.

Why this matters for a personalized assistant: pricing-tier calibration (price a "Pro" tier only if you know what a Pro user costs), per-user quota enforcement (you cannot cap what you do not measure), and abuse detection (a user whose cost spikes becomes immediately visible).

Worked example — per-user cost accounting. Model priced at $3 / M input ($0.000003/token) and $15 / M output ($0.000015/token; output is 5x input). Cached reads cost 10% of input = $0.0000003/token. Power user Dana runs 200 turns/day; each turn = 1,500-token static prefix (cached after turn 1) + 500 fresh input + 300 output.

Turn 1 (cold cache)

ComponentTokensRate ($/token)Cost
Static prefix (cache write, 1.25x)1,5000.00000375$0.005625
Fresh input5000.000003$0.001500
Output3000.000015$0.004500
Turn 1 total$0.011625

Turns 2–200 (warm cache, ×199)

ComponentTokensRate ($/token)Cost per turn
Static prefix (cache read, 0.10x)1,5000.0000003$0.000450
Fresh input5000.000003$0.001500
Output3000.000015$0.004500
Per warm turn$0.006450

Warm turns: 199 × $0.006450 = $1.283550. Add Turn 1: Dana's daily cost ≈ $1.295. The same workload without caching bills all 1,500 prefix tokens at full rate every turn: $0.0105/turn × 200 = $2.10/day. Caching cut Dana's cost roughly 38% — and because you attributed cost per user, you can prove it, project it, and detect the day it jumps to $12 because a bad deploy disabled the cache. Note that output (300 tokens, $0.0045/warm turn) is more than input and cache combined — so a concision instruction trimming 100 output tokens saves more than heroic prompt shrinking.

[Animation slot: cost-bar breakdown that animates from "cold turn 1" to "warm turn" — the static-prefix bar collapses to ~10% while output stays the tallest bar.]

Budgets and Guardrails

Attribution tells you what happened; budgets stop the bad thing from happening. A quota is a hard cap that blocks or throttles once a user, tenant, or feature crosses a threshold. Two placement rules are non-negotiable: (1) Enforce in the proxy/gateway layer, not at the LLM call — by the call the input tokens are already sent and billed, so the guardrail must sit in middleware upstream. (2) Make token budgets primary, request-rate limits secondary — tokens reflect real cost (one long RAG query equals a thousand short chats), while request-rate limits guard against burst/concurrency abuse. You need both.

Hard caps matter most in free tiers, trials, and usage-based products. For multi-tenant assistants, enforce per-tenant quotas at the AI gateway and allocate upstream headroom explicitly: each tenant gets a reserved slice of TPM plus access to a shared burst pool, so no single tenant drains the ceiling and starves others.

LayerEnforcesPrimary signalWhy here
Gateway / middlewareToken budget per user & tenantCumulative tokens vs. budgetBlocks before tokens are billed
Gateway / middlewareRequest rate + concurrencyRequests per windowGuards against burst/abuse
Provider tierAccount-wide TPM/RPM429 responsesLast-resort ceiling you must stay under
Post-Reading Check — Cost Modeling

11. Which optimization follows directly from the fact that output tokens are typically several times more expensive than input?

12. With caching in play, into which three rates does the input side of the cost formula split?

13. Why is monitoring aggregate spend (e.g., "we spent $4,200 today") described as "not actionable"?

14. What is the reliable way to ensure every request — including cron jobs and background refreshes — carries attribution metadata?

15. Where must budget/quota guardrails be enforced, and why?

Pre-Reading Check — Observability and Optimization

16. Why is cost observability described as "continuous, not monthly"?

17. What is the single most valuable cost alert, and how is it typically configured?

18. When hunting cost hot spots, what does a low cache hit rate on a supposedly static prefix usually indicate?

19. Because LLM cost distributions are heavily skewed, how should optimization effort be prioritized?

20. In the continuous measure–detect–optimize–verify loop, why is the Verify step essential?

Observability and Optimization

Caching, rate handling, and budgets are the controls. Observability is the feedback loop that tells you whether they are working, where money is leaking, and when something just broke.

Key Points

  • Cost observability is continuous, not monthly — end-of-month reconciliation is autopsy, not medicine.
  • Capture per request: input/output/cache token counts, cost, latency, model version, and attribution metadata; then slice dashboards by user, session, feature, geography, and model.
  • Spike detection against a rolling baseline (fire at ~2x, check ~every 5 min) catches deployment-driven cost regressions in minutes.
  • Cost is heavily skewed — hunt hot spots by user, then feature-per-invocation, then diagnose input vs. output bloat, then check cache hit rate.
  • Run a perpetual measure–detect–optimize–verify loop, always tuning the biggest hot spot first and pairing cost metrics with quality evaluations.

Metrics, Dashboards, and Alerts

LLM cost monitoring is the continuous measurement, attribution, and optimization of costs from production LLM calls. "Continuous" is the operative word — end-of-month billing reconciliation is autopsy, not medicine. A production setup captures, per request: input/output/cache token counts, computed cost, latency, model version, and attribution metadata (user_id, tenant_id, feature). From these you build dashboards broken down by user, session, feature, geography, and model version.

The single most valuable alert is spike detection: compare the current period's cost to a rolling baseline (e.g., the same hour of day averaged over the past 7 days) and fire when the ratio exceeds roughly 2x, checked about every 5 minutes. This is the primary signal for catching deployment-correlated cost regressions — the ship that accidentally disabled caching, doubled the system prompt, or removed a max_tokens cap shows up within minutes rather than as a shocking invoice weeks later.

ToolShapeNotable for cost work
HeliconeOpen-source proxy gateway (one-line integration)Per-request tracking, caching, per-user/key rate limiting, cost tracking, custom tagging properties
LangfuseOpen-source tracing/eval platformCost per user/session/model; breakdowns by user, session, geography, model version
LiteLLMOpenAI-compatible multi-provider proxyWrites spend records to Postgres or any callback; centralized proxy-level control
PortkeyHostedDashboard on day one, no infrastructure to run

Note the recurring gateway pattern: the same proxy that enforces budgets and rate limits is the natural place to observe cost, because every request already flows through it.

Finding Cost Hot Spots

With attributed data flowing, hunting hot spots — the small number of users, features, or prompts responsible for a disproportionate share of spend — becomes a query rather than a guess. LLM cost distributions are typically heavily skewed. A systematic hunt asks, in order:

  1. Which users cost the most? A cost-per-user histogram reveals the heavy tail; extreme outliers are candidates for a pricing-tier change or abuse investigation.
  2. Which features cost the most per invocation? Rank features by cost — a rarely used feature with a huge per-call cost may dwarf a popular cheap one.
  3. Where is the token bloat — input or output? Output-dominated features are a concision/max_tokens opportunity; input-dominated ones are a caching or retrieval-trimming opportunity.
  4. What is the cache hit rate? A low hit rate on a supposedly static prefix points straight to a prompt-ordering bug — a variable leaked into the prefix.

Analogy: Finding cost hot spots is triage in an emergency room, not a routine checkup. You find the one bleeding out — the 2% of users or the one feature generating 60% of spend — and fix that first. Attribution lets you take the pulse of each patient instead of the room's average.

Continuous Cost Tuning

Cost control is not a project you finish; it is a loop you run. Every deployment can shift the numbers, so the optimization cadence must match the deployment cadence. The loop pulls together every lever in this chapter: Measure (attributed cost into dashboards) → Detect (spike alerts and hot-spot queries) → Optimize (apply the right lever: cacheable static prefix, semantic cache, output trimming, right-size the model, tighten budgets/quotas) → Verify (confirm the metric moved and quality did not regress).

Figure 13.4: The continuous measure–detect–optimize–verify cost-tuning loop, pairing each optimization lever with a quality check before looping back.

flowchart TD A["Measure: attributed per-request cost into dashboards"] --> B["Detect: spike alerts and hot-spot queries"] B --> C["Optimize: apply the right lever to the biggest hot spot"] C --> D["Verify: metric moved and quality did not regress?"] D -->|Yes| A D -->|"No / quality regressed"| C

Two guardrails keep the loop honest. First, every optimization is a quality bet: an aggressive semantic-cache threshold, a smaller model, or a harsh max_tokens cap can each degrade answers, so pair cost metrics with quality evaluations. Second, let attribution set priority: because cost is skewed, always tune the biggest hot spot first — a 20% cut on the feature that is 60% of your bill beats a 90% cut on one that is 2%.

Post-Reading Check — Observability and Optimization

16. Why is cost observability described as "continuous, not monthly"?

17. What is the single most valuable cost alert, and how is it typically configured?

18. When hunting cost hot spots, what does a low cache hit rate on a supposedly static prefix usually indicate?

19. Because LLM cost distributions are heavily skewed, how should optimization effort be prioritized?

20. In the continuous measure–detect–optimize–verify loop, why is the Verify step essential?

Your Progress

Answer Explanations