普通视图

发现新文章,点击刷新页面。
昨天 — 2026年3月30日首页

省 Token 实战手册:从提示词到架构,开发中真正有效的降本策略

2026年3月30日 22:42

上一篇已经拆解了大模型计费的底层逻辑:Token 是什么、官方如何收费,以及中转站倍率体系如何影响成本。但理解计费只是第一步,开发中更关键的问题是:知道它贵之后,如何把成本真正降下来。

需要先说明的是,本文中的案例将主要使用电商与客服场景来演示节省 Token 的方法。这样做是为了让成本结构更直观、优化路径更清晰;这些方法本身同样适用于多数具备多轮对话、工具调用、知识检索特征的 LLM 应用。

本文聚焦的问题是:在实际项目开发中,有哪些真正有效的策略可以减少 Token 消耗? 文章不会停留在“少写点字”这类笼统建议上,而是从提示词工程、上下文管理、缓存策略、模型选择、架构设计五个维度,给出可直接落地的对比案例。

每个策略都会附上"优化前 vs 优化后"的对比,让你直观看到 Token 消耗的变化。


一、提示词精简:最直接的降本入口

提示词(System Prompt + User Prompt)是每次请求都会重复发送的内容。它的冗余程度,直接决定了你的输入 Token 基线。

1. 去除冗余描述和重复指令

很多开发者习惯在系统提示词里写得非常详细,甚至同一个意思用不同方式说了两三遍。模型并不需要这种"重复强调"。

优化前(约 180 Token)

你是一个非常专业的客服助手。你的任务是帮助用户解决问题。
你需要始终保持礼貌和专业。你回答问题时要简洁明了。
请不要回答与产品无关的问题。如果用户问了与产品无关的问题,
请礼貌地告诉用户你只能回答产品相关的问题。
你应该尽量用中文回答。回答时不要太长,保持简洁。
记住,你是客服助手,不是通用聊天机器人。

优化后(约 60 Token)

角色:产品客服助手
规则:
- 仅回答产品相关问题,其余礼貌拒绝
- 中文回答,简洁专业

节省效果:约 67% 的系统提示词 Token。 如果你的应用每天处理 1 万次请求,仅这一项优化每天就能减少约 120 万输入 Token。

许多提示词中的补充性表述并不会显著提升效果。除非场景确实需要多轮强调或额外约束,否则没有必要用面向人的沟通方式去“安抚”模型;从成本控制角度看,简洁明确往往更有效。

2. 使用结构化格式代替自然语言描述

模型对结构化指令的理解能力很强。与其用长段落描述规则,不如用 YAML、Markdown 列表或 JSON 格式。

优化前(约 250 Token)

当用户询问退款政策时,你需要告诉他们:如果商品在购买后7天内
且未拆封,可以全额退款。如果商品已拆封但在7天内,可以退款
但需要扣除15%的手续费。如果超过7天但在30天内,只能换货不
能退款。超过30天则不支持任何退款或换货服务。你需要根据用户
描述的情况判断属于哪种,然后给出对应的回答。

优化后(约 100 Token)

退款政策查找表:
| 条件 | 处理方式 |
|---|---|
| ≤7天 + 未拆封 | 全额退款 |
| ≤7天 + 已拆封 | 退款扣15%手续费 |
| 8-30天 | 仅换货 |
| >30天 | 不支持 |
根据用户情况匹配对应行回复。

节省效果:约 60% Token。 而且结构化格式还能提升模型的准确率,一举两得。

3. 用变量占位代替静态长文本

如果你的提示词里有大量静态内容(如产品说明、FAQ 列表),每次都原样发送会非常浪费。

优化前:把完整 FAQ 塞进每次请求(约 2000 Token)

System: 你是XX产品客服。以下是完整FAQ:
Q1: 如何注册?A: 打开官网点击注册...(200字)
Q2: 如何修改密码?A: 进入设置页面...(150字)
Q3: 支持哪些支付方式?A: 支持微信、支付宝...(180字)
...(共20条FAQ,总计约1800 Token)
请根据以上FAQ回答用户问题。

优化后:先分类再检索,只注入相关条目(约 300 Token)

System: 你是XX产品客服。根据以下相关FAQ回答:
{retrieved_faq}
如FAQ未覆盖,回复"我需要转接人工客服为您处理"

其中 {retrieved_faq} 只包含与当前问题最相关的 1-3 条 FAQ。

节省效果:约 85% 的 FAQ 相关 Token。 这就是最基础的 RAG(检索增强生成)思路:不是把所有知识一次性塞给模型,而是只注入当前问题真正需要的内容。


二、上下文管理:控制多轮对话的隐形成本

上一篇已经提到,多轮对话中历史消息会在后续请求中被反复带入输入侧。这意味着对话越长,每一轮的输入 Token 成本就越高。

1. 滑动窗口:只保留最近 N 轮

最简单的策略是限制上下文长度,只把最近的几轮对话发给模型。

优化前:完整历史(第 10 轮时约 8000 Token 输入)

messages: [
  { role: "system", content: "..." },
  { role: "user", content: "第1轮问题" },
  { role: "assistant", content: "第1轮回答" },
  { role: "user", content: "第2轮问题" },
  { role: "assistant", content: "第2轮回答" },
  // ... 一直到第10轮
  { role: "user", content: "第10轮问题" }
]

优化后:滑动窗口保留最近 3 轮(约 2500 Token 输入)

messages: [
  { role: "system", content: "..." },
  { role: "user", content: "第8轮问题" },
  { role: "assistant", content: "第8轮回答" },
  { role: "user", content: "第9轮问题" },
  { role: "assistant", content: "第9轮回答" },
  { role: "user", content: "第10轮问题" }
]

节省效果:约 69% 的输入 Token。 对于大多数客服与问答场景,保留最近 3-5 轮通常已经足够。

2. 摘要压缩:用模型总结历史

如果业务需要更长的上下文记忆,可以用一次廉价的模型调用把历史压缩成摘要。

优化前:20 轮完整历史(约 15000 Token)

完整保留所有对话消息。

优化后:摘要 + 最近 3 轮(约 3500 Token)

