BLOG · #Engineering

LLM 应用的 Token 经济学

成本是 LLM 应用第一个真实的架构约束。本文从一次“改关键词却发送 6–7k token”的精确拆账出发,给出四层手段:零 token 确定性预路由、提示词分档、素材瘦身与稳定前缀、per-step 模型分档;并给出实测账本与缓存经济学的诚实结论——瘦 system 在缓存命中下省钱约等于零,真金在每轮必 miss 的素材块。

English version: The token economics of LLM applications。“LLM 应用工程”系列第 1 篇。本系列以一个生产级 AI 写作 agent(FastAPI + React + Tauri)的实现与实测数据为实证基座,讨论可迁移的工程方法。

问题:改一个关键词,为什么要付 6–7k token

做 LLM 应用,第一个逼你做架构决策的约束往往不是模型能力,而是账单。我们的项目(一个 LaTeX 实验报告写作 agent)收到过用户一句直白的质问:“为什么发送了 6k?”——他只是想改一下报告的关键词。

精确拆账(改前):

组成内容大小(约)
系统提示角色边界 + 报告规范 + 写作方法论(1948 字)+ 金样例范文(1235 字)+ LaTeX 模板规则~3k token
会话素材material 前 6000 字符——含整包实验 txt(数据矩阵、扫场参数……)~3–4k token
目标块 + 指令\keyword{...} 一行 + 修改要求~0.1k
合计~6–7k in / ~50 out

病根不在模型,在上下文组装“一刀切”:不管改什么,都把全套质量锚加全量素材塞进去。改关键词既用不上另一个实验的整篇范文,更用不上原始数据矩阵。用户随后给出的原则成了这条链路的设计纲领:“流程可以复杂,但目的是省 token。”成本优化不是砍功能,而是按“问题类型 → 最小上下文”分层。下面是落地的四层手段。

层一:零 token 确定性预路由

“这条意见想改哪里”是一个路由问题,默认做法是问模型。但相当一部分意见带有无歧义的显式目标:参考文献、摘要、关键词、“表 2”“图 3”、“§3.1”、唯一命中的节标题。这些用正则和字符串匹配即可判定(_fast_route,零 LLM、连 API key 都不需要):命中恰好一类信号 → 直接路由;出现“全文/整体”字眼、无信号或跨类信号冲突 → 保守退给 LLM 路由,绝不硬猜。

收益不止省掉一次路由调用:判定零延迟、100% 可解释(日志直接标“确定性快速判定,0 token”),且离线测试可以全速跑。这一模式在第 11 篇会作为“确定性边界”原则的一部分展开。

层二:提示词分档

系统提示里最贵的是质量锚:写作方法论加金样例范文,约 3.2k 字、折约 2k token。它们对整篇生成必不可少——项目早期曾因重构丢掉质量锚,生成深度与风格立刻塌陷——但对“改一节”“改关键词”这类小改毫无用处。

于是 build_system(scoped=True) 分出一档:段落级/元信息小改省掉质量锚,保留角色边界(禁编造)、格式规范与蒸馏判断层——片段仍须风格正确、可编译。整篇生成不走此档,质量锚照旧。每次 scoped 调用省约 2k token。分层组装的完整设计见第 2 篇

层三:素材瘦身与稳定前缀

素材层做了两件事,第二件比第一件重要。

确定性瘦身。select_material 零 token 过滤:纯数字矩阵行(裸 CSV)剔除;与目标节/意见有词面重叠的行、或“带文字标注的数据行”(如“测得 0.5 mm”)保留,封顶 2000 字。过滤有保底,绝不因过滤丢光上下文:

# 留住 ≥2 行、或 ≥40 字;否则视为过滤失败,回退开头 cap 字
return out if (len(keep) >= 2 or len(out) >= 40) else m[:cap]

整篇修订路径同理(超过 12k 字才触发、首版生成绝不过滤):自动探索曾把最多 12 万字原始文件整包回写素材,此后每轮对话/整篇改都背 40–70k token——哪怕意见只是“语气正式一点”;过滤后压到每轮 8–15k。

