Dayward AI
Week 1 · D5About 3 hours

Measuring and Tuning: the Token Bill, Context Utilization, Failure-Mode Triage, and a Comprehensive Interview Deep Dive

Fold the previous four days' techniques into one measurable loop: work out the token bill and cache hits, watch two utilization metrics, locate the problem against four failure modes, then work through a comprehensive context-engineering interview deep dive.

Today's goals 0/3

Sign in to tick these off and save your progress.

今日目标

  1. 能算出一次任务的 token 账单,并拆成写入缓存、命中缓存与新增输入三部分
  2. 能用窗口占用率与有效信息占比两个指标,定位上下文问题出在哪一块
  3. 能对照四种典型失败模式,给出一条从现象到改动的排查路径

前四天教的是手段:精简、裁剪、压缩、隔离。今天教的是什么时候用哪个手段,以及什么时候该停手。读完回来把三条目标勾掉。

小白版讲解

回程称重:账单不是最后那一次的重量

出差回来在机场称行李,秤上的数字是这一刻箱子有多重。但如果航司按「每一段航程各称一次、分别收费」来算,你真正要付的是四段航程的重量之和——而你一路上还在往里塞东西,后面那几段一定比第一段重。

模型的账单就是这么算的。很多人报成本时看的是「一次请求多少 token」,那是称重,不是账单。账单是整场会话每一轮输入的累加值,因为模型没有记忆,每一轮都要把前面全部重发一遍。

这个差别有多大?用今天实验里那个 20 轮的电商客服任务算一次:每轮的稳定前缀是 1612 token(系统提示 881 加工具定义 731),历史每轮增长约 55,工具平均每 3 轮调一次、每次约 1424。加起来是这样一张表:

组成增长方式20 轮合计
稳定前缀每轮原样重发32240
对话历史线性增长11550
工具结果阶梯增长89712
合计133502

最后一轮的单次输入是 11256 token,而整场账单是 133502——差了将近 12 倍。只报单次输入的人,会把成本低估一个数量级。

这张表还顺手回答了「该先改哪里」:工具结果占了 67%,所以先做 D3 的裁剪;前缀占 24%,所以其次做 D2 的精简;历史只占 9%,D4 的压缩排最后。四天的顺序不是按难度排的,是按这张表排的。

但这张表少算了一样东西,而它会把结论整个翻过来——缓存。下面从它开始讲。

缓存怎么改变这张账单

稳定不变的前缀可以被提示缓存命中。这件事的经济学很简单:写入缓存比原价略贵,命中缓存比原价便宜一个数量级。 常见的口径是写入按 1.25 倍计(如果要一小时的存活期则是 2 倍),命中按 0.1 倍计。

于是 20 轮的前缀开销从「20 次全价」变成「1 次 1.25 倍加 19 次 0.1 倍」:

  • 不用缓存:1612 乘以 20,等于 32240 等效 token
  • 用上缓存:1612 乘以 1.25,加上 1612 乘以 0.1 乘以 19,等于 5078 等效 token

便宜了 84%,而你一行业务代码都没改。 这也是为什么第二天要强调「按稳定程度分层、稳定的放前面」——分层不只是为了读得清楚,它直接决定了缓存前缀能有多长。

但缓存有一条门槛:前缀必须达到最小可缓存长度,否则直接不生效,而且不会报错。 这个长度按模型定,例如 Claude Sonnet 5 是 1024 token,而 Claude Opus 5 与 Fable 5.1 是 512。

现在把 D2 和 D3 的优化加上去,看会发生什么:系统提示 881 降到 425,工具从 8 个裁到 3 个、731 降到 308,前缀总长从 1612 变成 733。

733 小于 1024。缓存失效了。 前缀这一块的等效开销从 5078 涨到 14660——优化之后反而贵了将近两倍。

把三处优化全算上,总账单从 133502 降到 21620,省 83.8%;把缓存折算进来之后是从 106340 降到 21620,省 79.7%。两个数字都要报,只报前者是在粉饰。

