普通视图

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

从 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 年,一起进步。

❌
❌