分词与上下文:模型如何"读"你的话
一句话定义
模型看到的不是你写的字,而是分词器(Tokenizer)切出的 token 序列——上下文工程的每一个决策最终都作用在这个 token 序列上。
为什么重要
你以为在"写字",模型在"读 token"。这个错位解释了大量看似玄学的现象:为什么同一个词中英文表现不同、为什么标点和空格会影响输出、为什么一段话换种说法 token 数差一倍导致成本翻倍。不理解分词,后面的注意力、窗口预算、成本估算全是空中楼阁;理解了它,你就掌握了提示工程里"字节级"的那一层控制力。
前置知识
无需任何前置知识点,这是本库的起点。只需知道:你调用模型 API 时发送的是文本,模型内部会先做一次转换。
直观类比
模型是个只能读电报的图书管理员:你写的是信件,送到他手里已被拍成电报码(token)。电报码的粒度不均匀——常用词一个码,生僻词拆成好几个码。管理员读得懂电报,但你对"字数"的直觉(比如"这句话不长")在电报世界里经常失准。
图示
你写的: 提示工程很有意思
分词后: [提示] [工程] [很] [有意] [思] ← 5 个 token(示意)
英文: "unbelievable" → [un] [believ] [able] ← 3 个 token同一段话在上下文中的真实形态是一条 token 序列,指令、示例、数据混排其中:
[系统提示 tokens][示例 tokens][用户问题 tokens] ——→ 模型 ——→ [输出 tokens]核心概念
- Token(词元):模型处理文本的最小单位。一个 token 可能是一个汉字、一个英文单词、一个单词片段或一个标点。常见规律:英文约 1 token ≈ 0.75 个单词;中文约 1~2 个字 ≈ 1 token(因分词器而异)。
- 分词器(Tokenizer):把文本切成 token 的固定程序。它基于子词(subword)算法如 BPE,在训练时确定,推理时不可更改。
- 上下文(Context):送入模型前向计算的全部 token 序列,包括系统提示、历史对话、检索内容、工具结果——你贴进去的一切拼接成一条序列。
- 词表(Vocabulary):分词器的固定字典,通常几万到十几万条目。词表里没有的生僻字符会被切成多个字节级 token。
原理与机制
分词是确定性的:同一段文本永远切出同一串 token。模型对 token 的三件事决定了后续一切机制:
- 位置编码:每个 token 带有位置信息,模型由此知道"谁在前谁在后"——这是 注意力衰减与"迷失在中间"(Lost in the Middle) 位置效应的根源。
- 注意力计算:每个 token 都可以"关注"序列中的其他 token,但关注强度不均匀——这是提示写法影响输出的微观通道。
- 逐 token 生成:输出也是一个 token 一个 token 蹦出来的,每次生成都把已生成内容追加进上下文——所以长输出的后半段会"看到"自己前半段的全部。
推论:上下文里的一切(你的指令、示例、工具返回的 JSON)对模型来说是同质的 token 流,模型默认不区分"哪段更重要",区分要靠你显式地设计——这正是结构化上下文(结构化上下文:分段、标签与命名)存在的理由。
公式或模型
本节不适用——分词本身是查表程序而非数学模型,量化规律放在核心概念的"≈0.75 单词"经验值即可。
实例或案例
案例:成本差三倍的同一句话。 需求:"把下面的评论分类为好评/差评"。方案 A 直接贴 500 字评论原文;方案 B 先让模型"用 50 字复述评论要点",再基于复述分类。表面看 B 多了一次调用,但如果分类要跑 10 万条,B 的主调用每次省下约 400 token 的输入成本,总账反而更便宜。操作步骤:① 用 tokenizer 工具或 tiktoken 类库实测你的高频文本的 token 数;② 找出 token 大户(往往是贴进去的原文);③ 决定是裁剪(见 长文档组织:分块、裁剪与引用定位)还是两段式处理。
排错清单:
- 症状:模型把生僻品牌名写错或拆开 → 多半被切成字节级 token,改为在提示中给出拼写示例;
- 症状:估算成本总对不上 → 用 token 数估算而不是字数;
- 症状:JSON 被输出到一半截断 → 检查输出 token 上限,JSON 的引号和括号都是 token(见 结构化输出:JSON/YAML 与 Schema 约束)。
常见误区
- 用字数当 token 数:中文 1 字 ≈ 0.5~1 token,英文 1 单词 ≈ 1.3 token,比例完全不同,直接按字符估成本会系统性偏差。
- 以为模型"看到"排版:缩进、换行只是 token,模型不会"看见"你的 markdown 渲染效果,但换行符本身作为分隔信号是有用的(见 结构化上下文:分段、标签与命名)。
- 以为提示词影响分词:分词器固定不可训练,提示只能影响模型对 token 序列的处理。
自测题
- 为什么同一段中文,不同模型报告的 token 数可能不同?
答:各模型使用自研分词器,对中文的切分粒度不同(词表覆盖、训练语料差异),同一文本切出的 token 数不同。
- "提示词写得越多,模型理解越好"——分词视角下这句话有什么问题?
答:更多提示 = 更长 token 序列 = 更多注意力负担与更高成本;信息密度(每 token 承载的指令量)才是关键,冗余文本会稀释关键指令。
- 输出为什么可能在中途"变味"?
答:生成是逐 token 进行的,已生成内容会追加进上下文影响后续生成,前半段的偏航会被后半段延续甚至放大。
与其他知识点的关系
注意力衰减与"迷失在中间"(Lost in the Middle) 建立在"token 有位置"之上讨论注意力衰减;上下文窗口与注意力预算 用 token 数做窗口预算;结构化上下文:分段、标签与命名 解决"同质 token 流如何分层";结构化输出:JSON/YAML 与 Schema 约束 关注结构化输出的 token 开销。
延伸阅读
- 教材:Speech and Language Processing(3rd ed. draft, Jurafsky & Martin)中 tokenizer 与子词分词章节;
- 论文:Attention Is All You Need(Vaswani et al., 2017),位置编码的原始出处。
来源
- Attention Is All You Need (Vaswani et al.
- 2017)
- Speech and Language Processing
- 3rd ed. draft (Jurafsky & Martin)