两个利用率指标

账单告诉你花了多少,指标告诉你花得值不值。两个就够,多了没人看。

窗口占用率 = 单轮输入 token 除以窗口上限。它管的是「会不会撑爆」,也是上下文腐烂的先行指标。经验阈值:超过 50% 就该动手,不要等到接近上限。

有效信息占比 = 后续步骤真正会用到的 token 除以总 token。它管的是「值不值」。怎么量?一个可操作的近似是拿 D3 的裁剪器跑一遍,裁完还剩下的那部分就是分子

这两个指标经常不同步,而不同步的时候恰恰最危险。今天实验里那个场景:

指标优化前优化后阈值
窗口占用率5.6%0.7%超过 50% 动手
有效信息占比19.1%100%低于 20% 说明在搬运垃圾

占用率只有 5.6%,离撑爆远得很,看起来完全不用管;但有效信息占比只有 19.1%,意味着八成 token 是在给模型制造干扰,同时还在按原价计费。只盯占用率的人,会一直等到出事那天才开始优化。

四种失败模式

有了指标,排查就不用靠猜。上下文问题的表现形态基本只有四种:

模式典型现象命中的指标第一手段
塞太满漏读早期指令,违反系统提示里明写的约束窗口占用率高压缩历史、清工具结果
找不到信息就在窗口里,模型却说没有有效信息占比低裁剪工具结果、结构化返回
说不清同类问题答法不稳定,一会儿这样一会儿那样占用率不高但错误率高修系统提示的高度、合并重叠工具
越走越偏前二十轮正常,后面开始违反最初的约束压缩前后的保留检查出现 ❌加大保留轮数、把硬约束写进摘要必留段

四种里最容易被误判的是「找不到」,因为它的现象太像模型能力不足——你会想着换个更强的模型,而实际问题是那条信息被埋在十八条审计日志中间。判据是:把上下文打印出来,人肉搜一遍那条信息在不在。在,就是上下文问题,不是模型问题。

第二容易被误判的是「说不清」。它常常被归因为「模型不稳定」,但如果同一类问题的答法在两次之间摇摆,多半是系统提示里有两条规则在打架,或者两个职责重叠的工具让模型在决策点上反复横跳。去搜一遍有没有互相矛盾的规则,比换模型有用得多。

调优循环:一次只动一处

有了账单、指标和模式表,剩下的就是一个很朴素的循环:

  1. 定一批固定用例。不用多,10 到 20 条覆盖正常、边界与最长那条路径就够,但必须固定,中途换用例等于把前面的测量全作废。
  2. 测基线:跑一遍,记下账单、两个指标、以及每类失败的次数。
  3. 按模式表选一处改动,一次只动一处
  4. 用同一批用例重测,把预期变化和实际变化都记下来——尤其是不一致的那些。
  5. 不一致就回去想为什么。这一步才是学到东西的地方,跳过它这个循环就退化成了瞎调。

第四步的「实际变化」列是整张表的价值所在。今天实验的参考答案里,三条改动有一条的实际结果和预期相反:把工具从 8 个裁到 3 个,token 数确实降了,但前缀掉到最小可缓存长度以下,账单反而涨了。如果当初只盯着 token 数,这一步会被记成一次纯粹的胜利。

最后是停手判据。上下文工程是个能无限做下去的活,必须提前定好什么时候停:

  1. 有效信息占比稳定在 50% 以上,且连续三次测量没有继续上升的空间。
  2. 单轮窗口占用率在最长的那条用例上不超过 50%。
  3. 最近一次改动带来的账单降幅低于 5%。

第三条是真正的刹车:降幅低于 5% 说明剩下的都是必要开销,继续压就是在拿正确率换钱。

综合面试专题:上下文工程的题怎么答

最后收一收面试口径。上下文工程的题几乎都在考同一件事——你是把它当成一个技巧集合,还是当成一个有度量的工程问题。 三条通用的答题原则:

