开场:Token 即金钱
LLM 应用的账单上只有两个变量:输入 Token 和输出 Token。很多团队把精力全花在"模型选得多强"上,却对成本结构一无所知——直到月底账单翻倍才惊醒。
本文把"LLM 成本优化"讲透,主线一条:先懂为什么贵,再谈怎么省。从多轮对话的指数增长根因,到 KV Cache 的空间换时间,再到五层优化策略、图片计费、三层提示词优化,最后回到第一性原理。
一、为什么多轮对话越来越贵?
LLM 按输入 Token 数计费,而多轮对话有个残酷机制:每一轮,都要把所有历史记录重新发给模型。
于是出现指数增长的幻觉:第 1 轮历史 1K Token,第 10 轮历史 50K Token,第 20 轮历史 120K Token——历史越长,Token 越多,费用越高。用户聊得越久,你的成本就越高,这就是"对话通胀"。
而 KV Cache 正是为此而生:空间换时间。模型为历史前缀算好的 Key-Value 缓存住,下一轮直接复用,只有新增内容需要重算。对话轮次越多,KV Cache 节省越大——但前提是前缀必须完全一致。
二、KV Cache 与固定 System Prompt
保持 System Prompt 不变,是最简单、最有效的优化手段。前缀一旦稳定,KV Cache 命中率就高,历史部分重算归零。
一个反例要记住:把省钱的希望寄托在随机路由上,相当于靠运气省钱——既不可靠,也不专业。生产环境必须用显式缓存,而不是碰运气。
KV Cache 杀手清单
| 杀手 | 为什么致命 |
|---|---|
| 精确到秒的时间戳 | 每次前缀都不同,缓存全失效 |
| 随机 Session ID | 同上,动态内容破坏前缀稳定性 |
| 用户 ID 前缀 | 每个用户一个前缀,缓存碎片化 |
| A/B 测试变量 | 同一用户被分到不同组,缓存命中不了 |
| 随机 emoji 前缀 | 看似无害,实则每次变样 |
| 动态广告文案 | 前缀变 = 全量重算 |
🔒 原则:System Prompt = 固定前缀。 把动态内容(时间、用户信息、随机性内容)放到 User 消息里,不要放进 System Prompt。
三、五层优化策略:叠加省钱
这五层可以叠加,按优先级依次落地,效果逐层放大:
| 优先级 | 策略 | 做法 | 节省 |
|---|---|---|---|
| 1 | KV Cache + 固定 System Prompt | 历史命中缓存,重算归零 | 30–50% |
| 2 | 意图识别 → 模型路由 | 80% 简单问题用小模型,复杂的才上旗舰 | 40–60% |
| 3 | RAG 触发过滤 | 加"是否需要 RAG"判断,跳过不必要的向量检索 | 20–40% |
| 4 | 对话历史压缩(摘要策略) | 超 N 轮后,用 ~200 Token 替换 ~2000 Token 历史 | 长对话 60–80% |
| 5 | 语义缓存(Semantic Cache) | 语义相似问题复用同一回答,FAQ 不调用 LLM | FAQ 70–90% |
一个落地案例:L1 把 System Prompt 固定住(省 40%),L2 把 80% 的闲聊路由给小模型(再省 50%),L3 给每个请求加 RAG 判断,L4 长对话自动压缩,L5 给 FAQ 加语义缓存——五层叠加,整体成本可降 70–90%。这就是"节省 70-90% 的系统设计"。
四、图片 Token:像素也在烧钱
多模态模型不按"一张图"计费,而是把图片切成像素块换算成 Token。分辨率一高,账单就跟着高。
核心计费公式
Token = (h̄ × w̄) / token_pixels + 2
h̄ / w̄:缩放后的高/宽,强制对齐 32 的整数倍token_pixels:每个 Token 对应的像素数(因模型而异)
一张 4096×4096 的图,Token 数可能是 2048×2048 的 4 倍;批量上 5 张 4K,直接跳入高价档。
按任务匹配分辨率(用最低分辨率满足任务 = 最省钱)
| 任务类型 | 精度需求 | 推荐方案 |
|---|---|---|
| 粗分类(这是猫还是狗?) | 低 | 低分辨率即可 |
| 场景理解(室内还是室外?) | 中等 | 中分辨率 |
| OCR / 图表识别(文字要清晰) | 高 | 高分辨率 |
| 高精检测 / 医疗影像 | 极高 | 最高分辨率,慎批量 |
高精检测的三种方案对比
| 方案 | Token | 判断 |
|---|---|---|
| 2048×2048 | 4,098 Token | 不够 |
| 4096×4096 | 16,386 Token | ✅ 推荐 |
| 5 张 4K×4K | 81,930 Token | ⚠️ 危险 |
结论:医疗影像等场景确实需要高分辨率,但批量处理时,5 张 4K 图即跳入高价档。需要启用 vl_high_resolution_images 并严格控制批量大小。
核心原则:分辨率不是越高越好。 用最低满足任务需求的分辨率,Token 数可相差 10–100 倍。
五、语法层优化:写给机器的提示词,不要排版
格式性 Token 最高占提示词的 13–20%。记住:提示词是写给机器的指令,不是给人看的文档。那些加粗、JSON 大括号、缩进换行——都是在花钱买格式。
| 策略 | 做法 | 节省 |
|---|---|---|
| 复杂对象:YAML 代替 JSON | 用缩进代替闭合符号,信噪比更高 | 15–30% |
| 扁平列表:CSV 代替 JSON 数组 | 字段名重复 N 遍是最大浪费 | 30–60% |
| 后台输出:强制压缩 JSON | 机器读数据不需要美观,只需要合法 | 10–20% |
| 去掉 Markdown 装饰符号 | ** 加粗、### 标题占用额外 Token |
视篇幅而定 |
六、语义层优化:不要把上下文窗口当垃圾桶
信息密度越高 → 注意力越集中 → 效果越好。
为什么不能无限塞内容?
- 贵而慢:注意力复杂度 O(N²),Prompt 翻倍 → 计算翻四倍
- 效果差:模型对中间内容注意力最弱,关键信息被淹没
三个优化策略
| 策略 | 做法 | 效果 |
|---|---|---|
| 动态 Few-Shot | 用向量检索,每次只取最相关的 3 条,别硬编码案例 | 省 87.5% |
| 长文档先压缩再喂 | LLMLingua-2 过滤冗余,保留语义核心 | 压缩 5–20x |
| 关键信息放首尾 | 利用模型注意力的首尾偏好特性 | 效果显著提升 |
七、输出层优化:少输出就是省钱
输出 Token 往往比输入更贵,控制输出是直接省钱:
| 策略 | 做法 | 节省 |
|---|---|---|
| 负向约束 | 不要写"请简洁",明确说不能做什么 | 30% |
| Diff 输出 | 润色只改那几个词,不要重写整段 | 90%+ |
| 停止序列 | 用 stop 参数物理截断,比约束稳 |
精确控制 |
八、KV Cache 进阶陷阱
| 陷阱 | 现象 | 后果 |
|---|---|---|
| 动态切换工具 | 每次给模型不同的工具列表 | 前缀变了 = 全量重算 |
| 滑动窗口 | 用 FIFO 队列滚动历史 | 前缀总在变,缓存全废 |
工具列表、上下文组织方式这类"结构前缀",一旦每次不同,KV Cache 同样全部失效——稳定性不只针对 System Prompt,而是针对整个固定前缀。
九、第一性原理:AI Harness = 上下文管理
把上面所有手段抽掉表象,本质只有一件事:
一切 Harness 手段,归根到底都是为了构造更优质的上下文,让模型更准确理解你的意图。
AI Harness = 用尽一切办法,做好上下文管理。它有三个维度:
| 维度 | 含义 | 手段 |
|---|---|---|
| 质 · 质量 | 注入精准、高密度的信息 | RAG、语义压缩、Few-Shot 动态检索 |
| 构 · 结构 | 关键信息放对位置 | 关键信息放首尾、核心约束写进 System Prompt |
| 本 · 成本 | 最小 Token 最大密度 | 输出控制、KV Cache、格式选择 |
Harness:做还是不做?
值得做的 Harness:和友商拼成本、效率、效果;大模型升级后效果更好(互补);形成产品护城河;收益明确、成本可控。
可以放弃的 Harness:消耗极大资源、维护成本高;大模型升级后直接被替代;用户完全感知不到效果提升;边际收益趋近于零。
⚠️ 随着大模型升级,许多 Harness 手段会被淘汰。要时刻问自己:这件事模型版本升级后还需要吗?
结语:大道至简,上下文为王
当你不知道该怎么做时,回到原点,问自己一个问题:
「我现在给模型的上下文,是它做好这件事所需要的全部吗?」
能回答好这个问题,你就掌握了 AI Harness 的本质。成本优化的终点不是省钱,而是用最少的 Token,构造最优质的上下文——质量、结构、成本,三位一体,大道至简,上下文为王。