**稳定前缀。**深度审计给出一个诚实结论:在有前缀缓存的 provider 上,瘦 system 的直接省钱约等于零(其价值在聚焦防干扰);真金在每轮必 miss 的素材块。DeepSeek 上下文缓存全自动、命中价约为未命中的 0.8%(v4-pro:hit $0.003625/M vs miss $0.435/M,2026-07 联网核实的厂商标价)。要吃到它,素材消息必须跨轮逐字节相同——所以瘦身与逐文件摘要函数只依赖素材本身、不掺当轮反馈,产物钉为 messages[0] 固定前缀。实测输入成本约 -49%,与相关性过滤叠乘。

Anthropic 路径须显式声明缓存,TTL 是一个真实取舍:

system=[{"type": "text", "text": system,
         "cache_control": {"type": "ephemeral", "ttl": "1h"}}],

理由写在源码注释里:用户改稿是人的节奏,5 分钟 TTL 会在两轮之间过期——每轮都付缓存写入费却从不命中;1h 档写入 2× 价、读取 0.1× 价、每次命中自动续期,与人的节奏匹配。低于模型最小前缀阈值时静默不缓存,无害。实测 Claude 路径输入 -54~65%。

层四:per-step 模型分档

流水线里各步骤难度不均:探索工具循环(读文件、决定读什么)、材料体检(JSON 分类)、生成 BibTeX、英文摘要翻译是简单高频任务;撰写初稿、反思修订才需要旗舰模型。于是按步传 model:简单步走便宜档(DeepSeek V4 Flash,输入 $0.14/M、输出 $0.28/M,约 Pro 的 1/3 单价;厂商称简单 agent 任务上 Flash 与 Pro 打平、便宜约 12×——厂商口径,未独立核验),撰写/反思/出图/编译自修复留 Pro。未配置便宜档则回退主模型,零行为变化;计价按各调用的实际模型分别累加——混用两档时按总量一口价会失真。

实测账本

按“问题类型 → 最小上下文”分层后的典型输入:

问题类型系统提示素材典型 in
路由(显式目标)0(确定性直判)
路由(其余)路由器小 system~1.5–2.5k
改摘要/关键词瘦档无(发全文脉络摘要)~1.5k
改一节正文瘦档相关性过滤 ≤2000 字~2–3k
整篇重写全量(质量锚照旧)全量1 万+(该花的花)

开头的例子:改前 ~6–7k in → 改后 0(快速判定命中关键词类)+ ~1.5k in。整篇修订路径每轮 40–70k → 8–15k,再乘前缀缓存约 -49%。编译自修复也换成全新最小上下文(当前稿 + 报错节选 + 模板铁律),每轮修复省 3–5 万 token。

配套观测:每次调用经 usage_out 采真实 token(含缓存命中数),进流程日志与 trace,在 agent-lab 里能看“哪一步花了多少”。这一轮改动新增 10 个后端测试(backend 290 passed、agent-lab 15 passed)。一个反面教训:计账曾失真——成本估算不折算缓存命中,自动探索的成本显示虚高最多数倍。观测先修准,优化才不会错方向。

什么时候不要这么做

  1. **首版生成不过滤素材。**素材是唯一事实来源,宁全勿缺;相关性过滤只用于修订轮。
  2. **整篇生成不瘦 system。**质量锚是整篇深度与风格的来源,该花的花。
  3. **校验层不省。**溯源体检仍用完整素材在服务端算——省的是喂给模型的,不省校验。
  4. **名义节省 ≠ 真实节省。**缓存命中后,很多“大额优化”会缩水:探索/出图上下文分治名义省 50k+,但缓存已压掉约 90%,真实节省打 1–2 折——我们据此把它降级缓做。优化排序必须按缓存折扣后的真实数字。
  5. **观测不准先修观测。**计账不折算缓存时,最贵的路径看起来比实际更贵,会把优化力气引向错的方向。