第一,永远先给拆解再给结论。 被问「上下文太长怎么办」,直接答「压缩」是最差的答案,因为它跳过了「先看是哪一块长」。正确的开头是把四块摆出来,说明它们的增长方式不同、要分开治,然后再说你会先动哪一块以及为什么。

第二,每个手段都要配一个代价。 裁剪的代价是可能裁掉后面才用得上的字段,所以要留取回标识;压缩的代价是丢失无标识,所以要有保留检查;子代理隔离的代价是整体 token 涨到聊天的十几倍。只说好处不说代价,一定会被追问,而且追问时你是被动的。

第三,给数字。 「工具结果通常是大头」不如「我量过一次电商客服会话,工具结果占 72.9%,而我事先猜的是对话历史」。具体数字加上一句「我猜错了」,是这类题里最有说服力的组合——它同时证明了你真的量过,以及你知道直觉在这件事上不可靠。

如果面试官继续往深处问,通常会落到这三个方向:缓存与账单的关系(今天第二节)、压缩的验证方法(D4)、以及什么时候该上多 Agent(D4,答案通常是「多数时候不该」)。这三处都有明确的数字可以引用,准备的时候优先背数字,不要背结论。

源码导读

动手实验

🧪 D5 实验:上下文调优报告

Code location: labs/context-engineering-5days/day-05-tuning-report

验收标准:

  1. 报告的六节全部填完,没有剩下的待填项。
  2. 第 1 节的剖面表四块占比之和是 100%,且能指出最大的一块是哪块。
  3. 第 2 节算出了优化前后的合计,并单独算了缓存折算后的等效前缀开销;如果前缀跨过了最小可缓存长度这条线,要写清是哪个方向。
  4. 第 4 节选定了一种失败模式,且判定依据引用了前面几节里的具体数字。
  5. 第 5 节三条改动记录里,至少有一条的实际变化与预期不一致。

第五条不是刁难。三条改动全部符合预期,通常说明你没有真的重测,而是把预期抄进了实际那一栏。这份报告的全部价值就在于它只收数字,一旦开始填感觉,它就退化成了一份周报。

  1. 把 D1、D3、D4 三个实验各跑一遍,把输出留在手边。
  2. 打开 starter 的报告模板,从第 0 节往下填,每个待填项都要能指回某一次实际运行。
  3. 第 2 节的缓存那一栏不要跳过,先查清你用的模型的最小可缓存长度,再算等效开销。
  4. 第 4 节按四种模式对照选一种,把判定依据写成「因为某个指标是多少」而不是印象。
  5. 打开 solution 对照,重点看它第 5 条改动记录里那个「指标变好、账单变差」的例子。

面试题

今天 3 道题在下方题库区,侧重 token 账单与缓存的关系、上下文利用率指标的定义、以及失败模式的排查路径。展开后先看「分析过程」再看要点——照着推导练,比背要点管用。标注「国内高频 / 海外高频」方便按目标市场取舍。

检查清单与明日预告

  • 能算出一次任务的 token 账单,并拆成写入缓存、命中缓存与新增输入三部分
  • 能用窗口占用率与有效信息占比两个指标,定位上下文问题出在哪一块
  • 能对照四种典型失败模式,给出一条从现象到改动的排查路径
  • 能解释为什么精简系统提示有可能让账单变贵,并说出三条修法
  • 实验的 5 条验收标准全部通过,包括那条「至少一条改动结果与预期不符」
  • 3 道面试题不看要点也能答出至少 2 道
  • 回头翻一遍五天的产物:剖面脚本、精简后的指令文件、裁剪器、压缩器、调优报告——它们合起来就是一份能拿出手的上下文工程作品集

这是本课的最后一天,没有明日预告,只有一句提醒:这五天教的是取舍,不是配置。 阈值、保留轮数、白名单字段这些数字,换一个项目全都要重测;能带走的是那套「先量、再按占比排序、一次只动一处、每个手段都配一个验证」的做法。

