详解 tokenization 原理、不同模型字符/token 比(GPT≈3.8、Gemini≈4.0)、Agent 工作流 token 消耗呈乘法而非加法增长。
Token是大语言模型的原子计算单位。当你在 ChatGPT、Claude Code、OpenCode 或 Gemini 中输入提示词时,模型会将你的文本转换为一系列称为 token 的数值向量,通过其神经网络处理它们,并逐个生成输出 token。这个 token 化步骤对用户是不可见的,但它决定了成本、延迟和上下文容量的所有方面。
给定文本的近似 token 计数遵循以下公式:
$$Token_count \approx \frac{CCC}{RRR}$$
其中 CCC 是字符数,RRR 是特定模型的每 token 字符比率。对于 GPT-5.6 模型,R≈3.8。对于 Gemini,R≈4.0。这意味着 10,000 个字符的文档在 GPT-5.6 上消耗约 2,500 个 token,在 Gemini 上也消耗约 2,500 个——每个文档的差异很小,但在生产规模上会累积成显著的成本差异。
三个因素使 Token 意识成为任何使用 LLM 的人的必要认知。首先,每个 API 调用按 token 计费——理解 token 化就是理解你的成本。其次,上下文窗口以 token 为单位测量——超出它意味着数据丢失。第三,Agentic 工作流消耗 token 是乘法的,而不是加法的——单个 agent 任务可以消耗简单聊天补全 5-10 倍的 token。这些因素使 token 管理成为核心工程和业务问题,而非学术好奇。
所有主要提供商的主导 token 化算法是字节对编码(Byte-Pair Encoding,BPE),由 Sennrich 等人于 2016 年从数据压缩领域改编而来。BPE 从字节级别开始,迭代合并最频繁的相邻对来构建词汇表。每次合并创建一个代表常见子词单元的新 token。
该算法可以表示为:
$$Vocab_{k+1} = Vocab_k \cup {a_k b_k}$$
其中 $a_k b_k$ 是步骤 k 时当前词汇表中最频繁的相邻对。经过 50,000-100,000 次合并后,得到的词汇表反映了训练语料库的统计模式。像"the"这样的常见词成为单个 token。稀有词拆分为其频繁的子词组件:"unhappiness"变成"un"、"happi"、"ness",因为这些子词在语料库中频繁出现从而被学习到。
词汇表是训练数据的直接函数。OpenAI 的 token 生成器——在英语文本和代码上训练——产生的词汇表针对这些领域进行了优化。Google 在更广泛的多语言数据上训练,产生的词汇表更高效地处理非英语文本,但对英语略有过度 token 化。这些训练差异意味着 token 计数在不同提供商之间不可移植——在 GPT-5.6 上使用 1,000 个 token 的提示词在 Claude Opus 5 上可能使用 1,050 个 token,在 Gemini 3.6 Flash 上使用 980 个。
DeepSeek V4 的架构选择进一步将其与其他人区分开来:其混合专家设计每 token 仅激活 1T+ 总参数中的 49B,在与密集模型相比的一小部分每 token 计算成本下实现 1M 上下文窗口。这种架构差异意味着即使两个模型产生相同的 token 计数,提供商的成本——进而用户支付的价格——也可能存在显著差异。
Token 效率高度依赖语言。英语的 token 化率约为每词 1.3 个 token,或每 token 3.7-4.0 个字符。中文、日文和韩文的 token 化效率要低得多,因为每个字符通常映射到 1-2 个 token——这意味着相同语义内容用中文会消耗比英语多 2-3 倍的 token。
这对多语言应用有直接的成本影响。为英语和日语客户提供服务的聊天机器人,相同语义内容的日语交互费用要高出 2-3 倍。这种差异对用户是不可见的——模型仍然处理他们的文本——但在 API 账单上是可见的。在为多语言部署做预算时,必须将各语言的 token 效率纳入每个市场的成本预测。
代码的 token 化也不同。编程关键字如"function"和"return"是单个 token,但驼峰命名法的变量名会拆分为子词单元。"calculateMonthlyRevenue"变成"calculate"、"Monthly"、"Revenue"——三个 token 而不是一个。代码每字符消耗的 token 比英语散文多约 20-30%,这使得代码补全和代码审查任务比同等长度的文本处理任务成本更高。
Agentic AI——模型自主行动、调用工具、反思结果并迭代——从根本上改变了 token 的消耗方式。聊天补全遵循简单的模式:输入 → 输出。Agentic 任务遵循更接近以下的模式:输入 → 推理 → 工具调用 → 工具响应 → 推理 → 工具调用 → ... → 最终输出。这个循环中的每一步都在等式的两边增加 token。
k 轮 agentic 任务的 token 消耗为:
$$TotalTokens = \sum_{i=1}^{k} (N_{i,prompt} + N_{i,tools} + N_{i,reasoning} + N_{i,output})$$
其中 $N_{i,prompt}$ 是运行中的对话历史,$N_{i,tools}$ 是 MCP 工具响应,$N_{i,reasoning}$ 是思维链,$N_{i,output}$ 是可见输出。经过 10 轮,单个 agentic 任务可能消耗 20,000-50,000 个 token——对于相同的最终可交付成果,是简单聊天补全的 10 倍。
考虑在 Claude Code 中运行的 agentic 代码审查:
第 1 轮:系统提示(1,200 token)+ 文件内容(2,000 token)+ 审查输出(1,000 token)= 4,200 token
第 2 轮:历史(4,200)+ 工具调用(200)+ git diff 响应(3,000)+ 分析输出(800)= 8,200 token
第 3 轮:历史(8,200)+ 工具调用(200)+ lint 结果(1,500)+ 修复输出(1,200)= 11,100 token
第 4-10 轮:继续累积。到第 10 轮时,仅历史记录就超过 30,000 个 token。
复合效应是显著的:10 轮消耗的 token 大约是单次聊天补全的 10 倍,而且每一轮都比上一轮更昂贵,因为历史在增长。
相同的模型在不同工具中表现不同,因为每个环境注入自己的系统提示、管理对话状态并以独特的策略处理内存。
Claude Code 的基于 diff 的保留是独特的:它保留结构性更改(文件编辑、git 提交)同时丢弃中间推理 token。这使其对编码工作流高效,因为在这种情况下变更历史比产生它的推理更重要。OpenClaw 的相关性加权压缩按最近度和相关性保留消息,这更适合通用 agentic 任务,因为早期轮次的上下文可能仍然重要。
系统提示开销对用户是不可见的,但以提供商的每 token 费率消耗真实 token。OpenCode 约 1,800 token 的系统提示在 GPT-5.6 Sol 输入定价下每次会话成本为 $0.009,或每月约 30,000 次会话 $270——在任何实际工作 token 被消耗之前。
Model Context Protocol(MCP)服务器通过将工具响应注入上下文窗口作为输入 token 来放大 token 消耗。连接到文件系统 MCP 服务器、PostgreSQL MCP 服务器和 GitHub MCP 服务器的 agent 每项任务可以生成总计 10,000-50,000 个 token 的工具响应。
典型的 MCP 交互消耗:
$$N_{tool,turn} = N_{call} + N_{response}$$
其中 $N_{call}$ 是工具调用本身(通常包括工具定义和参数 100-300 token),$N_{response}$ 是工具的响应。返回 50 KB 结果的数据库查询增加约 12,500 个输入 token。返回 10 个结果的网络搜索增加 3,000-5,000 个 token。文件读取仅增加 50-200 个 token,但可能在多个文件中重复。
MCP 的挑战在于工具响应是不可预测的。你无法提前知道搜索会返回 3 个结果还是 30 个,或者数据库查询会返回 10 行还是 10,000 行。这种不确定性使得 MCP 启用 agent 的预算规划比简单聊天补全更困难。
当累积上下文——包括所有历史、工具响应、推理和输出——接近模型限制时,系统必须决定丢弃什么。这个过程称为上下文压缩。
每种压缩策略对性能有不同的影响:
摘要式(ChatGPT):用压缩摘要替换旧的对话历史。这保留了关键事实但丢失了细微差别、语气和精确措辞。适用于只有当前主题重要的通用聊天。
滑动窗口(Cursor):当达到硬限制时丢弃最旧的消息。简单且可预测但会丢失以后可能再次相关的上下文。对于早期轮次的信息在以后会被重新访问的任务来说是有问题的。
相关性加权(OpenClaw):按最近度和相关性分数保留消息。更复杂但引入不可预测性:用户无法知道哪些消息在压缩后保留下来。
基于 diff(Claude Code):保留文件的结构性更改同时丢弃中间推理。针对编码进行了优化:你保留"发生了什么变化"而丢失"为什么我们改变了它"。
关于"中间丢失"现象的研究表明,即使没有压缩,并非所有上下文位置都相等。当相关信息出现在上下文开头或结尾时,模型表现最佳,而中间信息的性能会下降。这意味着压缩策略比原始上下文窗口大小更重要。一个良好压缩的 200K 上下文在需要跨会话一致访问信息的任务上可能优于管理不善的 1M 上下文。
生产系统的 Token 预算必须考虑三类:固定开销、可变内容和 Agentic 乘数。
固定开销:系统提示 + 工具定义 + 对话启动模板。这些是可预测的,应该每个环境测量一次。典型的 agentic 设置每次会话有 1,500-2,500 token 的固定开销。
可变内容:用户输入、MCP 工具响应和模型输出。这些因任务而异,无法精确预测,但历史平均值应指导预算。在生产中记录实际 token 消耗并使用第 90 百分位进行容量规划。
Agentic 乘数:总消耗 token 与可见输出 token 的比率。非编码 agentic 任务的典型乘数为 3-5x。带有工具调用和迭代的编码 agentic 任务的典型乘数为 5-10x。通过比较 API 仪表板 token 计数与你的内容估计来测量你的特定乘数。
GPT-5.6 Terra 上单次 agent 会话(10 轮)的生产预算公式:
$$Budget = (Fixed_overhead + Turns \times Variable_per_turn) \times P_{blended}$$
其中 $P_{blended}$ 是考虑输入/输出比率的混合价格(在 3:1 输入:输出比率下,GPT-5.6 Terra 约为 $5.50/M)。以每次会话固定开销 2,000 token + 每轮可变 3,000 token 计算,10 轮会话成本约为 $0.18。作为单次聊天补全的同一会话成本约为 $0.02。此场景的 agentic 乘数为 9 倍。
考虑一个开发人员使用 OpenCode 和 GPT-5.6 Terra 构建文档生成器。该 agent 阅读代码库、在多轮中生成文档并将其写入 markdown 文件。
会话配置:15 轮,3 个 MCP 工具(文件系统、git、网络搜索),每轮 5 次文件读取,生成 2 个文档文件。
每轮 token 分解:1,800 系统提示 + 3,000 对话历史(累积)+ 500 文件读取响应 + 1,000 推理 + 800 输出 = 每轮平均约 7,100 token。15 轮总计消耗约 106,500 token。
GPT-5.6 Terra 成本:整个会话约 $0.59。作为手动文档任务使用聊天补全的同样工作成本约为 $0.07——但 agentic 方法需要人工审查时间,而聊天方法不需要。8.4 倍的 token 乘数包含了自主操作的价值。
优化杠杆:
跨会话跟踪 token 消耗对于准确预算至关重要。大多数提供商在 API 响应中提供每次请求的 token 计数。用会话 ID、任务类型和环境标签记录这些计数。100 次会话后,你将有足够的数据建立每个任务类型、每个环境 和每个模型的基线 token 消耗。使用第 90 百分位——而非平均值——进行容量规划,因为峰值消耗驱动延迟和成本超支,而非典型使用。
Q:典型的 agentic 任务与聊天补全消耗多少 token?
A:10 轮 agentic 任务对于相同的最终可交付成果消耗的 token 大约是单次聊天补全的 10 倍。每一轮都将对话历史、工具响应和推理添加到上下文中,复合 token 消耗。
Q:为什么同一模型在不同工具中成本不同?
A:每个工具注入自己的系统提示(500-2,000 token),以不同方式管理对话历史,并应用不同的压缩策略。这些不可见开销添加到你实际内容的基线 token 计数中,将有效成本改变 20-70%。
Q:MCP 对 token 消耗增加多少?
A:MCP 工具响应从 50 token(文件读取)到 50,000 token(数据库查询)不等。具有每次任务 10 次工具调用的典型 MCP 启用 agent 仅在工具响应输入中就消耗 5,000-50,000 token,不包括对话内容。
Q:长时间运行的 agent 最好的压缩策略是什么?
A:相关性加权压缩(OpenClaw 使用)在最近度和重要性之间取得平衡,保留仍然重要的上下文。基于 diff 的保留(Claude Code 使用)最适合代码,因为结构性更改比推理更重要。
Q:如何为生产 agent 做 token 预算?
A:一次性测量固定开销(系统提示、工具定义),按任务类型跟踪可变内容,并建立你的 agentic 乘数(总 token 与可见输出的比率)。使用第 90 百分位进行容量规划,并添加 20% 的缓冲空间用于重试。
Q:推理模型的 token 计数方式相同吗?
A:不。深度推理模型生成大量隐藏的思维链,作为输出 token 计费但不返回给用户。在复杂任务上,这种隐藏输出可能将可见输出乘以 2-4 倍。相应地做预算。
Q:会话压缩如何影响响应质量?
A:激进的压缩提高了响应速度并降低了成本,但可能丢失早期轮次的细微差别。中间丢失效应意味着模型已经在与中间上下文信息斗争;压缩通过移除可能提供帮助的上下文而加剧了这个问题。
Q:我应该在所有模型中使用相同的 token 化策略吗?
A:不应该。每个提供商的 token 生成器有不同的比率。为你最常使用的特定模型优化文本。对于多模型系统,为最昂贵的 token 生成器做预算,并将更便宜模型的节省视为上行空间。