Token 与上下文窗口 - LLM 的计费与记忆单位 / Tokens and Context Windows as the Units of LLM Cost and Memory
📅 创建时间:2026-04-28 🏷️ 标签:#Token #上下文窗口 #基础概念 📚 前置知识:[[01 - 神经网络基础]]
📋 本章目标
- 理解什么是 Token(词元)
- 掌握中英文 Token 的差异
- 理解上下文窗口的概念和限制
- 了解 Token 计算的工具和方法
- 理解为什么需要记忆管理和 RAG
第1部分:什么是 Token?
1.1 Token 的基本概念
Token = 文本处理的最小单位
LLM 不能直接处理原始文本,而是将文本转换成 Token(词元)来进行处理。
形象类比:
人类阅读:
"你好" → 直接理解意思
LLM 处理:
"你好" → [你, 好] → Token 化 → [100, 200] → 理解1.2 Token 不是简单的"字"或"词"
常见误解:Token = 一个汉字 / Token = 一个英文单词
实际情况:
- 英文:1 Token ≈ 0.75 个单词(平均)
- 中文:1 Token ≈ 0.5-1.5 个汉字
- 标点符号、空格也是 Token
- 常见词组可能被合并为一个 Token
1.3 Token 切分规则
英文 Token 规则:
原文:Hello, world!
Token化:[Hello] [,] [world] [!]
原文:artificial
Token化:[ artific] [ial] ← 根据训练语料决定
原文:tokenization
Token化:[token] [ization] ← 常用词根可能被分开中文 Token 规则:
原文:今天天气很好
Token化:[今天] [天气] [很好]
原文:人工智能
Token化:[人工] [智能] 或 [人工智能] ← 根据常见程度决定
原文:我爱你中国
Token化:[我] [爱] [你] [中国] ← 单字可能被分开第2部分:中英文 Token 差异详解
2.1 为什么中文 Token 更多?
根本原因:Tokenizer 的训练语料以英文为主
具体差异:
| 文本类型 | 英文字符数 | Token 数 | 比例 |
|---|---|---|---|
| 英文句子 | 100 chars | ~25 tokens | 1:4 |
| 中文字符 | 100 chars | ~100 tokens | 1:1 |
| 代码 | 100 chars | ~30 tokens | 1:3.3 |
2.2 具体数值示例
英文示例
原文:
"The artificial intelligence revolution is transforming how we work and live."逐词 Token 化:
"The" → Token 1
" artificial" → Token 2
" intelligence" → Token 3
" revolution" → Token 4
" is" → Token 5
" transforming" → Token 6
" how" → Token 7
" we" → Token 8
" work" → Token 9
" and" → Token 10
" live" → Token 11
"." → Token 12统计:32 个字符 → 12 个 Token → 比例约 2.7:1
中文示例
原文:
"人工智能正在改变我们的生活和工作方式。"逐字/词 Token 化:
"人工" → Token 1
"智能" → Token 2
"正在" → Token 3
"改变" → Token 4
"我们" → Token 5
"的" → Token 6
"生活" → Token 7
"和" → Token 8
"工作" → Token 9
"方式" → Token 10
"。" → Token 11统计:18 个字符 → 11 个 Token → 比例约 1.6:1
2.3 常见对比
| 句子 | 英文 Token 数 | 中文 Token 数 |
|---|---|---|
| 你好 | - | 2-3 |
| Hello | 1 | - |
| 今天天气很好 | - | 5-6 |
| It's a beautiful day | 5 | - |
| 我爱机器学习 | - | 5-6 |
| I love machine learning | 4 | - |
2.4 Token 数量估算经验法则
英文:1 Token ≈ 4 个字符 ≈ 0.75 个单词
中文:1 Token ≈ 1-2 个汉字
代码:1 Token ≈ 3-4 个字符快速估算方法:
- 英文单词数 ÷ 0.75 = Token 数
- 中文字数 ÷ 1.5 = Token 数(保守估计)
第3部分:上下文窗口
3.1 什么是上下文窗口?
上下文窗口 = 模型一次能处理的 Token 总数
┌────────────────────────────────────────────────────────────┐
│ 上下文窗口 │
│ ┌────────────────────────────────────────────────────┐ │
│ │ System │ User │ Assistant │ User │ Assistant │ │ │
│ │ (tokens) (tokens) (tokens) (tokens) (tokens) │ │
│ └────────────────────────────────────────────────────┘ │
│ ←──────────── 最大 Token 数(上下文窗口大小)─────────────→│
│ │
│ 超过这个限制的内容会被"遗忘" │
└────────────────────────────────────────────────────────────┘3.2 历代模型的上下文窗口
| 模型 | 发布时间 | 上下文窗口 | 约合中文字数 |
|---|---|---|---|
| GPT-3 | 2020 | 4,097 | ~3,000 字 |
| GPT-3.5 | 2022 | 4,097-16K | ~12,000 字 |
| GPT-4 | 2023 | 8K / 32K | ~24,000 字 |
| Claude 2 | 2023 | 100K | ~75,000 字 |
| Claude 3 | 2024 | 200K | ~150,000 字 |
| Gemini 1.5 | 2024 | 1M | ~750,000 字 |
| Claude 3.5 | 2024 | 200K | ~150,000 字 |
3.3 为什么上下文窗口有限制?
三大限制因素:
┌─────────────────────────────────────────────────────────────┐
│ 限制因素 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 计算成本(Quadratic Complexity) │
│ ┌─────────────────────────────────────┐ │
│ │ Self-Attention 计算量:O(n²) │ │
│ │ 4096 tokens → 16M 计算量 │ │
│ │ 8192 tokens → 67M 计算量(4倍!) │ │
│ └─────────────────────────────────────┘ │
│ │
│ 2. 内存限制 │
│ ┌─────────────────────────────────────┐ │
│ │ 每个 Token 需要存储注意力权重 │ │
│ │ 4K 上下文需要大量 GPU 显存 │ │
│ └─────────────────────────────────────┘ │
│ │
│ 3. 通信带宽 │
│ ┌─────────────────────────────────────┐ │
│ │ 分布式训练/推理时,Token 越多 │ │
│ │ 跨 GPU 通信量越大 │ │
│ └─────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘3.4 上下文窗口的实际影响
场景1:短对话
用户:什么是人工智能?
助手:人工智能是...
Token 数:~50 ✓ 轻松容纳场景2:长文档摘要
用户:请总结以下文章(5000字)...
[文章内容...]
Token 数:~7000 ✓ 早期模型可能超出场景3:代码理解
用户:请解释这个代码文件(10000行)...
Token 数:~15000 ⚠️ 需要 32K 以上模型场景4:多文档对比
用户:对比这5篇论文的异同...
Token 数:~50000 ⚠️ 需要 100K+ 模型第4部分:Token 计算工具
4.1 OpenAI 的 Token 计算工具
tiktoken(Python 库):
import tiktoken
# 使用 cl100k_base 编码器(GPT-4/GPT-3.5 使用)
enc = tiktoken.get_encoding("cl100k_base")
# 计算英文 Token 数
text = "Hello, world!"
tokens = enc.encode(text)
print(len(tokens)) # 输出: 4
# 计算中文 Token 数
text_cn = "你好,世界!"
tokens_cn = enc.encode(text_cn)
print(len(tokens_cn)) # 输出: 64.2 在线工具
| 工具 | 链接 | 特点 |
|---|---|---|
| OpenAI Tokenizer | platform.openai.com/tokenizer | 官方工具 |
| Tokenizer by Anthropic | anthropic.com | Claude 用 |
| Tiktokenizer | tiktokenizer.vercel.app | 可视化界面 |
4.3 常见 Token 数估算
| 内容类型 | 字数/词数 | 约 Token 数 |
|---|---|---|
| 短邮件 | 50 字/词 | ~75 |
| 段落 | 150 字/词 | ~200 |
| 一页 A4 纸 | 500 字/词 | ~700 |
| 短篇小说 | 5,000 字/词 | ~6,500 |
| 技术文档 | 10,000 字/词 | ~13,000 |
| 一本书 | 80,000 字/词 | ~100,000 |
第5部分:Token 与成本的关系
5.1 OpenAI API 定价(示例)
| 模型 | 输入价格 | 输出价格 | 单位 |
|---|---|---|---|
| GPT-4o-mini | $0.15 | $0.60 | 每 1M tokens |
| GPT-4o | $2.50 | $10.00 | 每 1M tokens |
| GPT-3.5-turbo | $0.50 | $1.50 | 每 1M tokens |
5.2 成本计算示例
场景:一次典型对话
用户输入:"请解释什么是机器学习"(约 15 字)
→ Token 数:~20
助手输出:"机器学习是..."(约 200 字)
→ Token 数:~250
总 Token 数:20 + 250 = 270使用 GPT-4o-mini 的成本:
输入成本:270 / 1,000,000 × $0.15 = $0.0000405
输出成本:270 / 1,000,000 × $0.60 = $0.000162
总成本:$0.0002025 ≈ 0.02 分人民币5.3 优化 Token 使用的技巧
1. 精简 Prompt
❌ 不好:请帮我写一段关于人工智能的详细介绍,包括它的定义、发展历史、
主要应用领域,以及未来的发展趋势。
✅ 好:请介绍人工智能的定义和主要应用。2. 利用 Few-shot 而非长说明
❌ 不好:现在我要你扮演一个翻译官,你需要把用户说的中文翻译成英文,
翻译要准确、通顺,符合英语习惯...
✅ 好:翻译成英文:
中文:我爱你 → English: I love you
中文:今天天气真好 → English: The weather is nice today.
中文:学习很有趣3. 摘要长文本
如果要处理很长的内容,先摘要再提问第6部分:上下文窗口与记忆管理
6.1 超出上下文会发生什么?
超出限制:
┌─────────────────────────────────────────────────────────────┐
│ 上下文窗口 │
│ ┌───────────────────────────────────────────┐ │
│ │ [System] [User1] [Assistant1] [User2] │ ← 最新消息 │
│ └───────────────────────────────────────────┘ │
│ ↓ │
│ 被"截断"(Truncate) │
│ ↓ │
│ ┌───────────────────────────────────────────┐ │
│ │ [User1] [Assistant1] [User2] │ ← 丢失旧消息 │
│ └───────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘早期对话被遗忘:
用户:你还记得我们最开始讨论的话题吗?
助手:抱歉,我已经不记得了,因为上下文窗口有限。6.2 为什么需要 RAG?
RAG = Retrieval-Augmented Generation(检索增强生成)
┌─────────────────────────────────────────────────────────────┐
│ RAG 工作流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 文档处理 │
│ ┌─────────────────────────────────────┐ │
│ │ 长文档 ──→ 分块 ──→ 向量化 ──→ 存储 │ │
│ └─────────────────────────────────────┘ │
│ │
│ 2. 查询时 │
│ ┌─────────────────────────────────────┐ │
│ │ 用户问题 ──→ 检索相关片段 ──→ 加入上下文 │ │
│ └─────────────────────────────────────┘ │
│ │
│ 3. 生成时 │
│ ┌─────────────────────────────────────┐ │
│ │ 问题 + 相关片段 ──→ LLM ──→ 答案 │ │
│ └─────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘6.3 记忆管理策略
按场景选择策略:
| 场景 | 策略 | 说明 |
|---|---|---|
| 短对话(<4K tokens) | 无需特殊处理 | 直接使用完整上下文 |
| 中等对话(4K-32K) | 摘要压缩 | 定期摘要历史对话 |
| 长文档(>32K) | RAG | 检索 + 生成 |
| 超长文档(>100K) | 分层检索 | 先摘要再细查 |
核心总结
总结1:Token 是 LLM 的基本处理单位
Token ≠ 字 ≠ 词
英文:1 Token ≈ 4 字符 ≈ 0.75 单词
中文:1 Token ≈ 1-2 汉字总结2:上下文窗口是硬限制
上下文窗口 = 输入 + 输出 的最大 Token 数
超过 → 截断 → 丢失信息总结3:Token 数量直接影响成本和性能
Token 数 ↓ → 成本 ↓ + 延迟 ↓
但过于精简可能丢失重要信息总结4:记忆管理的必要性
短上下文 ← 直接对话
中上下文 ← 对话摘要
长文档 ← RAG 检索
超长文档 ← 分层处理章节测试
测试1:Token 估算
估算这句话的 Token 数:"The quick brown fox jumps over the lazy dog." (提示:约 9 个单词)
测试2:中文 Token
这句话大约有多少个 Token?"人工智能将使世界变得更美好。" (提示:约 12-14 个汉字)
测试3:上下文限制
如果模型上下文窗口是 4K tokens,用户的对话已经占用了 3500 tokens,那么助手最多还能生成多少 Token 的回复?
测试4:成本计算
使用 GPT-4o-mini 处理一次请求,输入 1000 tokens,输出 500 tokens。 如果输入价格 $0.15/M,输出价格 $0.60/M,成本是多少?
测试5:RAG 必要性
什么时候需要使用 RAG 而不是直接把所有文档塞进上下文?
参考答案
测试1答案
估算:约 11-12 tokens
计算过程:
- 约 9 个英文单词
- 每个单词约 1.3 tokens(考虑常见词根和标点)
- 9 × 1.3 ≈ 12 tokens
验证:用 tiktoken 验证结果是 12 tokens
测试2答案
估算:约 12-14 tokens
计算过程:
- 约 14 个汉字
- 考虑到"使"、"得"等虚词可能单独成 token
- 14 ÷ 1.2 ≈ 12 tokens
注:中文 Token 数因具体句子而异,需要工具验证
测试3答案
答案:最多约 500 tokens
解析:
总限制:4096 tokens
已使用:3500 tokens(用户输入)
剩余:4096 - 3500 = 596 tokens
考虑到还需要留一些空间给输出格式和缓冲
实际可用约 500 tokens测试4答案
答案:$0.00045
计算过程:
输入成本:1000 / 1,000,000 × $0.15 = $0.00015
输出成本:500 / 1,000,000 × $0.60 = $0.00030
总成本:$0.00045测试5答案
答案:当文档长度超过模型的上下文窗口,或者即使能放入但会导致成本过高、延迟过大时。
解析:
✓ 需要 RAG 的场景:
- 文档有 100K+ tokens,远超上下文
- 需要从海量文档中检索特定信息
- 查询需要非常精确,容不得半点无关内容
✗ 不需要 RAG 的场景:
- 文档较短,能轻松放入上下文
- 需要理解文档的全局信息
- 对话式交互,需要保持连续性相关笔记
- [[03 - 解码策略]] - 控制 LLM 输出的参数
- [[04 - 消息角色]] - 对话结构与 Token 消耗
- [[06 - Prompt 工程]] - 高效使用 Token 的技巧
下一步学习
- [ ] 阅读 03 - 解码策略
学习状态:✅ 已完成