想继续往外扩,两个方向都在同一批课里:工具从哪来、怎么接得干净,看 7 天 MCP 的第 1 天;怎么把做事的经验封装成按需加载的能力包,看 7 天 Agent Skills 的第 1 天。一句话记住三门课的分工:MCP 管接线,Skills 管经验,上下文工程管取舍。

Interview questions

  • How do you compute the token bill for one agent task, and which parts can be cached away?怎么给一个 Agent 算一次任务的 token 账单?哪些部分是可以被缓存掉的?
    Common in ChinaCommon overseasDeep dive#token-accounting#prompt-caching

    How to reason about it · think before answering

    1. The first trap is the phrase one task. Many people quote a single request's input size, which is a weight reading, not a bill. Stateless models resend everything each turn, so the bill is the sum of every turn's input.
    2. Sum the four buckets by their growth patterns. The stable prefix (system prompt plus tool definitions) is resent verbatim, so multiply by turn count. History grows linearly, so it is an arithmetic series. Tool results grow in steps, so estimate calls times size. For scale: a twenty-turn support task whose final request is 11256 tokens totals 133502 across the session, nearly twelve times larger.
    3. Then caching. The cacheable part is the stable prefix, ordered tools, system, messages, where editing anything earlier invalidates everything after. Writes cost about 1.25 times base (about 2 times for a one-hour lifetime) and hits about 0.1 times, so twenty full-price prefixes become one write plus nineteen hits, an eighty percent saving.
    4. State the threshold: the prefix must reach the model's minimum cacheable length or caching silently does nothing. That produces the counterintuitive result where halving your system prompt lowers token count but raises the bill, because the prefix fell below the threshold.
    5. Expect the follow-up on whether to trim anyway. Yes, but report two numbers: the raw token reduction and the cache-adjusted effective reduction, and check whether the prefix crossed the threshold. If it did, add stable reference content back into the prefix or move to a model with a lower threshold.

    分析过程 · 先想清楚再作答

    1. 这题的第一个坑在「一次任务」四个字。很多人报的是单次请求的输入量,那是称重不是账单——模型没有记忆,每一轮都要把前面全部重发,账单是整场会话每轮输入的累加值。
    2. 怎么拆:按四块各自的增长方式分别求和。稳定前缀(系统提示加工具定义)每轮原样重发,乘轮数;对话历史线性增长,是等差数列求和;工具结果阶梯增长,按调用次数与每次体积估。举个量级:一个 20 轮的客服任务,最后一轮单次输入 11256,整场累加是 133502,差了将近 12 倍。
    3. 再谈缓存。可缓存的是稳定前缀这一段,顺序是工具定义、系统提示、消息,改前面的会让后面全部失效。经济学是写入约 1.25 倍原价(一小时存活期约 2 倍)、命中约 0.1 倍,所以 20 轮的前缀从 20 次全价变成一次写入加十九次命中,能便宜八成以上。
    4. 结论要带上那条门槛:前缀必须达到模型的最小可缓存长度才生效,达不到既不报错也不告警。这直接导致一个反直觉现象——把系统提示精简掉一半,token 数降了,账单反而可能涨,因为前缀掉到门槛以下、缓存静默失效。
    5. 可预期的追问:那还该不该精简?该,但要同时报两个数——不含缓存的 token 降幅与含缓存的等效开销降幅,并检查前缀有没有跨过门槛。跨过了就把稳定的引用内容放回前缀抬回去,或者换一个门槛更低的模型。

    Key points

    • The bill is the sum of every turn's input across the session, not the last request's size.
    • Sum by growth pattern: prefix times turns, history as an arithmetic series, tool results by call count.
    • The cacheable part is the stable prefix ordered tools, system, messages; editing earlier segments invalidates later ones.
    • Writes cost about 1.25 times base and hits about 0.1 times, but only above the model's minimum cacheable length, which fails silently.
    • So trimming can lower tokens while raising cost; always report both cached and uncached figures.

    答题要点

    • 账单是整场会话每轮输入的累加值,不是最后一次请求的输入量。
    • 按四块的增长方式分别求和:前缀乘轮数、历史等差求和、工具结果按调用次数估。
    • 可缓存的是稳定前缀,顺序是工具定义、系统提示、消息,改前面会让后面全失效。
    • 写入约 1.25 倍、命中约 0.1 倍;但前缀必须达到最小可缓存长度,否则静默失效。
    • 所以精简可能让 token 降而账单涨,必须同时报含缓存与不含缓存两个口径。
  • When context is the problem, how do you localize which of the four buckets is at fault?上下文出问题的时候,你怎么定位是四块里的哪一块?
    Common in ChinaCommon overseasIntermediate#diagnostics#metrics

    How to reason about it · think before answering

    1. This tests a diagnostic path. Answering with check the logs or try again reads as having no method; interviewers want a fixed chain from symptom to metric to change.
    2. Start with two metrics. Window occupancy is per-turn input over the window limit and governs whether you will overflow. Useful-token share is the tokens later steps actually use over total tokens and governs whether the spend is worth it. Approximate the latter with your trimmer: whatever survives trimming is the numerator.
    3. Then four failure modes with their fingerprints: overstuffed (early instructions ignored, high occupancy), buried (the fact is in the window yet the model denies it, low useful share), underspecified (answers waver across identical questions, low occupancy but high error rate), and drifting (original constraints violated late in the session, retention checks failing after compaction).
    4. Highlight the two most misdiagnosed. Buried is routinely blamed on model capability; the test is to print the context and search for the fact by hand, and if it is there the problem is context, not the model. Underspecified is blamed on instability, when it usually means contradictory rules in the system prompt or two overlapping tools making the model waver.
    5. Expect the follow-up on conflicting metrics. Low occupancy with a low useful share is the dangerous combination, because nothing looks urgent while you pay full price to move noise and dilute attention. Trust the useful-token share there.

    分析过程 · 先想清楚再作答

    1. 这题在考排查路径。答「先看日志」「多试几次」的会被判成没有方法论,面试官想听的是从现象到指标再到改动的一条固定链路。
    2. 怎么拆:先给两个指标。窗口占用率是单轮输入除以窗口上限,管的是会不会撑爆;有效信息占比是后续步骤真正用到的 token 除以总 token,管的是值不值。后者可以用裁剪器近似量:裁完还剩的那部分就是分子。
    3. 再给四种失败模式与各自的指纹:塞太满(漏读早期指令,占用率高)、找不到(信息在窗口里但模型说没有,有效信息占比低)、说不清(同类问题答法摇摆,占用率不高但错误率高)、越走越偏(跑久了违反最初约束,压缩前后的保留检查出现失败项)。
    4. 结论给最容易误判的两种。「找不到」常被误判成模型能力不足,判据是把上下文打印出来人肉搜一遍那条信息在不在——在就是上下文问题,不是模型问题。「说不清」常被误判成模型不稳定,实际多半是系统提示里有互相矛盾的规则,或者两个职责重叠的工具让模型在决策点上横跳。
    5. 可预期的追问:两个指标冲突时听谁的?答:占用率低但有效信息占比也低的情况最危险,因为看起来毫无压力却在按原价搬运垃圾,同时还在稀释注意力。这时应该以有效信息占比为准。

    Key points

    • Two metrics: occupancy for overflow risk, useful-token share for whether the spend earns its place, approximated with a trimmer.
    • Each mode has a fingerprint: occupancy for overstuffed, useful share for buried, error rate for underspecified, post-compaction retention checks for drifting.
    • Buried is most often misdiagnosed as model capability; print the context and search by hand.
    • Underspecified usually means contradictory rules or overlapping tools; hunt the contradiction rather than swapping models.

    答题要点

    • 两个指标:窗口占用率管会不会撑爆,有效信息占比管值不值,后者可用裁剪器近似量。
    • 四种模式各有指纹:塞太满看占用率、找不到看有效信息占比、说不清看错误率、越走越偏看压缩后的保留检查。
    • 找不到最容易被误判成模型能力问题,判据是把上下文打印出来人肉搜一遍。
    • 说不清多半是规则互相矛盾或工具职责重叠,去搜矛盾比换模型有用。
  • How much context engineering is enough, and how do you know when to stop?上下文工程做到什么程度算够?你怎么知道该停手了?
    Common in ChinaCommon overseasIntermediate#tuning#stopping-criteria

    How to reason about it · think before answering

    1. This is open-ended but has a clear right shape. Saying more optimization is always better reads as lacking cost awareness, because context work is unbounded and will be overdone without a stopping rule.
    2. Name the concrete cost of overdoing it rather than stopping at wasted time. Trim too hard and you cut fields needed later; compact too hard and you lose hard requirements that do not read like conclusions; cut tools too far and the agent cannot finish the task. None of these raise errors; they show up only in accuracy, the most expensive bill.
    3. Give at least three checkable stopping conditions: useful-token share stable in a healthy band such as above fifty percent with no headroom across several measurements; per-turn occupancy under fifty percent on your longest case; and the last change delivering less than a five percent bill reduction.
    4. Land on the third: a sub-five-percent gain means what remains is necessary overhead, and squeezing further trades accuracy for money. It matters most because it is the only condition that transfers across projects unchanged.
    5. Expect the follow-up on preventing regression. Freeze the measurement into a regression suite: fixed cases, rerun on every change, bill and both metrics under monitoring. Model upgrades, tool churn, and downstream field changes each degrade it again.

    分析过程 · 先想清楚再作答

    1. 这题是开放题,但它有明确的好坏。答「越优化越好」的人会被判成没有成本意识,因为上下文工程是个能无限做下去的活,不定停手判据就一定会做过头。
    2. 怎么拆:先说清过度优化的具体代价,不要停在「浪费时间」。裁得太狠会把后面才用得上的字段裁掉,压得太狠会丢掉不像结论的硬性要求,工具裁得太少会让模型没法完成任务。这些都不报错,只在正确率上体现,而正确率是最贵的一笔账。
    3. 给可核对的停手条件,至少三条:有效信息占比稳定在一个合理区间(比如 50% 以上)且连续几次测量没有上升空间;最长那条用例上的单轮窗口占用率不超过 50%;最近一次改动带来的账单降幅低于 5%。
    4. 结论落在第三条:降幅低于 5% 说明剩下的都是必要开销,继续压就是在拿正确率换钱。这条比前两条更重要,因为它是唯一一条与具体项目无关、可以直接复用的判据。
    5. 可预期的追问:那怎么保证停手之后不退化?把这套度量固化成回归:一批固定用例、每次改动都重跑、账单与两个指标进监控。上下文工程不是一次性项目,模型换代、工具增减、下游接口改字段,任何一件都会让它重新变差。

    Key points

    • Overdoing it fails silently in accuracy: fields needed later get cut, hard requirements get summarized away, and too few tools leave the task unfinishable.
    • Three stopping conditions: a stable useful-token share with no headroom, per-turn occupancy under fifty percent on the longest case, and a last change worth under five percent of the bill.
    • The third transfers best: under five percent means what remains is necessary overhead and further squeezing trades accuracy for money.
    • After stopping, freeze it into regression: fixed cases, rerun on every change, and monitor the bill plus both metrics.

    答题要点

    • 过度优化的代价不报错,只在正确率上体现:裁掉后面才用的字段、压掉不像结论的硬性要求、工具少到做不完任务。
    • 三条停手判据:有效信息占比稳定且无上升空间、最长用例的单轮占用率不超过 50%、最近一次改动账单降幅低于 5%。
    • 第三条最通用:降幅低于 5% 说明剩下的是必要开销,再压就是拿正确率换钱。
    • 停手后要固化成回归:固定用例、每次改动重跑、账单与两个指标进监控。

Comments

Sign in to join the discussion

No comments yet — be the first.