你大概遇到过这几种困惑:同一个问题问两次答案不一样,是不是模型坏了?调高温度到底改了什么?上下文越长为什么越慢?还有那句「预测下一个词」——听起来太简单,简单到不像能撑起现在的效果。这篇不从公式出发,而是按一次真实生成的顺序,把自回归、注意力、采样这三步串起来讲,顺带给你一套调参和排查的对照方法。
你大概遇到过这几种困惑:同一个问题问两次答案不一样,是不是模型坏了?调高温度到底改了什么?上下文越长为什么越慢?还有那句「预测下一个词」,听起来太简单,简单到不像能撑起现在的效果。这篇不从公式出发,而是按一次真实生成的顺序,把自回归、注意力、采样这三步串起来讲,顺带给你一套调参和排查的对照方法。
先给结论定位:大模型推理不是「想好一整段再一次性吐出来」,而是每一步只算一个位置的下一词概率、挑一个词接上去、再拿新序列重算下一步。理解这个循环,很多玄学现象就变成了可解释的工程问题——首字慢、越聊越慢、同一输入两种答案,全都能对上号。
推理的本质:每一步只做一件事——猜下一个 token
模型不做「整段思考」再输出。它一次只算一个位置的分布,选一个 token 接上去,然后把新序列整个再送进去算下一个位置。所谓生成一段话,就是这件事重复几十上百次。这也是为什么输出是一点点「流」出来的,而不是等全部算完再一次性返回。
- 首字延迟高但后续很快:第一段输入要整体算一遍,之后是逐个补,节奏完全不同
- 输出中途断了无法回填:已经吐出来的 token 就是既成事实,没有「重写上一段」这种操作
- 长文写作容易前后不一致:每一步只看得到当前上下文,越往后越容易偏离开头设定
先分 token 再谈推理:字数不等于步数
在讨论速度和长度之前,得先接受一个事实:模型看的不是「字」,是 token。中文、英文、代码、标点被切成 token 的粒度不同,同一段话在不同模型上步数可能差不少。计费、上下文长度、速度指标(token/s)全都以 token 为单位,用字数估算会系统性偏乐观。
- 取样从你业务里挑三到五段最有代表性的文本,短问答、长文档、代码各来一段,别只用一种。
- 换算到站内工具做 token 换算,得到真实数值,再乘你预期的单次长度。
- 推算并发用换算结果乘并发数,判断当前预算的上下文长度够不够用,不够就先砍输入而不是先换模型。
不用纠结 token 粒度的情况也有:只做短问答、单次调用、输入输出都很短,粒度差异对体验几乎无感,这时候优先看别的问题。
注意力在干什么:让每个 token 决定该看前文哪几个位置
每生成一步,新 token 都要「回看」前面已经出现的所有内容,注意力就是给这些位置分配权重的机制。权重不是人工设的,是训练出来的:反复出现、语义相关的部分自然被拉高。这解释了上下文为什么贵——序列越长,需要比对的位置组合越多,显存和时间都会涨,长上下文通常是慢和贵的主要来源。
| 常见误解 | 实际含义 |
|---|---|
| 注意力等于模型记住了你说的话 | 它只在这一轮计算里起作用,和持久记忆是两件事 |
| 上下文越长效果越好 | 相关信息被稀释、检索难度上升,反而可能变差 |
| 模型在「阅读」全文后再回答 | 是边生成边回看,不是先通读一遍 |
实操上的判断标准:如果你的任务依赖长文档里的某个细节,比起一味拉长上下文,更该做的是把相关片段单拎出来放进输入。具体哪个模型的上下文表现更稳,到 模型资料库(/models) 核对当时的对比记录,别拿印象做决策。
为什么第二次调用明显更快:KV 缓存与预填充、解码两阶段
一次请求分两段:先把整段输入算一遍,这一步决定首字延迟;再一个 token 一个 token 往外吐,这一步决定出字速度。已算过的中间结果会被缓存下来复用,所以多轮对话里只算新增部分,这就是 KV 缓存的作用。
- 预填充
- 把整段输入一次性算完,决定了你等第一个字要多久
- 解码
- 逐个产出 token,决定了字吐出来的速度
- KV 缓存
- 存下已算过的中间结果,让后续步骤不用重算历史
- 缓存占用
- 占显存且随上下文长度线性增长,长上下文时可能比模型权重还吃资源
排查方向很直接:如果并发一上来就变慢或报显存不足,先怀疑缓存占用,而不是认定模型本身有问题。把上下文压短、把并发降下来,通常是第一顺位的验证动作。
采样:同一问题两种答案,问题出在这一步
模型输出的是每个候选 token 的概率,不是唯一答案;用什么规则从这个分布里挑,就是采样参数。温度调低更保守、更像标准答案;调高更发散、更适合头脑风暴。多数任务用默认值就好,别一上来就大改。top-p、top-k 这类参数是先把低概率候选砍掉再挑,作用是防止偶尔蹦出明显不搭的词。
| 任务类型 | 随机性建议 | 理由 |
|---|---|---|
| 数据抽取、格式转换 | 压到接近确定性 | 要可复现,随机性带来的只有麻烦 |
| 客服问答、知识回复 | 偏低 | 答案要稳,别让措辞漂移 |
| 头脑风暴、文案发散 | 适度放开 | 要的是多样性,不是标准答案 |
| 代码补全 | 偏低到中等 | 结构要稳,命名可以适度灵活 |
不适用的情况:涉及需要严格合规或法律口径的输出,不要靠调参去赌,应该在提示里把约束写死,并用人或规则再做一道校验。
别把推理和训练搞混:权重在推理时是不动的
推理阶段模型参数冻结,它不会因为你这轮对话就「学会」什么,也不会因为你纠正它就长期改掉。想让它稳定记住新知识,那是微调或外挂知识库的活,不是靠多聊几句。现实含义是:同一个模型、同一套参数,效果差异大多来自提示写法、上下文内容和采样设置。
- 会话内保留上下文,看起来像「记住了」,换个会话就没了
- 你纠正一次,本轮可能听话,下次同样的坑还会踩
- 提示模板写得好,同样的模型能稳定输出结构一致的答案
- 真要让模型长期带上你的业务知识,走知识库外挂或微调,别指望对话解决
什么时候该怀疑推理环节出了问题
- 第一步:看采样同一输入重复三到五次,错法不一样,多半是随机性。把温度压下来再试。
- 第二步:看上下文确认输入有没有被截断。被截断时模型看到的是残缺信息,输出走偏很常见,但表面不会报错。
- 第三步:看提示同样的设置、同样的输入,重复多次稳定错在同一个点,先改提示模板和示例,别急着换模型。
- 第四步:才考虑模型前三步都排干净了还是稳定错,再考虑换模型或加推理型方案,并把对比记录留下来。
工具类任务(抽取、改格式)出现轻微不一致,多数是随机性导致,把温度压下来并固定提示模板通常就稳了。真正值得换方案的信号只有一个:设置固定、输入固定、重复多次,仍然稳定地错在同一个地方。
入门者的调参顺序:先动什么、后动什么
顺序错了会白忙。把有限的调试时间放在收益最大的环节上,比反复换模型划算得多。
- 优先级一:把任务描述和输入格式写清楚,这一项收益最大且零成本
- 优先级二:确认上下文没被截断,该给的材料给全
- 优先级三:再调采样参数,一次只改一个,改完重复测三次以上再下结论
- 不建议一开始就做:为了「更聪明」去换更大模型,先确认前面三步没拖后腿
每一档调到什么程度算合适,别凭感觉,去 速度测试(/tools/speed-test) 跑一遍真实调用,对照 价格追踪(/price-watch) 看成本变化,再决定要不要继续调。
下一步:把原理落到你自己的调用上看懂自回归、注意力、采样这三段之后,最值得做的一件事是拿你自己最常用的那条任务,按上面的顺序走一遍排查,同时到站内核对当时的模型参数与成本数字,别用旧印象做选择。→常见问题
为什么同一个问题问两次,答案不一样?
因为模型最后一步是从概率分布里挑 token,不是查表取唯一答案。温度等采样参数放得越开,两次差异越明显。要做可复现的任务,把随机性压到接近确定性并固定提示模板,通常就能稳住。
上下文越长,是不是效果一定越好?
不一定。上下文变长会让注意力计算和缓存占用同步上升,速度和成本都会受影响,而且关键信息埋在中间时模型不一定抓得准。建议只放真正相关的材料,其余走检索按需喂进去。
首字很慢、后面出字很快,正常吗?
正常。整段输入要先算一遍才能吐出第一个字,这段叫预填充,是首字延迟的主要来源;之后每个字只需增量计算,所以看起来更快。想压首字延迟,通常从缩短输入和换更轻的模型入手。
调温度到底改了什么?
它只改最后挑选 token 的策略,不影响模型本身的权重和知识。调低偏向高概率候选,输出更稳更保守;调高让低概率候选也有机会,输出更发散。任务要不要随机性,决定你怎么设。
模型会因为这轮对话记住我说的话吗?
在单次会话内它能看到前面的内容,所以看起来记住了;换个会话就没了,模型参数全程没变。想让它长期掌握你的业务知识,得走微调或外挂知识库那条路。