# LLM 应用的 Token 经济学

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

- Canonical (HTML): https://kaguc.com/blog/token-economics-zh/
- Date: 2026-07-29


*English version: [The token economics of LLM applications](/blog/token-economics/)。“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 篇](/blog/deterministic-boundary-zh/)会作为“确定性边界”原则的一部分展开。

## 层二：提示词分档

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

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

## 层三：素材瘦身与稳定前缀

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

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

```python
# 留住 ≥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 是一个真实取舍：

```python
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. **观测不准先修观测。**计账不折算缓存时，最贵的路径看起来比实际更贵，会把优化力气引向错的方向。

