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