Token 黑名单 6 类 —— 哪些字符串最贵,改完砍 30%-50%
T2 写了怎么开 cache,T7 写了怎么提高命中,T9 写了 cache 失效的 4 个隐藏触发器——3 篇都在讲「怎么用 cache 省 token」。但 cache 是「省着花」,真正能砍 30%-50% 的是「别乱花」。这一篇列 6 类「看到就改」的最贵字符串:代码块、重复 base、闲聊、无结构日志、历史冗余、例子不收敛。每类配实战数据 + 改法 + 替代。
Token 黑名单 6 类 —— 哪些字符串最贵,改完砍 30%-50%
T2 写了怎么开 cache,T7 写了怎么提高命中,T9 写了 cache 失效的 4 个隐藏触发器——3 篇都在讲「怎么用 cache 省 token」。但 cache 是「省着花」,真正能砍 30%-50% 的是「别乱花」。
「别乱花」比「省着花」难 10 倍——因为它要求你看每一个字符串、识别它「值不值这个 token」。
这一篇把 14 个月里我识别出的 6 类「最贵字符串」列出来——每类配实战数据 + 改法 + 替代。黑名单就是改完直接砍 token 的清单。
6 类黑名单(按节省潜力排序)
| 排名 | 类别 | 单次浪费 | 频次 | 累计影响 |
|---|---|---|---|---|
| 1 | 代码块 | 500-3000 token | 高(每次 brief 都有) | 30% 账单 |
| 2 | 重复 base | 200-500 token | 高(每轮都重发) | 15% 账单 |
| 3 | 闲聊 / 致谢 / 道歉 | 50-200 token | 高(每轮都有) | 10% 账单 |
| 4 | 无结构日志 | 800-5000 token | 中(出错时才有) | 12% 账单 |
| 5 | 历史消息冗余 | 1000-10000 token | 中(多轮对话) | 8% 账单 |
| 6 | 例子不收敛 | 200-1000 token | 低(仅训练) | 5% 账单 |
| 合计 | — | — | ~80% 账单 |
6 类合计节省 80%——但实际可改的只有 50%-60%(前 4 类就够)。下面每类拆给你看。
① 代码块 ——「最贵的字符串」
现象:每次 brief 里塞大段代码 / JSON / YAML / log。单次浪费 500-3000 token。
实战数据:
- 5 月改《妖管局》细纲:每章 brief 平均 1500 token,其中代码块 / 例子代码占 1100 token
- 砍掉后每章 brief 400 token——砍 73%
- 5 月账单因此 -28%
最常见的 4 种代码块:
a. JSON schema(嵌在 brief 里)
# 写一个脚本,输入是这种 JSON:
{
"name": "林鹿",
"age": 25,
"occupation": "妖管局新员工",
"skills": ["见鬼", "不血统", "加班"],
"background": "..."
}
问题:JSON schema 信息密度低——每个 { " : , 都是 token。改法:用自然语言描述:
# 写一个脚本:
- 输入:人物卡,包含 名字/年龄/职业/技能/背景 5 个字段
- 林鹿 = 25 岁妖管局新员工,3 个技能,背景是农村来的
节省:JSON 250 token → 自然语言 80 token = -68%。
b. YAML config(嵌在 brief 里)
personality:
introvert: true
humor: dry
quirks:
- 喜欢用"那个"开头
- 记不住人名
- 看到猫会愣 2 秒
改法:用列表:
# 人物性格:
- 内向
- 冷幽默
- 3 个小怪癖:说话用"那个"开头、记不住人名、看到猫会愣 2 秒
节省:120 token → 60 token = -50%。
c. 长 code snippet(“参考”用的)
问题:贴 30 行示例代码希望 agent 模仿——但 agent 90% 的情况只用了前 3 行。改法:只贴前 3 行 + 「剩下照这个模式」。
节省:300 token → 50 token = -83%。
d. log 输出(“看一下哪里错了”)
问题:贴 50 行 log 找 1 行错——agent 把 50 行都读一遍。改法:只贴错误前后 5 行 + 关键 info。
节省:1500 token → 150 token = -90%。
修法总览:
| 类型 | 之前 | 之后 | 节省 |
|---|---|---|---|
| JSON schema | 自然语言 | -68% | |
| YAML config | 列表 | -50% | |
| 长 code snippet | 前 3 行 + “照模式” | -83% | |
| log 输出 | 错误前后 5 行 | -90% |
14 个月数据:代码块这一类让我砍了 30% 账单——T11 第一黑名单。
② 重复 base context ——「每轮都重发」
现象:每轮对话都重复 system prompt / few-shot 模板 / 项目背景。每轮浪费 200-500 token。
实战数据:
- 5 月我有一个 30 轮对话项目——每轮都重发 system prompt (300 token) + 角色卡 (200 token) + 项目背景 (200 token) = 700 token/轮 × 30 轮 = 21000 token 浪费
- 改用 Anthropic prompt cache(system prompt 缓存)+ 项目背景移到 user 消息最前 = 砍 90%
最常见的 3 种重复:
a. System prompt 每轮都重发
问题:Mavis / Claude API 不会自动缓存 system prompt——每条消息都重发整个 system prompt。
修法:
- Anthropic 用户:用 prompt cache 工具(system prompt 标 cacheable)
- OpenAI 用户:把不变的放 system message,开 o1-mini cache
- 其它:把”必须每轮都在”的放 system,“偶尔变”的放 user message 最前
b. 角色卡 / 人物设定 每轮都重发
问题:写《妖管局》时每轮重发”林鹿 = 25 岁妖管局新员工”——30 轮重复 30 次。
修法:
- 第一次消息里写”以下是角色卡,[全部内容]”
- 第二轮起每轮开头写”[以上角色卡保持生效]“——agent 理解
- 极致:用 cache 工具把角色卡标 cacheable
c. 项目背景 / 历史决策 每轮都重发
问题:每轮都说”我们在做《妖管局》第 X 章”——agent 已经在上下文里,重发浪费。
修法:把”我们在做 X”放在第 1 轮,后面用指代 “接着写” / “上面那一段改”。
14 个月数据:重复 base 让我砍了 15% 账单——T11 第二黑名单。
③ 闲聊 / 致谢 / 道歉 ——「无效 token」
现象:模型自动生成(或你自己写)的”好的我明白了”、“非常感谢您的建议”、“抱歉,我重新理解一下”——每轮浪费 50-200 token。
实战数据:
- 6 月我跑 50 轮对话——平均每轮 150 token 闲聊 / 致谢 / 道歉
- 把”好” / “谢谢” / “我理解” / “抱歉”全删 = 50 轮 × 150 token = 7500 token 砍掉
最常见的 5 种无效字符串:
| 字符串 | 浪费 | 修法 |
|---|---|---|
| ”好的我明白了。“ | 8 token | 删 |
| ”非常感谢您的建议。“ | 12 token | 删 |
| ”抱歉,我重新理解一下。“ | 15 token | 改成”重新理解:" |
| "我理解你的意思是…“ | 20 token | 直接回答 |
| ”希望我的回答对您有帮助。“ | 18 token | 删 |
修法总览:
- 写 system prompt 时加约束:在 system prompt 末尾加 “不要用致谢 / 道歉 / 「我理解」开头。直接回答。”
- 收到回复后裁剪:把回复前 50 字符的”好的 / 谢谢 / 抱歉”全删
- 在 Co-thinker 模式下特别严:Co-thinker 模式回复默认带”嗯 / 我觉得 / 你确定吗”——这些是反问需要的,但致谢 / 道歉仍可删
14 个月数据:闲聊类让我砍了 10% 账单——T11 第三黑名单(但这是”细水长流”型,单次小但高频)。
④ 无结构日志 ——「agent 解析不出来”
现象:贴大段纯文本 log(不 JSON、不分类、不带分隔符)——agent 既要读又要解析,单次浪费 800-5000 token。
实战数据:
- 6 月改 Discord 30 天项目时贴 1 段 log——4 万字符 raw text
- agent 解析 1.5 万 token 才找到 3 个错误
- 改成结构化 JSON 后,agent 用 200 token 定位所有错误 = 砍 98%
最常见的 2 种无结构:
a. raw text log(不分类、不带时间)
[14:23:01] 启动服务
[14:23:02] 连接数据库
[14:23:03] 错误:connection timeout
[14:23:04] 重试中
[14:23:05] 错误:connection timeout
[14:23:06] 重试中
[14:23:07] 成功
问题:人眼可读但 agent 难解析(“哪几行是错误” agent 要扫 7 行)。
修法:
[
{"t": "14:23:01", "level": "info", "msg": "启动服务"},
{"t": "14:23:03", "level": "error", "msg": "connection timeout"},
{"t": "14:23:05", "level": "error", "msg": "connection timeout"},
{"t": "14:23:07", "level": "info", "msg": "成功"}
]
节省:300 token(raw text)→ 120 token(JSON)= -60%。agent 解析更快(结构化数据 schema 内置)。
b. 嵌套打印([Class.method] [thread-1] ...)
[2026-06-15 14:23:01.123] [INFO] [main] [com.x.Service.method1] 启动
[2026-06-15 14:23:02.456] [WARN] [thread-2] [com.x.Db.connect] connection slow (1.2s)
[2026-06-15 14:23:03.789] [ERROR] [thread-2] [com.x.Db.connect] connection timeout
问题:每行带 5 段 metadata——80% 是噪音。agent 要找到错误得扫整段。
修法:只贴 ERROR 行 + ERROR 上下文(前后各 1 行)。
14 个月数据:无结构日志让我砍了 12% 账单(单次砍得多但频次低,仅”出错时”才有)。
⑤ 历史消息冗余 ——「多轮对话的循环」
现象:多轮对话每轮都重发之前的对话历史——第 10 轮时已经把第 1-9 轮重复 9 次。
实战数据:
- 5 月改怪招本 v3 跑了 50 轮对话——平均每轮 8000 token 历史冗余
- 改成”摘要”模式(第 5/10/15/20… 轮做一次摘要替换历史)= 砍 60%
最常见的 3 种冗余:
a. 完整历史每轮重发
问题:第 1 轮 2000 token 上下文,第 10 轮累计 20000 token——第 10 轮 1 条消息但带了 20000 token 历史。
修法:
- 每 5 轮做一次摘要(前 5 轮 → 200 token 摘要)
- 用 Anthropic cache:标记前 4 轮 cacheable,第 5 轮改摘要
- 用滑动窗口:只保留最近 10 轮,之前的自动摘要
b. 重复的”指令前缀”
问题:每轮都写”请用中文回答,300 字内,5 段结构”——20 轮重复 20 次。
修法:把”指令前缀”放 system prompt,永不变。每轮 user message 只写”写下一段”。
c. 重复的”输出格式”
问题:每轮都重发”输出 JSON 格式:{...}”——20 轮重复 20 次。
修法:放 system prompt,永不变。
14 个月数据:历史消息冗余让我砍了 8% 账单——T11 第五黑名单(多轮对话越长影响越大)。
⑥ 例子不收敛 ——「few-shot 越训越乱」
现象:few-shot 提示词里的例子 5 个写法都不一样——agent 学到的不是”模式”是”例子集”。
实战数据:
- 4 月我训练一个 5-例子客服 prompt——5 个例子分别是”礼貌型 / 直接型 / 学术型 / 口语型 / 段子型”
- 实际跑 1000 条请求,5 种风格随机出现——品牌一致性 38%
- 改成”5 个例子同一种风格”(学术型 5 个不同场景)= 品牌一致性 89% + 训练 token -40%
最常见的 2 种不收敛:
a. 例子风格不统一
问题:5 个例子用了 5 种不同语气——agent 学不到”什么是品牌”。
修法:所有例子同一风格(语气 / 用词 / 长度一致),只换场景。
b. 例子边界不统一
问题:5 个例子有的用了 emoji 有的没用、有的分了段有的没分、有的用列表有的用 paragraph——agent 不知道”边界在哪”。
修法:5 个例子结构完全一致(emoji / 分段 / 列表 / 长度都是 5 个统一)。
14 个月数据:例子不收敛让我砍了 5% 账单——T11 第六黑名单(仅训练场景,频次低但单次砍得多)。
6 类「看到就改」清单(汇总)
下次写 brief / 跑 agent 之前,先扫一遍这 6 条:
- ① brief 里有没有大段代码块?→ 改自然语言 / 前 3 行 / 错误前后
- ② system prompt 有没有每轮重发?→ 标 cacheable / 移到 user 最前
- ③ 输出里有没有”好的 / 谢谢 / 抱歉”?→ 加 system 约束 + 手动删
- ④ log 输出有没有无结构?→ 改 JSON / 只贴 ERROR
- ⑤ 多轮对话历史有没有冗余?→ 每 5 轮摘要 / 滑动窗口
- ⑥ few-shot 例子有没有不收敛?→ 同一风格 / 同一边界
全过 → -30% ~ -50% 账单。过 1-2 条 → -5% ~ -10%。
6 类反模式(“你以为不是黑名单,其实就是”)
跑 T11 的 14 个月里我踩过 3 个反模式——给你提个醒:
反模式 1:「系统提示词长 = 智能高」
症状:system prompt 越写越长(5000 token、10000 token)——以为”信息越多 agent 越聪明”。 真因:system prompt 越长,每轮重发越费——50 轮对话 × 10000 token = 50 万 token 在 system prompt 上。Sonnet 4.5 单价是 ¥0.021/1k token,system prompt 1 万 token × 50 轮 = ¥10.5——光 system prompt 就烧掉 ¥10。 修法:system prompt 只放”必须每轮都在”的(约束 / 角色 / 格式),“偶尔用”的放 user message 最前。
反模式 2:「few-shot 例子越多越好」
症状:few-shot 加到 10 个例子——以为”例子多 agent 学得全”。 真因:10 个例子 = 10×few-shot_token 每轮重发。5 个 vs 10 个例子准确率差别 < 3%——但成本 2 倍。 修法:3-5 个例子 + 收敛(同一风格 / 同一边界)——T11 第 6 类实战数据证明 5 个收敛例子 > 10 个发散例子。
反模式 3:「agent 报错就贴完整 log」
症状:agent 报”TypeError: x is not a function”——你贴 200 行 log 让 agent 自己看。 真因:agent 读 200 行 log = 8000-10000 token。80% 的 log 是噪音。 修法:只贴错误前后 5 行 + 关键 info——T11 第 4 类实战数据证明 -90% 账单。
5 分钟扫一遍 6 类的实操流程
写 brief 之前 / agent 跑完报账单之后,花 5 分钟扫这 6 条:
| 步 | 问自己 | 时间 |
|---|---|---|
| 1 | brief 里有大段代码块吗?(>20 行 / 1 个完整 JSON) | 30 秒 |
| 2 | system prompt 是 1 段长文还是”必须每轮在 / 偶尔用”分开? | 30 秒 |
| 3 | 最近 3 轮回复开头有没有”好的 / 谢谢 / 抱歉”? | 30 秒 |
| 4 | 我最近贴的 log 是 raw text 还是 JSON / 分级? | 1 分钟 |
| 5 | 多轮对话到第 5 轮了,做过摘要吗? | 1 分钟 |
| 6 | few-shot 例子风格统一吗?边界一致吗? | 1 分钟 |
5 分钟 = 6 个 yes/no。全 yes → 砍 30%-50% 账单。4/6 yes → 砍 20%。≤ 3/6 yes → 没改,账单照旧。
把这 6 步做成 sticky note 贴屏幕——跑 agent 之前必扫,3 周后账单自己会说话。
1 个真实小案例:5 月改《妖管局》细纲跑 T11
5 月写《妖管局》第 5-7 章时,T11 黑名单还没成文——brief 是怎么写怎么费。拿 5 月 12 日那周的数据看:
| 那天 | brief token | agent 输出 | 总 token | 浪费(按 T11 6 类估) |
|---|---|---|---|---|
| 5-12 一 | 1800 | 2400 | 4200 | 代码块 1100(26%)+ 闲聊 240(6%)= 32% |
| 5-13 二 | 1600 | 2100 | 3700 | 代码块 950(26%)+ 重复 base 400(11%)= 37% |
| 5-14 三 | 1900 | 2300 | 4200 | 代码块 1300(31%)+ log 600(14%)= 45% |
| 5-15 四 | 1500 | 1800 | 3300 | 代码块 800(24%)+ 闲聊 200(6%)= 30% |
| 5-16 五 | 2000 | 2500 | 4500 | 代码块 1400(31%)+ log 700(16%)= 47% |
| 周均 | 1760 | 2220 | 3980 | 平均 -38% |
5-17 周末我把 T11 黑名单写出来——下周一开始每条 brief 都过 6 条清单:
| 那天 | brief token | agent 输出 | 总 token | 节省(按 T11 改后) |
|---|---|---|---|---|
| 5-19 一 | 600 | 1900 | 2500 | -37% |
| 5-20 二 | 550 | 1700 | 2250 | -39% |
| 5-21 三 | 700 | 2100 | 2800 | -33% |
| 5-22 四 | 500 | 1600 | 2100 | -36% |
| 5-23 五 | 650 | 1900 | 2550 | -43% |
| 周均 | 600 | 1840 | 2440 | 平均 -38% |
5-12 那周平均 3980 token / 天 → 5-19 那周平均 2440 token / 天——日均省 1540 token。
月账单:1.2 万 token(之前)→ 0.75 万 token(改后)= -38%。
1 周改完,省整月账单——T11 黑名单值回来用 1 周的 brief 重写。
复现
# 1. 装 token 监控
mavis cron self --cron-name token-cost-monitor --every "1d" \
--prompt "扫描昨日所有 .mdx + prompt 文件,按 6 类黑名单统计浪费 token。"
# 2. 跑监控 → 出账单
python scripts/token-blacklist-audit.py \
--dir src/content/posts \
--days 30
# 输出:
# ① 代码块浪费:12000 token (28%)
# ② 重复 base 浪费:6500 token (15%)
# ③ 闲聊浪费:4200 token (10%)
# ...
# 3. 按账单 top 3 类别先改
14 个月总账单(T11 黑名单 ROI)
| 阶段 | 月均账单 | 节省 |
|---|---|---|
| 改 T11 之前 | 8.5 万 token | — |
| 砍①代码块后 | 6.0 万 token | -29% |
| 砍②重复 base 后 | 5.1 万 token | -40% |
| 砍③闲聊后 | 4.6 万 token | -46% |
| 砍④日志后 | 4.0 万 token | -53% |
| 砍⑤历史冗余后 | 3.7 万 token | -56% |
| 砍⑥例子收敛后 | 3.5 万 token | -59% |
6 类合计砍 59% 账单 = 14 个月省 ¥500+——T11 是 14 个月里”花 1 周改完,省 14 个月账单”的偏方。
关键 takeaway
- 6 类按”砍多少 × 频次”排序:①代码块 > ②重复 base > ③闲聊 > ④日志 > ⑤历史 > ⑥例子
- cache 是”省着花”,黑名单是”别乱花”——前者省 20-30%,后者省 30-50%
- 每类都有”立即可改”清单:①前 3 行 / ②cacheable / ③system 约束 / ④JSON / ⑤摘要 / ⑥同风格
- 6 类合计 -59% 账单——比 cache 还省
- “看到就改”清单比”重新设计 prompt”更高效——清单 5 分钟扫一遍,prompt 重写 1 小时
T2 开了 cache,T7 提了命中,T9 修了失效——3 篇都是「cache 层面」。T11 是「内容层面」:哪些字符串本身就不该进 prompt。这一篇和 T2/T7/T9 配套看才完整。
配套
- T2 · Claude 4 prompt cache 砍 60% 账单 — T11 是 T2 的补充
- T7 · Cache 命中率从 60% 提到 95% — 跟 T11 一起看
- T9 · Prompt cache 失效的 4 个隐藏触发器 — 跟 T11 一起看
- T10 · Mavis cron self 1 周省 4 小时 — T11 的 token-cost-monitor cron 跑的就是 T11 的审计
- D4 · 9 维度 type 选型矩阵 — 9 维度里”预算”维度跟 T11 直接挂钩
怪招本 · vol.01 · 第 T11 期