大语言模型基础
大语言模型(LLM)是根据前面的文本逐个预测下一个 Token 的生成模型。应用开发不要求会训练模型,但要能解释一次调用里发生了什么:文本怎样变成 Token,上下文窗口限制了什么,输出为什么每次可能不同,用量和费用怎样计算。本文讲 Token、生成过程、采样参数和模型的能力边界;模型内部结构见 Transformer 与注意力机制。
1. 面试核心
先记住这几条,再读正文- 模型的输入输出单位是 Token,由分词器把文本切成子词片段。Token 数决定上下文能否放下、费用多少和生成耗时;同样的内容在不同模型的分词器下 Token 数不同,以接口返回的用量为准。卡 · Token 与上下文窗口
- 生成是自回归的:模型对整段输入计算一次(预填充),然后每一步根据已有内容输出下一个 Token 的概率分布,按采样规则选出一个,追加后再算下一步,直到结束标记或长度上限。卡 · 一次生成的过程
- temperature 调整概率分布的陡峭程度,top-k 只在概率最高的 k 个 Token 中选,top-p 在累计概率达到 p 的最小集合中选。需要稳定、可解析的输出时调低随机性,创作类任务可以调高。卡 · 采样参数
- 模型的知识来自训练数据,有截止时间,也不知道私有数据;它生成的是“看起来合理”的文本,不保证事实正确,这是幻觉的来源。
- 训练分为预训练(学习语言和知识)、指令微调(学会按指令回答)和偏好对齐(让输出符合人类偏好)。应用侧只需能说清各阶段解决什么问题,以及何时选择提示、RAG 或微调。
2. Token 与上下文窗口
分词器把文本切成模型词表中的片段。常见的英文单词是一个 Token,罕见词被切成多段;中文按字或词组切分。同一段中文在不同分词器下的 Token 数可能相差很多,用词表更大的新模型通常更省。估算只能作为参考,计费和截断以模型提供方的分词结果和接口返回的 usage 为准。
一次请求的用量由三部分组成:
| 部分 | 内容 | 说明 |
|---|---|---|
| 输入 Token | 系统提示、工具定义、对话历史、检索材料、本轮输入 | 多轮对话每轮都会重新发送历史,输入随轮数增长 |
| 输出 Token | 模型生成的文本、工具调用参数 | 单价通常高于输入;推理模型的思考过程也按输出计 |
| 缓存命中的输入 | 与之前请求相同的前缀 | 多数提供方按较低价格计费,见上下文管理 |
上下文窗口是一次调用中输入和输出 Token 的总上限。超出时请求失败或被截断,因此要为输出预留空间。窗口大不等于效果好:材料越长,费用和延迟越高,位于中间的信息也更容易被忽略。
3. 一次生成的过程
- 分词:把消息按模型的对话模板拼成一段文本,再转成 Token ID 序列。系统提示、用户消息、工具定义都在这一步变成 Token。
- 预填充(prefill):模型一次性处理全部输入 Token,得到每个位置的中间结果(KV Cache)。输入越长,这一步越久,决定了首 Token 延迟。
- 解码(decode):每一步根据已有序列计算词表上每个 Token 的概率,按采样规则选出一个,追加到序列末尾,再计算下一步。每一步只新增一个 Token,可以复用之前的 KV Cache。输出越长,总耗时越长。
- 停止:遇到结束标记、停止词或达到最大输出长度时结束。接口返回结束原因(例如正常结束、长度截断、工具调用),程序要据此处理。
- 反分词:把 Token 转回文本,以流式或一次性方式返回给调用方。
模型一次调用不会保留状态。多轮对话的“记忆”是程序每次把历史消息重新放进上下文。
4. 采样参数
模型在每一步输出的是概率分布,采样参数决定从中选哪个 Token。
| 参数 | 作用 | 常见取值 |
|---|---|---|
| temperature | 用温度缩放原始分数后再计算概率。低于 1 时分布更尖锐,高概率 Token 更容易被选中;高于 1 时更平坦 | 抽取、分类、代码、工具调用取低值;创作、头脑风暴取高值 |
| top-k | 只保留概率最高的 k 个候选,再在其中采样 | 限制极低概率的离谱输出 |
| top-p | 按概率从高到低累加,保留累计达到 p 的最小集合(核采样) | 候选数量随分布自适应;通常与 temperature 只调一个 |
| max tokens | 最大输出长度 | 防止输出失控和费用超支 |
| stop | 停止序列 | 截断到指定标记 |
temperature 接近 0 时接近贪心解码,每步选概率最高的 Token。即使如此,同一请求也不保证逐字相同:服务端的批处理和浮点计算顺序会带来微小差异。需要稳定结果时,还要依靠结构化输出、校验和重试,而不是只依赖参数。部分推理模型固定或忽略采样参数,以提供方文档为准。
5. 训练阶段与能力边界
| 阶段 | 数据 | 得到的能力 |
|---|---|---|
| 预训练 | 海量文本,预测下一个 Token | 语言能力和训练数据中的知识 |
| 指令微调(SFT) | 指令与高质量回答对 | 按指令完成任务、遵循对话格式 |
| 偏好对齐(RLHF、DPO 等) | 人类或模型对回答的偏好比较 | 更有帮助、更安全、更符合格式要求 |
由此可以推出应用侧的边界:
- 知识截止与私有数据:模型不知道训练之后的事件和企业内部资料,需要 RAG 或工具提供。
- 事实不可靠:模型按概率生成,不区分“记得”和“编造”,见模型幻觉。
- 精确计算与长链推理:多位数运算、严格计数容易出错,适合交给代码或工具。
- 工具调用能力来自训练:模型学会了按格式输出调用请求,真正执行的是程序,见 Function Calling。
6 · 面试题卡片
6.1 一次模型请求的 Token 用量怎样计算?中文和英文有什么差异?
出现公司:凌脉、字节跳动
考察重点
- 分词器的作用,以及 Token 数为什么依赖具体模型。
- 输入、输出、缓存命中三部分用量,以及多轮对话的输入增长。
相关内容:Token 与上下文窗口。
参考回答
分词器把文本切成模型词表中的片段,每个片段是一个 Token。英文常见词通常是一个 Token,罕见词会被拆开;中文按字或常见词组切分,同一段中文在不同模型下 Token 数可能差别很大,词表包含更多中文片段的模型更省。所以不能用字数直接换算,估算可以用对应模型的分词器离线计算,计费以接口返回的 usage 为准。
一次请求的用量包括输入、输出和缓存命中的输入。输入不只是用户这句话,还包括系统提示、工具定义、历史消息和检索材料;多轮对话每轮都重新发送历史,所以输入随轮数增长,这是控制成本时最先要看的部分。输出单价通常更高,推理模型的思考内容也算输出。与之前请求相同的前缀命中缓存后按较低价格计费。
6.2 完整描述一次大模型生成,底层发生了什么?
出现公司:阿里云、快手
考察重点
- 分词、预填充、逐 Token 解码、停止条件的顺序。
- 首 Token 延迟和总耗时分别由什么决定。
参考回答
程序先按模型的对话模板把系统提示、工具定义和消息拼起来,由分词器转成 Token ID。服务端进入预填充阶段,一次性计算所有输入 Token,把每层的 Key、Value 存进 KV Cache;这一步的耗时随输入长度增长,决定首 Token 延迟。
然后进入解码循环:每一步模型根据已有序列输出词表上的概率分布,按 temperature、top-p 等规则选一个 Token,追加到序列,复用 KV Cache 只计算新位置,再进入下一步。遇到结束标记、停止词或最大长度就停止,并返回结束原因,例如正常结束、长度截断或需要调用工具。最后把 Token 转回文本,以流式或整段返回。整个过程不保留状态,多轮对话依靠程序每次重新发送历史。
6.3 temperature、top-p、top-k 分别是什么?不同场景应该怎样设置?
出现公司:TCS、ZS、快手
考察重点
- 三个参数分别作用在概率分布的哪一步。
- 按任务选择参数,以及参数之外保证稳定输出的手段。
参考回答
模型每一步输出下一个 Token 的概率分布。temperature 先缩放分数:调低让高概率 Token 更占优势,输出更确定;调高让分布更平坦,输出更多样。top-k 只保留概率最高的 k 个候选;top-p 按概率从高到低累加,保留累计达到 p 的最小集合,候选数随分布变化。通常只调 temperature 或 top-p 其中一个。
信息抽取、分类、代码生成、工具调用要求可解析和可复现,用低 temperature;写作和创意生成可以调高。但低 temperature 也不能保证逐字一致,服务端批处理会带来微小差异,所以稳定性还要靠结构化输出、Schema 校验和失败重试。推理模型可能固定这些参数,以提供方文档为准。