messages: [
  { role: "system", content: "..." },
  { role: "system", content: "对话摘要:用户咨询了A产品的退款流程,
    已确认购买日期在7天内且未拆封,正在等待退款地址。" },
  { role: "user", content: "第18轮问题" },
  { role: "assistant", content: "第18轮回答" },
  { role: "user", content: "第19轮问题" },
  { role: "assistant", content: "第19轮回答" },
  { role: "user", content: "第20轮问题" }
]

节省效果:约 77%。 虽然生成摘要本身也会消耗 Token,但如果使用小模型(如 GPT-4o-mini)完成摘要,整体成本仍然远低于每一轮都携带完整历史。

3. 按需加载上下文而非全量注入

这是上下文管理中最容易被忽视的一点:不是所有上下文在每次请求时都需要。

优化前:每次请求都注入完整工具定义(约 3000 Token)

tools: [
  { name: "search_products", description: "...", parameters: {...} },
  { name: "check_order", description: "...", parameters: {...} },
  { name: "process_refund", description: "...", parameters: {...} },
  { name: "update_address", description: "...", parameters: {...} },
  { name: "send_email", description: "...", parameters: {...} },
  { name: "create_ticket", description: "...", parameters: {...} },
  // ... 共15个工具
]

优化后:根据意图分类,只注入相关工具(约 600 Token)

先用一次轻量分类(或规则匹配)判断用户意图,再只注入对应的工具子集:

// 用户意图: "退款"
tools: [
  { name: "check_order", description: "...", parameters: {...} },
  { name: "process_refund", description: "...", parameters: {...} }
]

节省效果:约 80%。 这一思路不只适用于工具定义,也适用于知识库片段、Schema 描述等所有“上下文素材”。


三、缓存策略:让重复内容只付一次全价

上一篇讲过,缓存命中的输入 Token 通常只按原价的 1/10 计费。所以,合理利用缓存机制是降本的重要手段。

1. 稳定前缀原则

缓存命中的前提是:请求的前缀部分和上次请求一致。所以,把不变的内容放前面,变化的内容放后面。

优化前:动态内容在前(缓存几乎无法命中)

messages: [
  { role: "user", content: "今天天气真好,我想问一下..." },
  { role: "system", content: "你是XX产品客服...(2000 Token 系统提示)" }
]

优化后:系统提示在前、动态内容在后(前缀可被缓存)

messages: [
  { role: "system", content: "你是XX产品客服...(2000 Token 系统提示)" },
  { role: "user", content: "今天天气真好,我想问一下..." }
]

节省效果: 假设系统提示 2000 Token,命中缓存后这部分从 2000 × Pin 降到 2000 × 0.1 × Pin,输入侧这部分节省 90%。

2. 批量请求共享前缀

如果你有一批类似任务(如批量翻译、批量分类),把它们组织成共享相同 system prompt 的连续请求,可以最大化缓存命中。

优化前:随机交替发送不同任务

请求1: [翻译系统提示] + 翻译任务A
请求2: [分类系统提示] + 分类任务B
请求3: [翻译系统提示] + 翻译任务C  ← 提示可能已被清出缓存
请求4: [分类系统提示] + 分类任务D  ← 提示可能已被清出缓存

优化后:同类任务集中发送

请求1: [翻译系统提示] + 翻译任务A
请求2: [翻译系统提示] + 翻译任务C  ← 缓存命中
请求3: [翻译系统提示] + 翻译任务E  ← 缓存命中
...
请求N: [分类系统提示] + 分类任务B
请求N+1: [分类系统提示] + 分类任务D  ← 缓存命中

节省效果: 如果批量处理 100 个翻译任务,系统提示为 1500 Token,那么第一个请求按原价计费,后 99 个请求命中缓存后按缓存价计费,可节省约 89% 的系统提示输入成本


四、模型选择:不是所有任务都需要最强模型

这可能是最容易被忽视、但收益最显著的策略之一:不同任务使用不同模型。

1. 任务分级路由

优化前:所有任务统一用 Claude 3.5 Sonnet

意图识别 → Claude 3.5 Sonnet($3/1M 输入,$15/1M 输出)
简单问答 → Claude 3.5 Sonnet
复杂推理 → Claude 3.5 Sonnet
文本分类 → Claude 3.5 Sonnet

优化后:按任务复杂度路由

意图识别 → GPT-4o-mini($0.15/1M 输入,$0.6/1M 输出)
简单问答 → GPT-4o-mini
复杂推理 → Claude 3.5 Sonnet
文本分类 → GPT-4o-mini

假设流量分布是:60% 简单任务 + 25% 中等任务 + 15% 复杂任务:

任务类型 流量占比 优化前单价(输出) 优化后单价(输出)
简单任务 60% $15/1M $0.6/1M
中等任务 25% $15/1M $0.6/1M
复杂任务 15% $15/1M $15/1M

加权平均输出单价:从 15/1M降到约15/1M 降到约 2.76/1M,节省约 82%。

2. Thinking 模式的精准使用

上一篇说过,thinking 模式会额外产生大量推理 Token。所以它只应该在真正需要复杂推理时开启。

优化前:所有请求都开 thinking

一个简单的格式转换任务:

输入 Token: 500
可见输出 Token: 200
thinking Token: 2000   模型"想"了很多但完全没必要
总输出计费: 2200 Token

优化后:仅对复杂推理任务开启 thinking

同一个格式转换任务:

输入 Token: 500
可见输出 Token: 200
thinking Token: 0
总输出计费: 200 Token

节省效果:输出侧 Token 减少约 91%。 对于简单任务,thinking 不仅会抬高成本,也会显著增加延迟。


五、输出控制:减少模型的"废话"

输出 Token 通常比输入贵 3-6 倍。控制输出长度是降本的高杠杆点。

1. 限定输出格式

优化前:自由格式回答(约 300 Token 输出)

User: 这个订单的状态是什么?
Assistant: 您好!感谢您的询问。我来帮您查看一下订单状态。
经过查询,您的订单号为 #12345 的订单目前处于"已发货"状态。
该订单已于2024年3月15日从我们的仓库发出,预计将在3-5个
工作日内送达。您可以使用快递单号 SF1234567890 在顺丰官网
查询物流信息。如果您还有其他问题,请随时告诉我!

优化后:要求结构化输出(约 60 Token 输出)

系统提示中增加:输出JSON格式: {status, shipped_date, tracking_no, eta}

{"status":"已发货","shipped_date":"2024-03-15",
"tracking_no":"SF1234567890","eta":"3-5工作日"}

节省效果:输出 Token 减少约 80%。 结构化输出不仅能减少 Token 消耗,也更便于程序稳定解析。

2. 设置 max_tokens 防止超长输出

即使提示词已经要求简洁,模型有时仍会"发挥过度"。设置 max_tokens 是最后一道防线。

// 分类任务:输出不应超过 20 Token
await openai.chat.completions.create({
  model: "gpt-4o-mini",
  messages: [...],
  max_tokens: 20
});

这通常不会影响模型质量——如果任务本身只需要短输出,max_tokens 只是防止回答意外拉长。


六、架构设计:从系统层面控制成本

多层架构:规则拦截 → 语义缓存 → 模型兜底

以上是单次请求层面的优化。到了系统架构层面,还有几个影响更大的设计决策。

1. 结果缓存:相同问题不重复调用

优化前:每次相同问题都调用模型

用户A问: "你们的营业时间是?" → 调用模型 → 消耗 Token
用户B问: "营业时间几点?" → 调用模型 → 消耗 Token
用户C问: "什么时候开门?" → 调用模型 → 消耗 Token

优化后:语义缓存 + TTL

用户A问: "你们的营业时间是?"
  → embedding相似度搜索 → 未命中 → 调用模型 → 缓存结果
用户B问: "营业时间几点?"
  → embedding相似度搜索 → 命中 → 直接返回缓存 → 0 Token
用户C问: "什么时候开门?"
  → embedding相似度搜索 → 命中 → 直接返回缓存 → 0 Token

节省效果: 如果 30% 的问题可以通过语义缓存命中,整体模型调用量就能直接减少 30%。而 Embedding 的成本通常远低于生成式模型调用。

2. 预处理层:能不用模型就不用模型

优化前:所有请求都进模型

"你好" → 模型处理 → "你好!有什么可以帮助您的?"
"谢谢" → 模型处理 → "不客气!还有其他问题吗?"
"#@!$%" → 模型处理 → "抱歉,我没有理解您的意思"

优化后:规则层拦截 + 模型兜底

"你好" → 规则匹配 → 固定回复(0 Token)
"谢谢" → 规则匹配 → 固定回复(0 Token)
"#@!$%" → 规则拦截 → 固定回复(0 Token)
"我想退款" → 规则未匹配 → 进入模型处理

节省效果: 实际业务中,20%-40% 的对话可以被规则层直接处理,完全不消耗模型 Token。

3. 异步批处理 vs 实时调用

如果你的任务不要求实时返回(如数据标注、内容审核、批量翻译),使用 Batch API 通常可以获得 50% 的价格折扣

调用方式 延迟 价格
实时 API 秒级 标准价格
Batch API 小时级(通常 24h 内) 标准价格的 50%

七、综合案例:一个客服系统的全链路优化

把上面的策略组合起来,看一个完整的案例。

假设一个电商客服系统:

  • 日均 10,000 次对话
  • 平均每次对话 5 轮
  • 系统提示词 2000 Token
  • 每轮用户输入约 100 Token,模型输出约 300 Token

优化前的日均成本估算

每轮输入 ≈ 2000(系统提示)+ 累积历史(平均约 1500)+ 100(用户输入)= 3600 Token
每轮输出 ≈ 300 Token
每次对话 5 轮总输入 ≈ 18,000 Token
每次对话 5 轮总输出 ≈ 1,500 Token

日均总输入 = 10,000 × 18,000 = 1.8 亿 Token
日均总输出 = 10,000 × 1,500 = 1,500 万 Token

使用 GPT-4o($2.5/1M 输入,$10/1M 输出):
日均成本 = 180 × 2.5 + 15 × 10 = $450 + $150 = $600

优化后的日均成本估算

应用以下策略组合:

  1. 提示词精简:2000 → 800 Token
  2. 滑动窗口(保留 3 轮):平均历史从 1500 降到 600 Token
  3. 缓存命中(前缀稳定):800 Token 系统提示 90% 命中缓存
  4. 模型路由:85% 简单任务用 GPT-4o-mini
  5. 输出结构化:输出从 300 降到 120 Token
  6. 规则层拦截:30% 对话不进模型
  7. 语义缓存:额外命中 15%
实际进入模型的对话 = 10,000 × (1 - 0.30 - 0.15) = 5,500 次

每轮输入 ≈ 80(未缓存提示)+ 720(缓存提示,按0.1计)+ 600 + 100 = 852 等效 Token
每轮输出 ≈ 120 Token
每次对话 5 轮总等效输入 ≈ 4,260 Token
每次对话 5 轮总输出 ≈ 600 Token

其中 85% 用 GPT-4o-mini,15% 用 GPT-4o:

mini 部分:
输入 = 5,500 × 0.85 × 4,260 = 约 2,000 万 Token × $0.15/1M = $3
输出 = 5,500 × 0.85 × 600 = 约 280 万 Token × $0.6/1M = $1.7

4o 部分:
输入 = 5,500 × 0.15 × 4,260 = 约 350 万 Token × $2.5/1M = $8.8
输出 = 5,500 × 0.15 × 600 = 约 50 万 Token × $10/1M = $5

日均总成本 ≈ $3 + $1.7 + $8.8 + $5 = $18.5

📊 优化效果汇总

  • 优化前日均成本:$600
  • 优化后日均成本:$18.5
  • 节省比例:约 97%
  • 月度节省:约 $17,445

以上数字是基于电商客服场景的理想化综合估算,实际效果仍取决于业务形态、流量结构与实现质量。但即使只达到其中一部分优化收益,节省幅度也往往足够可观。


八、策略选择优先级

不同策略的实施难度和收益差异很大。如果你不确定从哪里开始,可以参考这个优先级:

优先级 策略 实施难度 预期收益
🥇 最先做 模型路由(大小模型分流) 非常高
🥇 最先做 提示词精简
🥈 其次做 输出格式控制
🥈 其次做 缓存前缀优化 中-高
🥉 然后做 上下文滑动窗口
🥉 然后做 规则层拦截
🏅 长期建设 语义缓存 中-高
🏅 长期建设 历史摘要压缩

九、结论:省 Token 的本质是工程能力

回顾整篇文章,所有优化策略本质上都在做同一件事:

让模型只处理它真正需要处理的信息,只生成你真正需要的输出。

这不是某个神奇的参数配置,而是一整套工程实践:

  • 提示词工程解决的是"少说废话";
  • 上下文管理解决的是"别重复带货";
  • 缓存策略解决的是"重复的东西别全价付";
  • 模型路由解决的是"杀鸡别用牛刀";
  • 架构设计解决的是"能不调模型就别调"。

上一篇讨论的是“钱是如何花出去的”,这一篇讨论的是“成本如何系统地降下来”。两篇结合起来,基本可以构成对大模型成本问题的完整认知闭环。

需要强调的是:省 Token 本身不是目的,在可接受的质量前提下降低 Token 成本,才有实际意义。 任何优化都不应以明显牺牲用户体验或输出质量为代价。在推进每一项优化时,都应该同步监控质量指标,确保成本下降不是以服务质量下滑换来的。

附:一个可实际体验的中转站选择

如果你想把本文的策略(提示词精简、上下文裁剪、缓存命中、模型路由、输出控制)真正落到工程里,最有效的办法之一是找一个计费透明、统计清晰、便于切模型与观察缓存的平台,做几组小实验把“优化前 vs 优化后”的差异跑出来。

如果你最近刚好在找可用的中转站,也可以参考我朋友超哥在做的 Amux API。它更适合用来做这些验证:

  • 多模型统一接入:便于做“大小模型分流”的对比;
  • 成本与用量更直观:方便核对输入、输出、缓存命中后的计费差异;
  • 更贴近真实账单:用同一套业务请求去验证“前缀稳定”“输出变短”等策略的实际收益。

选平台时,建议仍按本文标准做取舍:不仅看倍率,也要看充值口径、缓存表现、计费透明度和稳定性。

写在最后🧪

这里是言萧凡的 AI 编程实验室。 我会在这里持续记录和分享 AI 工具、编程实践,以及那些值得沉淀下来的高效工作方法。 不只聊概念,也尽量分享能直接上手、能够复用的经验。 希望这间小小的实验室,能陪你一起探索、实践和成长。2026 年,一起进步。

昨天以前首页

从 Token 到中转站:一文讲清大模型计费、缓存与倍率

2026年3月24日 22:00

从 Token 到中转站:一文讲清大模型计费、缓存与倍率

这篇文章想回答的,其实只有一个核心问题:为什么同样是调用一次大模型,有的平台按美元计费,有的平台显示的是“点数”“余额”“倍率”,而且开启缓存、开启 thinking 之后,扣费逻辑还会明显变化?

要把这件事讲明白,最好的顺序不是直接从“中转站倍率”讲起,而是先回到最底层:Token 是什么,模型到底按什么计费。只有先把官方的计费结构看清楚,后面再理解中转站为什么要引入倍率、配额和折算系数,才不会混淆。


一、Token 的定义与基本内涵

在大模型的世界里,模型并不是按“字数”“句子数”或者“消息条数”来计费,而是按 Token 来计费。

你可以把 Token 理解为:模型处理信息时使用的最小计量单位之一。在最常见的文本场景里,它既不是严格意义上的一个汉字,也不一定等于一个英文单词,而是模型在内部切分文本后得到的一段段片段。

举个直观的例子:

  • 一段中文文本,通常会被拆成若干个 Token;
  • 一段英文文本,可能一个单词对应一个 Token,也可能一个单词被拆成多个 Token;
  • 标点、空格、换行、代码符号,很多时候也都会占用 Token。

所以,Token 更像是模型的“计算字节”。你给模型输入的内容,要先变成 Token;模型生成的回答,也会以 Token 的形式逐步输出。

这也是为什么大模型的价格表几乎都不是写“每千字多少钱”,而是写“每百万 Token 多少钱”。因为对模型厂商来说,真正稳定、可计算、可计费的单位是 Token,而不是自然语言里的“字”或“词”。

1. Token 与字数、词数的区别

Token 不是字数,而是模型处理单位

这是最容易误解的一点。

很多人会下意识地认为:

  • 中文 1 个字 = 1 个 Token;
  • 英文 1 个单词 = 1 个 Token。

但真实情况通常没有这么简单。

因为模型使用的是分词器(tokenizer)来切分内容,而不是按照自然语言语法来数数。于是:

  • 常见短词可能就是 1 个 Token;
  • 生僻词、很长的单词,可能被拆成多个 Token;
  • 数字串、URL、JSON、代码、表格,往往会产生比想象中更多的 Token;
  • 同样一段内容,在不同模型上,Token 数也可能不完全一样。

所以,Token 更准确的理解方式不是“文字长度”,而是模型内部处理内容时的离散单位

2. Token 数差异的形成原因

Token 数并不是只由“内容长度”决定,还和内容形态有关。

比如下面几类内容,通常都会让 Token 结构发生明显变化:

  • 代码:符号多、结构碎,Token 往往增长得很快;
  • 表格 / JSON:键名、标点、引号、缩进都会占用 Token;
  • 中英混合文本:切分粒度更复杂;
  • 长上下文对话:历史消息会被反复带入输入侧;
  • 工具调用 / 函数调用描述:参数定义、schema、返回结构也都要算 Token。

这也是为什么很多人实际使用时会发现:看起来字数不多,但账单并不低。因为模型看到的不是“字数”,而是经过切分后的 Token 序列。

3. 多模态场景下 Token 的扩展含义

当模型进入多模态场景之后,Token 的概念并没有消失,只是它不再只对应“文本片段”。

更准确地说:多模态模型会把图片、音频、视频等输入,先转换成模型可以处理的内部表示,再映射到可计费的 Token 或 Token 等价单位。

因此,多模态里的 Token 可以粗略分成几类理解:

  • 文本 Token:提示词、系统消息、OCR 文本、工具返回文本;
  • 图像 Token:图片经过切块、缩放、编码后形成的视觉计算单位;
  • 音频 Token:音频片段经过声学编码后形成的时间序列单位;
  • 视频 Token:通常是“抽帧后的图像单位 + 音频单位 + 可能的文本上下文”的综合消耗。

这里最关键的一点是:多模态并不是不按 Token 计费,而是把非文本信息也折算成了模型可处理的 Token 结构。

4. 图像 Token 的常见计量方式

图片 Token 的计算方式,不同厂商差异很大,但底层思路通常相似:

先把图片标准化,再按视觉块(patch / tile / region)或分辨率等级折算成若干视觉 Token。

常见的影响因素包括:

  • 图片分辨率;
  • 图片是否会被缩放;
  • 是低清模式还是高精细模式;
  • 是否需要 OCR、表格理解、图表理解;
  • 厂商是否按固定档位计费,而不是按原始像素逐点计费。

所以在很多视觉模型里,并不存在一个简单通用的公式说“1 张图 = 固定多少 Token”。更常见的情况是:

  • 一张小图,可能被折算成较少的视觉 Token;
  • 一张高分辨率图片,可能会先缩放后再按块计费;
  • 同一张图在 low detailhigh detail 模式下,Token 消耗可能差很多。

也就是说,图片真正影响的不是‘张数’,而是图片经过模型预处理之后,需要多少视觉计算单元。

5. 音频 Token 的常见计量方式

音频场景和图片类似,也不是简单按“文件个数”收费,而更接近按时间长度 × 编码粒度来折算。

常见逻辑是:

  • 音频会被切成连续的小时间片;
  • 每个时间片会被编码成模型可处理的声学表示;
  • 最终再转换成音频 Token 或等价计费单位。

所以音频成本通常主要受这些因素影响:

  • 音频时长;
  • 采样率和编码方式;
  • 是否要做实时处理;
  • 是否同时输出逐字转写、说话人分离、时间戳等增强结果。

很多时候你看到“语音模型更贵”或“实时语音特别耗费”,本质上并不是平台在乱加价,而是模型需要持续处理高密度时间序列数据。

6. 视频 Token 的计量复杂性

视频往往是多模态里最复杂的一种,因为它通常不是单一输入,而是三部分叠加:

  • 帧图像;
  • 音频轨道;
  • 提示词 / 上下文文本。

所以一个视频请求的消耗,很多时候可以近似理解为:

视频成本 ≈ 抽帧后的图像成本 + 音频成本 + 文本上下文成本

如果平台对视频做的是“定时抽帧”而不是逐帧分析,那么成本会和:

  • 视频时长;
  • 每秒抽多少帧;
  • 每帧按什么分辨率处理;
  • 是否同步分析音轨;

直接相关。

因此,视频不是“一个文件一次计费”这么简单,而是一个组合型的 Token 消耗体。

7. 多模态 Token 难以横向比较的原因

到了多模态阶段,Token 更不能简单横向比较了。原因在于:

  • 不同厂商的视觉编码方式不同;
  • 不同模型的预处理策略不同;
  • 有的平台按 patch 数计,有的平台按档位计;
  • 有的平台会把图片 / 音频先折算成文本等价 Token,再统一结算;
  • 有的平台则直接给出独立的 image/audio pricing。

所以,当你看多模态价格表时,最稳妥的理解方式不是强行追问“1 张图到底等于多少 Token”,而是先看厂商到底公布的是哪一种计费口径:

  • 文本 Token 单价;
  • 图像输入单价;
  • 音频输入 / 输出单价;
  • 视频或实时流式单价;
  • 是否存在 detail mode、cache、reasoning 等附加维度。

8. 面向用户的实用理解框架

如果只想留下一句最实用的话,那么可以这样记:

文本模型里的 Token,是文本被切分后的处理单位;多模态模型里的 Token,则是文本、图像、音频、视频等信息被模型编码后形成的统一计算单位或等价计费单位。

所以,无论是纯文本还是多模态,厂商真正计费的都不是“你发了几句话、几张图、几个文件”,而是:模型为了理解这些输入、并生成输出,实际消耗了多少可计算的内部单位。


二、大模型采用 Token 计费的原因

从厂商视角看,Token 是最适合做计费单位的,因为它直接对应了模型推理时的实际消耗。

一次调用模型,至少会发生两件事:

  1. 模型读取你输入的内容;
  2. 模型生成它输出的内容。

这两部分都会消耗算力,因此绝大多数模型厂商都会把账单拆成两类:

  • 输入 Token(Input Tokens):你发给模型的内容;
  • 输出 Token(Output Tokens):模型返回给你的内容。

于是,最基础的计费逻辑就成立了:

Cost = 输入成本 + 输出成本

进一步写成标准公式,就是:

Cost = Tin / 1,000,000 × Pin + Tout / 1,000,000 × Pout

其中:

  • Tin:输入 Token 数量
  • Tout:输出 Token 数量
  • Pin:输入单价(每百万 Token)
  • Pout:输出单价(每百万 Token)

这就是大模型最原始、最通用的官方计费框架。


三、大模型计费规则的基本结构

理解计费时,有三个结论必须先记住。

1. 输入与输出价格的差异

大多数厂商都会把输入价格和输出价格分开,而且输出往往比输入更贵。原因很简单:生成内容比单纯读取内容更消耗推理资源。

所以,同样是 1 万个 Token:

  • 如果它们主要出现在输入侧,费用可能较低;
  • 如果它们主要出现在输出侧,费用通常更高。

这也是为什么很多人会误以为“我明明只问了一个简单问题,为什么扣费不低”——因为真正贵的,可能不是你发出去的那段提示词,而是模型生成出来的大段回答。

2. 计费依据是 Token 数而非消息条数

不是说你只发了一条消息,费用就一定低;也不是说多轮对话就一定更贵。真正决定成本的,是每一轮累计消耗了多少 Token。

如果你的提示词很长、上下文很多、模型输出很长,那么哪怕只调用一次,也可能比多轮短对话更贵。

3. 历史上下文对输入成本的影响

在多轮对话中,模型并不是“记住了你上一次说过的话”这么简单。更准确地说,系统通常会把前面的消息重新整理后再传给模型,于是这些历史内容也会继续占用输入 Token。

因此,对话越长,上下文越大,输入成本往往也会越来越高。这也是后面谈缓存和中转站时必须关注的前提。


四、缓存机制下的计费变化

当模型厂商支持缓存之后,输入侧就不再只有一种价格了。

缓存的核心思路是:如果你每次请求里都有一大段重复的前缀内容,比如系统提示词、固定知识库上下文、工具定义、统一模板等,那么这些内容没必要每次都按完整成本重复处理。于是厂商会把其中命中的部分,按更低的价格计费。

这时,输入 Token 通常要拆成两部分:

  • 未命中缓存的输入 Token
  • 命中缓存的输入 Token

对应的公式也会变成:

Cost = Tuncached / 1,000,000 × Pin
     + Tcached / 1,000,000 × Pcache
     + Tout / 1,000,000 × Pout

其中:

  • Tuncached:未命中缓存的输入 Token
  • Tcached:命中缓存的输入 Token
  • Pcache:缓存命中部分的输入单价

这里最重要的一点是:缓存优化的是输入侧成本,不是整次请求的全部成本

也就是说:

  • 命中缓存的输入会变便宜;
  • 没命中的输入仍按原价计算;
  • 输出 Token 依然按输出价格计算。

所以,缓存命中不等于“这次调用几乎不要钱”,它只是让重复输入这部分更便宜了。


五、Thinking / Reasoning 模式下的成本变化

除了缓存,另一个经常让人困惑的变量,是 thinking / reasoning 模式。

它本质上意味着:模型在输出最终答案之前,可能会先生成一部分用于推理、规划、分析的中间 Token。这些 Token 有时对用户可见,有时部分可见,有时只体现在统计口径里,但它们通常都会带来额外成本。

因此,thinking 模式和普通模式的差别,可以先粗略理解为:

普通模式:

Cost_normal = 输入成本 + 输出成本 + 缓存相关成本

thinking 模式:

Cost_thinking = 输入成本 + 输出成本 + 缓存相关成本 + 思考 Token 成本

更直白地说,thinking 模式之所以更贵,往往不是因为“模型换了一套完全不同的收费体系”,而是因为它在原本的输入/输出结构之外,又额外产生了更多需要计费的 Token。

在实际产品里,这些思考 Token 往往更接近输出侧开销;而在多轮对话中,如果上一轮的思考内容被完整回传到下一轮,它又可能再次进入输入侧成本。

所以,thinking 模式的本质不是“神秘加价”,而是 Token 结构更复杂了


六、官方计费结构的核心要点

到这里,其实可以先把官方计费逻辑浓缩成一句最实用的话:

大模型官方计费,本质上就是在计算三类东西:未缓存输入、缓存命中输入、输出;如果开启 thinking,再额外考虑思考 Token 带来的成本。

也就是说,官方世界关心的核心变量始终是:

  • 输入多少;
  • 其中多少命中了缓存;
  • 输出多少;
  • thinking 额外增加了多少 Token。

只要这一层搞清楚,后面看中转站的“倍率”“点数”“配额”,就会顺很多。因为中转站并没有发明一套脱离官方规则的物理定律,它只是把这些官方成本,重新包装成了自己的结算体系。


七、中转站的角色与功能定位

讲完 Token 和官方计费,再来看“中转站”就容易多了。

所谓中转站,通常可以理解为:位于用户和上游模型厂商之间的一层聚合与转发服务

它一般会做几类事情:

  • 统一接入不同模型厂商的接口;
  • 提供兼容层,让不同模型尽量用相似的调用方式访问;
  • 管理密钥、额度、分组、渠道、限流、日志等运营能力;
  • 把上游按美元或人民币计费的模型成本,转换成平台自己的余额、点数或配额系统。

所以,中转站并不等于模型本身,它更像是一个“流量分发与结算层”。

从用户角度看,中转站的价值往往在于:

  • 可以在一个面板里切换多个模型;
  • 可以用更统一的方式管理不同渠道;
  • 可以把费用、倍率、权限、配额统一配置。

但也正因为它处于“中间层”,所以它展示出来的扣费方式,未必和上游厂商价格表一模一样。


八、中转站倍率机制的来源

很多人第一次看中转站面板时,最困惑的并不是价格本身,而是“倍率”这个概念。

因为在 OpenAI、Anthropic、Google 这类上游厂商的价格页里,更常见的是:

  • Input
  • Cached input / Cache read
  • Output
  • Reasoning / thinking 相关统计

它们描述的,本质上都是每百万 Token 的官方单价

而到了中转站里,界面语言往往会变成:

  • 模型倍率
  • 分组倍率
  • 补全倍率
  • 缓存倍率
  • 扣费倍率

这说明一件事:倍率通常不是上游厂商的原生计费单位,而是中转站为了把官方成本折算成平台内部余额、点数或配额,而人为引入的一层结算抽象。

说得更直接一点:

官方世界在算货币成本,中转站世界在算平台额度;倍率,就是连接这两套计量体系的换算系数。

因此,中转站并不是创造了一套脱离官方价格的全新物理定律,而是把官方的输入、缓存输入、输出、thinking 成本,重新包装成了自己的扣费语言。


九、倍率机制的折算逻辑

如果再往深一层看,所谓“倍率”,本质上是在回答下面这个问题:

同样消耗 1 个 Token,不同模型、不同渠道、不同用户组,应该从平台余额里扣掉多少“内部单位”?

于是,中转站通常不会直接把“美元价格”原样展示给用户,而是会先选定一个内部计费基准,再把不同成本映射进去。

你可以把它理解成下面这种抽象:

平台内部单价 = 官方单价 × 平台折算系数

如果进一步写成输入 / 输出分离的形式,就是:

内部输入单价 = 官方输入单价 × 折算系数
内部输出单价 = 官方输出单价 × 折算系数

但很多中转站并不直接展示“内部输入单价”和“内部输出单价”,而是把它继续拆成几个更方便运营配置的变量:

  • 模型倍率:决定这个模型整体贵不贵;
  • 补全倍率:决定输出 Token 按输入 Token 的多少倍折算;
  • 分组倍率:决定不同用户等级是否加价或打折;
  • 缓存倍率:决定缓存命中的输入是否按更低权重结算。

所以,倍率真正折算的并不是一个抽象标签,而是不同 Token 类型在平台内部的结算权重


十、同一模型倍率差异的形成原因

很多人看到某个平台的 GPT-4o 倍率是 10,另一个平台是 3,第一反应是“前者更贵”。但这其实未必成立。

因为倍率本身不是统一货币单位,它至少会受到四层因素共同影响。

1. 渠道来源差异

同样是某个模型,平台接入的可能是:

  • 官方直连渠道;
  • Azure / AWS / GCP 等云渠道;
  • 区域代理或企业采购渠道;
  • 非官方逆向或代充渠道。

这些渠道的真实成本、稳定性和可持续性都不一样,因此倍率自然不会一样。

2. 服务质量差异

有些平台卖的不只是“能不能调用”,还包括:

  • 更高的并发上限;
  • 更稳定的可用性;
  • 更低的延迟;
  • 更少的限流和封禁风险。

于是你看到某些模型后面带 -official-fast-stable 之类的标记,本质上往往是在告诉你:这不仅是模型名差异,更是服务等级差异。 服务质量越高,倍率通常也越高。

3. 平台定价策略差异

中转站不是单纯的“成本搬运工”,它还会做运营策略:

  • 对热门模型加价;
  • 对新模型补贴引流;
  • 用低倍率吸引注册;
  • 用高倍率覆盖售后、风控、坏账和带宽成本。

因此,倍率里通常不只有“技术成本”,还包含平台自己的商业策略。

4. 充值汇率与货币结算差异

如果平台是人民币充值、美元成本,那么它还要处理:

  • 汇率波动;
  • 支付手续费;
  • 提现或结算风险;
  • 余额单位与真实货币之间的映射关系。

这就是为什么有些平台会出现一种表面上看起来很奇怪的现象:

充值 1 元,却给你记 1 美元口径的余额;为了把这个差额补回来,就会把模型倍率整体抬高。

所以,倍率不是纯技术参数,而是“上游成本 + 服务质量 + 运营策略 + 货币体系”共同叠加后的结果。


十一、中转站倍率体系的主要类型

这一节最容易混淆的地方在于:补全倍率、缓存倍率,和分组倍率并不是同一个层级的概念。

很多中转站会把这些词都统一写成“倍率”,再配合站内余额、点数、额度这些内部单位一起展示,于是用户很容易误以为:它们全都是平台自己发明出来的收费规则。

但更准确地说,这里至少要分成两层:

  • 上游大模型原生计费维度:Input、Output、Cache;
  • 中转站平台运营维度:模型倍率、分组倍率、余额折算。

也就是说,补全和缓存首先是上游模型本身就存在的计费方式;而分组倍率,才是平台为了统一调价而额外叠加的一层运营参数。

1. 上游原生计费项:输入、补全、缓存

先把最底层说清楚。

对绝大多数主流大模型来说,官方计费本来就会区分:

  • 输入(Input):你发给模型的 Token;
  • 补全 / 输出(Completion / Output):模型生成给你的 Token;
  • 缓存(Cache):命中缓存的输入 Token,按更低价格计费。

所以,很多中转站面板里所谓的“补全倍率”“缓存倍率”,本质上并不是平台凭空创造出来的新概念,而是在映射上游 input / output / cache 的价格差异

换句话说:

  • 输入就是大模型官方的 input;
  • 补全就是大模型官方的 output;
  • 缓存就是命中缓存后的 input 计费口径。

在绝大多数模型里,缓存命中通常大约按普通输入价格的 1/10 结算;但也有少数模型会进一步细分成:

  • **缓存写入(cache write)**价格;
  • **缓存读取(cache read)**价格。

因此,如果一个中转站把“补全倍率”“缓存倍率”单独拿出来强调,很多时候它讲的并不是站内独创规则,而只是把上游大模型原本就有的计费结构,用站内配额语言重新包装了一遍。

2. 模型倍率:把上游成本折算成站内单位

真正进入中转站自己的体系后,才会出现“模型倍率”这类平台侧参数。

模型倍率决定的是:同样一组 input / output / cache 消耗,在这个站里最终按多高的站内权重结算。

它本质上承接的是:

  • 上游真实采购成本;
  • 站内余额单位被放大或缩小后的折算关系;
  • 平台自己的利润、汇率和风控策略。

这也是为什么很多中转站会先把站内金额单位调大,再在倍率层面做文章。表面上看倍率很多、结构很复杂,但其中有一部分其实只是把上游官方成本重新折算成站内内部单位

所以,模型倍率更接近平台折算系数,而不是上游模型的原生价格字段。

3. 分组倍率:给一组统一调倍率

分组倍率的定位要单独拎出来,因为它和补全、缓存不是一个概念。

分组倍率决定的是:平台要不要对某一组用户、某一类套餐、某一个渠道分组做统一加价或打折。

例如:

  • 普通用户组:1.0
  • VIP 用户组:0.8
  • 企业用户组:0.95

这类倍率并不对应 input、output 或 cache 的物理成本差异,而是平台运营层面对一整组流量做统一调整。

所以它的本质不是“模型怎么收费”,而是:平台准备让哪一组用户按什么系数结算。

4. 更准确的理解方式:先分层,再看扣费

如果把这些概念放在一起看,更准确的理解顺序应该是:

  1. 先看上游模型怎么收费:input、output、cache,必要时再看 cache read / cache write;
  2. 再看中转站怎么折算:是否放大了站内金额单位,是否设置了模型倍率;
  3. 最后看平台怎么统一调价:是否对某个分组额外乘上分组倍率。

一句话总结就是:

补全和缓存,首先是上游大模型的计费维度;模型倍率和分组倍率,才是中转站在这些上游成本之上额外叠加的站内折算与运营参数。

十二、中转站扣费公式的完整表达

有了上面的定义后,就可以把中转站的扣费逻辑写得更完整。

1. 基础输入输出计费公式

如果先不考虑缓存和 thinking,只保留最常见的输入/输出结构,那么可以写成:

Quota_basic = (Tin + Tout × Rout) × Rmodel × Rgroup

其中:

  • Tin:输入 Token
  • Tout:输出 Token
  • Rout:补全倍率 / 输出倍率
  • Rmodel:模型倍率
  • Rgroup:分组倍率

这正对应很多 OneAPI / NewAPI 系统里最常见的基础扣费表达。

2. 纳入缓存后的计费公式

如果平台支持缓存命中折算,那么更准确的形式应该写成:

Quota_cache = (Tuncached + Tcached × Rcache + Tout × Rout) × Rmodel × Rgroup

其中:

  • Tuncached:未命中缓存的输入 Token
  • Tcached:命中缓存的输入 Token
  • Rcache:缓存倍率

这条公式比“输入 + 输出 × 补全倍率”更完整,因为它能解释:为什么同样是 10 万输入 Token,有的人扣得很多,有的人扣得很少——差别往往就在缓存命中率。

3. 纳入 Thinking 的计费公式

如果模型开启了 thinking / reasoning,那么输出侧通常还会多出一部分推理 Token,于是可以进一步写成:

Quota_thinking = (Tuncached + Tcached × Rcache + (Tvisible + Tthink) × Rout) × Rmodel × Rgroup

其中:

  • Tvisible:用户可见输出 Token
  • Tthink:thinking / reasoning 额外产生的 Token

这条式子能够解释一个很常见的现象:

为什么有些问题看起来不复杂,但一开 reasoning,平台消耗会立刻明显上升。

因为从平台视角看,它并不关心这些 Token 是“用户看见的回答”还是“模型内部思考过程”,只要上游按 Token 收费,平台就必须把它折算进去。


十三、仅比较倍率数字的局限性

这一点其实是中转站里最容易踩坑的地方。

很多用户会把不同平台的倍率数字直接横向比较,比如:

  • A 站某模型倍率 = 1
  • B 站某模型倍率 = 10

于是就得出“B 站贵了 10 倍”的结论。

但这个结论常常并不成立,因为你忽略了另一个变量:平台余额单位本身是什么。

真正应该比较的,不是“倍率的绝对值”,而是单位 Token 最终折合成了多少真实货币成本

可以把它抽象成:

实际输入单价 ≈ 余额单位价值 × Rmodel × Rgroup
实际输出单价 ≈ 余额单位价值 × Rout × Rmodel × Rgroup

如果再把充值口径算进去,那么跨平台比较时,更接近现实的判断方式是:

实际人民币成本 ≈ 充值汇率 × 平台倍率体系 × Token 消耗结构

这也就是为什么会出现这样一种情况:

  • 平台 A 的倍率数字小;
  • 但平台 A 的“每 1 元可兑换余额”也更少;
  • 最终折算下来,反而并不便宜。

4. 缓存率对跨平台比较的影响

很多人在跨平台比较价格时,还会漏掉一个非常关键的变量:缓存率(或缓存命中率)

因为平台展示给你的往往只是:

  • 充值汇率;
  • 倍率;
  • 标称 Token 额度。

但你真正“花出去”的有效成本,还取决于请求里有多少输入命中了缓存。

在编程场景里,如果是固定账号持续使用,例如自己用 Max 或稳定拼车,常见会出现 90% ~ 95% 的输入 Token 走缓存。换句话说,缓存 Token 数可能达到写入 Token 数的 10 ~ 20 倍。这时,实际费用往往不会等于“全部按普通输入 Token 原价结算”,而更接近 按标称 Token 价格的 80% ~ 85% 来理解。

反过来说,如果某个中转站表面倍率不高、兑换比例也不差,但因为号池轮询、账号频繁切换或缓存技术做得一般,导致你的缓存率明显偏低,那么你的实际单位成本就会上升。于是就会出现一种常见感受:

不是平台给的 Token 数是假的,而是因为缓存率低,同样的 Token 更“不抗用”。

从实践上看,可以把常见模式粗略分成三类:

  • 固定账号 / 固定会话型:缓存率理论上最接近官方,适合长期连续编程。
  • 按次数限额型产品:例如部分 IDE / 工具订阅,通常不展示缓存 Token,也就很难直接谈缓存率。
  • 号池轮询反代型:用户缓存率波动最大,是否能做到 80% 以上,很大程度取决于中转站自己的缓存与路由技术。

所以,跨平台比较时,更接近真实的判断方式应该是:

实际人民币成本 ≈ 充值汇率 × 平台倍率体系 × Token 消耗结构 × 缓存率修正

或者换句话说:

比较价格,不能只看“¥多少 = $1” 或倍率数字,还要看这个平台能不能把你的高重复上下文真正缓存住。

所以,倍率只能在同一平台内部比较模型相对贵贱,不能脱离充值规则和缓存率去跨平台直接比较。


十四、官方成本与平台配额的对照示例

假设某次请求中:

  • 未缓存输入 Tuncached = 20,000
  • 缓存输入 Tcached = 80,000
  • 可见输出 Tvisible = 5,000
  • thinking Token Tthink = 3,000

再假设上游官方价格是:

  • 输入 Pin = 2.50 / 1M
  • 缓存输入 Pcache = 0.25 / 1M
  • 输出 Pout = 15 / 1M

那么按官方计费估算:

Cost = 20000/1,000,000 × 2.50
     + 80000/1,000,000 × 0.25
     + (5000 + 3000)/1,000,000 × 15

计算后得到:

Cost = 0.05 + 0.02 + 0.12 = 0.19 美元

现在假设某个中转站进一步定义:

  • Rcache = 0.1
  • Rout = 6
  • Rmodel = 1.2
  • Rgroup = 1

那么它的配额消耗就可能写成:

Quota = (20000 + 80000 × 0.1 + (5000 + 3000) × 6) × 1.2
      = (20000 + 8000 + 48000) × 1.2
      = 76000 × 1.2
      = 91200

这时你在平台面板里看到的,可能就不是“0.19 美元”,而是“扣除了 91200 点额度”。

单位虽然变了,但底层逻辑没有变:

  • 官方在算货币成本;
  • 中转站在算平台额度;
  • 倍率就是两者之间的折算桥梁。

十五、倍率体系的可靠性判断

如果把“怎么理解倍率”进一步落到实践层面,那么判断一个平台是否靠谱,至少要看三件事。

1. 是否对应官方成本结构

一个靠谱的平台,哪怕不用“美元单价”直接展示,也至少应该能让你看出:

  • 输入怎么算;
  • 输出怎么算;
  • 缓存是否单独折算;
  • thinking 是否有额外消耗。

如果这些都说不清,只给一个笼统倍率数字,那透明度通常不够。

2. 是否公开模型计费明细

正规的中转站,通常会公开:

  • 模型倍率;
  • 补全倍率;
  • 分组倍率;
  • 余额兑换关系;
  • 渠道说明或模型说明。

如果平台只有一个模糊的“倍率很低”,却没有明细页、模型页或计费页,那么风险通常更高。

3. 低价是否具备合理性

如果某个平台价格长期明显低于官方理论成本,就要提高警惕。因为这往往意味着它可能依赖:

  • 逆向网页接口;
  • 不稳定代充渠道;
  • 混合池或不透明转发;
  • 随时可能失效的临时资源。

这种平台也许适合测试或体验,但未必适合生产环境。


十六、常见误区辨析

为了避免混淆,最后把几个最常见的误区集中说清楚。

1. 缓存命中并不意味着整体成本显著下降

缓存只会降低命中的输入部分,不会把未命中的输入和输出一起变便宜。真正昂贵的部分,很多时候依然是输出和 reasoning。

2. 补全倍率并非任意设定的参数

它通常对应的是官方“输出比输入更贵”的现实,只不过平台把这种差异,用一个更容易运营配置的比例表达出来。

3. Thinking 并非凭空增加的收费项

thinking 本质上仍然是 Token 消耗,只不过这些 Token 来自模型的推理过程,因此会额外抬高输出侧成本。

4. 同名模型倍率差异不必然意味着不合理收费

也可能是渠道不同、QoS 不同、汇率不同、补贴策略不同。倍率差异本身并不自动等于平台不正规。

5. 跨平台比较不能脱离充值规则

跨平台比较时,真正重要的是“最终单位 Token 折合多少钱”,而不是后台写了一个多大的倍率数字。


十七、可直接使用的四条核心公式

如果你只想留下最有用的结论,那么记住下面四条就够了。

1. 官方普通模式公式

Cost_normal = 未缓存输入 / 1,000,000 × 输入单价
            + 缓存命中输入 / 1,000,000 × 缓存单价
            + 可见输出 / 1,000,000 × 输出单价

2. 官方 Thinking / Reasoning 模式公式

Cost_thinking = 未缓存输入 / 1,000,000 × 输入单价
              + 缓存命中输入 / 1,000,000 × 缓存单价
              + (可见输出 + 思考 Token) / 1,000,000 × 输出单价

3. 中转站基础倍率公式

Quota_basic = (输入 Token + 输出 Token × 补全倍率)
            × 模型倍率 × 分组倍率

4. 中转站完整配额公式

Quota_full = (未缓存输入 + 缓存输入 × 缓存倍率 + (可见输出 + 思考 Token) × 输出倍率)
           × 模型倍率 × 分组倍率

这四条公式,基本就能把“官方怎么计费”和“中转站为什么这么扣费”完整串起来。


十八、结论:从 Token 到中转站的理解路径

整件事最值得记住的,其实就是一句话:

官方计费看的是 Token 结构——输入、缓存输入、输出,以及 thinking 带来的额外 Token;中转站做的,则是在这套结构之上,再叠加模型倍率、补全倍率、分组倍率和缓存倍率,把官方成本映射成自己的余额与配额规则。

所以,理解大模型计费最好的路径永远是:先理解 Token,再理解官方价格,再理解中转站倍率。顺序一旦反过来,很多概念就很容易越看越乱。

写在最后🧪

这里是言萧凡的 AI 编程实验室。 我会在这里持续记录和分享 AI 工具、编程实践,以及那些值得沉淀下来的高效工作方法。 不只聊概念,也尽量分享能直接上手、能够复用的经验。 希望这间小小的实验室,能陪你一起探索、实践和成长。 2026 年,一起进步。

Claude Skills 新手笔记

2026年3月22日 23:54

开篇:这份笔记能帮你解决什么问题

如果你正在用 Claude(或任何大模型)做写作、总结、审阅、编码、整理资料等重复性工作,你很快会遇到两个痛点:

  • 同一类任务,每次都要把背景、规则、格式重新讲一遍;
  • 输出质量容易波动:有时很稳,有时跑偏,难以复用。

Claude Skills 可以把“可重复任务的知识 + 流程 +资源”打包成可复用的能力单元,让模型在需要时按需加载,从而更稳定地完成特定工作。这篇文章会用最小规范、加载机制、以及一个完整的中文示例,带你快速建立可落地的理解。

1. Claude Skills 是什么

Claude Skills 可以理解成给 Claude 增加“专项能力包”的一种方式:把一类可重复任务的知识、流程和资源打包成一个可复用单元,让 Claude 在需要时再加载它,从而更稳定地完成特定工作。

Anthropic 官方 skills 仓库和 Agent Skills 官方说明都把 Skill 描述为一个由说明、脚本和资源组成的目录;最核心的入口文件是 SKILL.md

从最小结构看,一个 Skill 至少是这样:

my-skill/
└── SKILL.md

在此基础上,还可以按需添加:

  • scripts/:可执行脚本
  • references/:参考资料或规范文档
  • assets/:模板、图片、字体等资源文件

这些目录都是可选的,不是每个 Skill 都需要。

Skill 和一次性的临时提示词最大的区别,在于它是可复用、可维护、可分享的。Anthropic 官方公开仓库本身就是以“一个个独立 Skill 目录”的形式组织示例,目的是展示 Claude Skills 能覆盖的不同任务模式。

2. Skills 有什么作用

Skills 的价值,不是单纯“让 Claude 更聪明”,而是让 Claude 在某一类任务上更稳定、更一致、更像一个带经验的专职助手。官方说明里提到,Skills 可以用来处理专业文档、组织内部工作流、创意任务、技术任务以及企业流程。

实际使用里,Skills 通常有四类明显作用。

第一类,是封装专业知识和组织规范。

如果某项任务总要遵守固定规则,比如品牌语气、技术规范、法务措辞、团队输出格式,把这些内容写进 Skill 后,就不用每次重新解释一遍。Agent Skills 官方也明确把“专门知识”和“特定工作流”列为 Skill 的核心用途。

第二类,是沉淀可重复工作流。

很多工作并不难在某一步,而是难在“每次都要从头再走一遍流程”。Skill 可以把输入整理、澄清问题、输出结构、检查清单这些步骤固定下来,让 Claude 更稳定地重复执行。官方 skills 仓库对 Skills 的定义就是:教 Claude 以可重复的方式完成特定任务。

第三类,是让输出更稳定、更可控。

对于写作、总结、审阅、结构化交付物这类任务,Skill 可以约束 Claude 按固定结构输出、使用固定语气、遵守边界条件。

第四类,是按需加载,减少上下文浪费。

Agent Skills 官方说明把这套机制叫作 progressive disclosure。代理在启动时只读取每个 Skill 的名称和描述;当某个任务与描述匹配时,才会把完整 SKILL.md 读入上下文;如果正文还引用了脚本或其他资源,再进一步按需读取或执行。这样既能节省上下文,又能在需要时获得更强的专门能力。

3. Skill 的最小规范与加载机制

如果只讲最小可用版本,一个 Skill 的门槛非常低:一个目录,加一个 SKILL.md 文件就够了。Anthropic 官方仓库 README 和 Agent Skills 官方文档都明确这么写。

SKILL.md 里最关键的是 YAML frontmatter。按照 Agent Skills 官方规范,最小必需字段是:

  • name
  • description

其中:

  • name 是 Skill 的唯一标识,要求使用小写字母、数字和连字符
  • description 用自然语言说明这个 Skill 做什么,以及何时应该触发

Agent Skills 规范另外还支持可选字段,例如 license。GitHub 上的相关 issue 也显示,Claude 端对 frontmatter 的可接受字段有明确限制,随意添加常见字段如 version、author 可能导致导入或验证失败。

一个最小的 SKILL.md 通常长这样:

---
name: my-skill
description: 用一句话描述这个 Skill 做什么,以及什么时候应该使用它。
---

# Instructions

在这里写模型需要遵循的规则与流程。

这里最值得重视的是 description。它不只是简介,也是 Skill 是否会被正确命中的主要触发入口。Agent Skills 官方说明里明确提到,代理启动时先读取的就是 name + description;只有描述匹配任务,才会继续加载正文。

所以,一个好 Skill 的关键,往往不只是正文写得多详细,而是 description 是否把“做什么”和“什么时候用”写清楚了。

4. skill-creator 是什么

skill-creator 是 Anthropic 官方 skills 仓库中的一个“元 Skill”。它不是直接帮你做业务任务的,而是专门帮助你创建、改进、测试和迭代别的 Skill。官方 skill 页面对它的定位就是:一个用于创建新 Skill 并持续改进它们的 Skill。

简单说:普通 Skill 是“解决问题”的;skill-creator 是“帮你把解决问题的方法做成 Skill”的。

它的核心价值有两层。

第一层,是把“写 Skill”这件事流程化。

官方说明里给出的基本循环是:先确定 Skill 要做什么,再写草稿,再设计测试提示,再让 Claude 带着 Skill 跑测试,再基于结果迭代,最后继续扩大测试范围。

第二层,是把“触发效果”也纳入优化目标。

skill-creator 不只关心正文写得对不对,还强调后续可以继续优化 Skill 的描述,让它在真正需要时更容易触发。

如果你是第一次做 Skill,skill-creator 最大的帮助不是“替你写几段文字”,而是把你拉回到一条更工程化的路径上:先澄清意图,再做最小版本,再用真实提示测试,再迭代。

5. skill-creator 如何帮助你创建 Skill

把官方思路拆开来看,skill-creator 实际上在帮助你完成四件事。

5.1 澄清意图

官方说明强调,第一步不是立刻开始写,而是先弄清楚:

  • 这个 Skill 到底要解决什么问题
  • 用户会怎么提这个需求
  • 需要哪些输入才能产出好结果
  • 希望输出成什么格式

这些问题看上去基础,但它们直接决定 description 是否能触发,以及正文是否能落地。

5.2 生成最小可用版本

skill-creator 倾向于先做一个能用的初稿,而不是一开始做成大而全的系统。官方建议里也有类似思路:先写 draft,再用几个真实测试提示验证。

这一步最重要的是三件事:

  • 取一个清晰的名字
  • 写一个覆盖真实触发语境的 description
  • 在正文里给出规则、默认假设和输出格式

5.3 用真实提示测试

官方 skill-creator 页面建议,在写完草稿后准备 2 到 3 个真实测试提示,先跑起来看结果。它甚至给了 evals.json 的结构示例,用来记录测试 prompt 和期望输出。

这说明一个很重要的事实:Skill 不是“写完就结束”,而是要靠真实触发场景来验证。

5.4 继续迭代 description 和正文

官方特别强调两类容易出问题的地方。

  • 一类是 description 写得太弱,导致该触发时不触发。
  • 另一类是正文规则太模糊,导致即使触发了,输出仍然不稳定。

所以,Skill 的迭代通常也优先围绕这两点展开:

  • description 是否覆盖真实使用语境
  • 输出格式、规则和检查点是否足够稳定

6. 最简单示例:创建一个“个人介绍 Skill”(中文版本)

下面给一个最小、最实用的例子:做一个属于你自己的 Skill,让 Claude 在你要求“写我的自我介绍”“帮我生成个人简介”“写个人主页介绍”时,优先按你固定的人设、语气和格式来写。

这个例子的目标不是让 Claude “永久记住你”,而是把你的资料、偏好和输出规则封装成一个可复用 Skill。这样的做法,符合官方对 Skills 的定义:把某类可重复任务的说明和资源封装起来,在相关任务发生时再加载。

6.1 第一步:把需求告诉 skill-creator

你可以直接在 Claude Code 里这样说(中文示例):

使用 skill-creator 技能帮我创建一个 personal-profile(个人介绍)skill。

它需要在不同场景下帮我写自我介绍:
- 一句话简介(很短的 bio)
- 正式的职业介绍(用于主页/简历/演讲嘉宾介绍)
- 更口语的社交介绍

当我提出类似这些需求时触发:
- 写我的自我介绍
- 给我一段个人简介
- 帮我写一个个人主页介绍
- 给我一个演讲嘉宾介绍

我的基本信息:
- 姓名:萧凡
- 方向:产品、AI 工作流、自动化
- 风格:清晰、温暖、专业
- 默认输出语言:中文;如果我明确要求英文,再输出英文

这段提示的好处,是把最关键的四类信息一次交代清楚:

  • Skill 做什么
  • 什么时候触发
  • 有哪些输出模式
  • 你的基础资料是什么

如图,已使用 skill-creator 将 Skill 打包成一个 .skill 文件。你可以将该文件分享出去,或将 personal-profile.skill 放到对应环境的 skills 目录下。

如果想查看里面的内容可以在文件后添加后缀名.zip,解压之后得到完整的结构

6.2 手工创建一个最小可用的 Skill(目录 + SKILL.md

如果你不想先用 skill-creator 生成 .skill 文件,也可以直接在本地“纯手工”创建一个 Skill:新建一个目录,并写好 SKILL.md 即可。

最小目录结构如下:

personal-profile/
└── SKILL.md

你可以把这个目录放到你自己的 skills 搜索路径下(不同运行环境/工具的默认路径可能不同),之后在对话或运行时按需加载。

下面是一版可以直接参考的最简 SKILL.md 示例:

---
name: personal-profile
description: 为“萧凡”撰写自我介绍与个人简介,包括:一句话简介、正式职业介绍、社交口吻介绍、个人主页简介、演讲嘉宾介绍等。当用户提出“写我的自我介绍/个人简介/主页介绍/嘉宾介绍”等相似需求时,使用此 skill。默认输出中文;若用户明确要求英文,再输出英文。
---

# 个人介绍(Personal Profile)

除非用户提供更新信息,否则以下资料视为默认事实来源。

## 核心资料
- 姓名:萧凡
- 方向:产品、AI 工作流、自动化
- 默认语言:中文
- 备选语言:英文
- 语气:清晰、温暖、专业

## 写作规则
- 表达具体、自然,避免夸张与空话。
- 句子尽量短,读起来顺。
- 如果用户没有提供场景,先给一版“通用中等长度”的介绍。
- 如果用户指定平台/场景(如:领英、个人主页、演讲、社交媒体),按场景调整长度与语气。
- 如果关键背景缺失:先给一版合理默认稿,再提出 2-3 个精炼追问。

## 输出模式
### 1)一句话简介
用于头像旁/签名档等,1-2 句。

### 2)正式职业介绍
用于个人主页、简历摘要、演讲嘉宾页等。

### 3)更口语的社交介绍
用于社交/轻松场景。

## 默认输出格式
当用户没有指定格式时,按以下顺序返回:
1. 标准版自我介绍
2. 一句话简介
3. 更口语一点的版本

这版示例有几个优点:

  • 符合最小规范:有 name、有 description、有正文。
  • 把“何时使用”尽量写进了 description(利于触发)。
  • 没有引入多余复杂度:对“自我介绍”这种任务,通常不需要脚本也能很好用。

7. 为什么这个最小示例已经够用了

对于“自我介绍型 Skill”这类文本任务,真正决定效果的通常只有三件事:

  • 资料是否清楚
  • description 是否覆盖真实触发语境
  • 输出规则是否稳定

只要这三点写清楚,一个只有 SKILL.md 的 Skill 往往就已经足够实用。Agent Skills 官方文档也明确说明,Skill 可以从纯文本说明起步,再按需要扩展到脚本和资源。

只有当你遇到下面这些情况,才需要进一步引入 scripts/、references/ 或 assets/:

  • 需要从外部数据源拉取内容
  • 需要把某些重复操作自动化
  • 需要依赖复杂模板或品牌资源
  • 需要对输出做更机械、更稳定的处理

8. 使用时会怎么触发

这个 Skill 安装好之后,你以后就可以直接说:

写一个我的三句话自我介绍

或者:

帮我写一个放在个人主页上的简介

或者:

给我一个英文的 speaker bio

之所以它更容易在这些场景里起作用,是因为代理在判断是否要调用某个 Skill 时,先看的就是 Skill 的名称和描述。你的用户表达越贴近 description 中列出的真实语境,这个 Skill 越容易被正确加载。

9. 工程实践:如何组织个人级和项目级 Skills

如果你在 Claude Code 里长期使用类似能力,比较合理的组织方式是区分“个人范围”和“项目范围”。Anthropic 官方关于 Claude Code subagents 的文档明确给出了两类存放位置:项目级放在 .claude/agents/,用户级放在 ~/.claude/agents/,并且项目级优先于用户级。

落到 Skills 的组织上,一个很实用的思路是:

个人级 vs 项目级 Skills 组织与优先级

  • 个人 Skill:放在个人环境里,服务你的跨项目偏好
  • 项目 Skill:跟着仓库走,服务项目特有的术语、规范、流程
  • 当两者冲突时:优先采用项目级约束

这不是官方标准文本里的强制规则,但非常符合实际协作逻辑。

10. 写 Skill 时最容易忽略的两个点

第一个,是把 description 写得太短。

很多人会把描述写成一句非常笼统的话,比如“help with writing bio”。这种写法太弱,Claude 不容易判断何时应该触发。更好的做法,是把任务类型和典型触发场景一起写进去。

第二个,是一开始就把 Skill 写得太复杂。

官方 skill-creator 的流程更鼓励先做 draft、先跑测试、再迭代,而不是上来就堆很多脚本和资源。Claude Code 官方关于 subagents 的文档也明确建议:先让 Claude 生成一个版本,再改成适合你自己的版本。


结尾:从“会用”到“可复用”

Claude Skills 的关键,不在于把提示词写得更长,而在于把高频任务的知识、流程和边界沉淀成可以复用的单元。

如果你刚开始上手,最推荐的路径是:先挑一个你最常做的任务(比如写简介、写周报、做文档审阅),用最小结构把它做成一个 Skill,准备 2-3 个真实提示去测试,然后优先迭代 description(能不能触发)输出规则(稳不稳定)

当这些“可重复”的能力慢慢积累起来,你获得的就不只是更快的输出,而是一套能持续复利的个人工作流资产。


🧪

这里是言萧凡的 AI 编程实验室

我会在这里持续记录和分享 AI 工具、编程实践,以及那些值得沉淀下来的高效工作方法。

不只聊概念,也尽量分享能直接上手、能够复用的经验。

希望这间小小的实验室,能陪你一起探索、实践和成长。

2026 年,一起进步。

❌
❌