1. 不止是“猜下一个词”:LLM 运行机制全貌
这两年LLM已经不是新鲜词了,但真要说清楚模型从输入一段文字到输出完整回答之间到底发生了什么,大部分人的理解还是停留在“它不就是猜下一个词嘛”这个层面。这句话没错,但只看到了最表面的那层皮。实际上,Token切割方式决定了你花多少钱,上下文长度决定了模型能“记住”多少东西,采样参数决定了模型是严谨还是放飞自我——这三者共同决定了一次LLM调用的最终效果和成本。
我在这篇文章里不打算讲什么神经网络反向传播的数学推导,那玩意儿对绝大多数人没有意义。我先把LLM运行的三个核心概念——Token、上下文、采样参数——彻底拆开揉碎,讲清楚它们各自是什么、怎么影响模型行为,再告诉你在实际写代码调接口的时候,怎么预估Token花费、怎么处理上下文超限、怎么针对不同任务调采样参数。最后附上我这一年多踩过的坑和整理的问题排查清单。
这篇文章适合三类人:准备用LLM API做应用的开发者、想深入理解大模型原理但不想啃论文的产品经理、以及纯粹好奇LLM为什么有时候聪明有时候蠢的普通用户。看完你应该能回答一些网上搜不到标准答案的问题,比如“为什么同样的提示词,模型这次回答好下次回答烂”“上下文窗口到底是不是越大越好”以及“温度调成0是不是就不会出错了”。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 拆解核心概念:Token、上下文窗口与采样参数的深层逻辑
2.1 Token到底是什么:不只是“一个字”那么简单
Token是LLM处理文本的基本单位,但很多人都误解了它的粒度。Token不一定是完整的单词,也不一定是单个汉字。它是模型分词器对原始文本进行切分后得到的离散单元。把Token理解成“模型的文字积木”就好——模型认识的不是字符,而是这些积木块。
不同的分词器切出来的Token是不一样的。以目前主流的BPE(Byte-Pair Encoding)算法为例,它会把高频的词直接保留为完整Token,把低频词拆成子词单元,把完全没见过的东西退化到字节级别。这就是为什么英文里“the”是1个Token,“uncharacteristically”可能被切成好几个Token——因为高频词要效率,低频词要覆盖。
中文的Token化更特殊。很多中文分词器会把一个常用汉字作为一个Token,但一些专业术语、罕见人名会被切碎成多个Token。这意味着同样的中文内容,在不同模型上消耗的Token数量可能差异很大。有个粗略的参考值:英文文本大概是1个Token对应0.7到0.8个词,中文文本大概是1个Token对应0.6到0.7个字。但这只是经验值,具体得看你用的模型走的是什么分词器。
Token的第二个关键意义是计费。现在主流LLM API的定价都是按Token算的,输入和输出价格还不一样。这就是为什么“省Token”成了LLM应用开发里的一个正经课题。省Token不是抠门,而是直接降低单位成本,让你在同样预算下能处理更多的调用量。
Token还有第三个角色:它是模型输入长度的硬约束。一次调用你最多能塞进去多少文本,就是由模型的上下文窗口上限决定的,而这个上限的单位就是Token。你输入提示词消耗一部分,模型输出消耗一部分,两部加起来不能超过窗口上限。
2.2 上下文窗口:模型能“记住”什么,取决于这个数字
上下文窗口是当前LLM架构里的核心约束条件。简单说,就是模型在一次生成回复时,最多能“回头去看”多少之前的Token。全注塑力(Full Attention)机制下,每个新生成Token都要和序列里所有之前的Token计算注意力权重,这个操作的时间复杂度和空间复杂度都是O(n²)——n就是上下文长度。
这就是为什么模型不能无限加长上下文。你把上下文从2K做到8K,计算量不是翻4倍,是翻16倍。从8K做到128K,计算量是指数级的增长。所以你会发现长上下文模型要么更贵,要么会更慢,就是因为这个平方级的算力开销。
但现在很多模型都已经支持128K甚至更长的上下文了。这里就要区分一个概念:支持长上下文 ≠ 长上下文表现好。模型在局部段落内的信息捕捉能力通常很强,但当关键信息散布在很长一段文本的不同位置时,注意力会被稀释,模型容易“抓瞎”。这就像让你读一本500页的小说然后回答第137页和第402页之间有什么关联——你能记住大概情节,但精确细节就悬了。
实际开发中,“上下文超限”是最常见的报错之一。当你的提示词加上历史对话记录超出了模型的最大上下文限制,API就会直接拒绝请求。这时候普通用户的第一反应是“那我多塞点,你多记点不就完了”,但用过一次就知道,这条路是有天花板的。所以后来的RAG(检索增强生成)架构才那么火——它本质上是把“无脑全塞”改成“按需取用”,只把和当前问题相关的片段放进上下文,而不是把整本书都丢给模型。
2.3 采样参数:决定模型“性格”的旋钮
如果说Token和上下文决定了模型能读什么,
