推理:模型如何生成文本
训练 vs 推理
上一节讲了模型怎么"学"。这一节讲模型怎么"用"——也就是推理(inference)。
当你调用 ChatGPT 的 API 或在网页上输入问题时,发生的就是推理:模型读取你的输入,逐 token 生成回答。
推理阶段的参数是你直接可以控制的。理解这些参数,就能更好地调整模型的行为。
Temperature:控制随机性
Temperature(温度)是最重要的推理参数。它控制模型在选择下一个 token 时的随机程度。
假设模型预测下一个 token 的概率分布是:
"好"→ 50%"棒"→ 30%"美"→ 15%- 其他 → 5%
不同的 temperature 值会这样影响选择:
- Temperature = 0:几乎总是选概率最高的 token(
"好")。输出高度确定,但可能单调 - Temperature = 0.7:按大致比例随机选择,输出有适度变化
- Temperature = 1.5:概率被"拉平",低概率 token 也有较大机会被选中,输出更随机甚至混乱
实际使用建议:
- 代码生成、数据提取、事实性问答:低温度(0 - 0.3)
- 一般对话、写作:中等温度(0.5 - 0.8)
- 创意写作、头脑风暴:较高温度(0.8 - 1.2)
Top-p:另一种控制方式
Top-p(也叫 nucleus sampling)从另一个角度控制随机性:
只从累计概率达到 p 的最小 token 集合中采样。
比如 Top-p = 0.9 意味着:把 token 按概率从高到低排列,取累计概率达到 90% 的那些 token,从它们中间随机选。
Top-p 的好处是自适应:
- 如果模型很确定(某个 token 概率 95%),候选集就很小
- 如果模型不确定,候选集就自动变大
通常 Temperature 和 Top-p 配合使用,或者只调其中一个。
Stop Sequences:什么时候停
模型怎么知道该停止生成?有几种方式:
- 特殊 token:模型生成一个
<EOS>(end of sequence)token,表示回答结束 - Stop sequences:你可以指定一些字符串,模型生成到这些字符串时就停止
- Max tokens:你可以设置最大输出 token 数,到了就截断
合理设置这些参数可以避免模型"说太多"或被意外截断。
流式输出
你可能注意到 ChatGPT 的回答是一个字一个字出现的,而不是等全部生成完才一次性显示。这就是流式输出(streaming)。
技术上,这是通过 Server-Sent Events(SSE) 实现的。每生成一个或几个 token,服务器就推送一次。
流式输出对用户体验很重要:
- 用户不用盯着空白页面等待
- 可以提前判断回答方向是否正确
- 感知上的响应时间大幅缩短
大多数 LLM API 都支持流式模式。在你的应用中,建议默认开启。
推理的成本结构
API 通常按 token 计费,而且输入和输出的价格不同:
- 输入 token(你的 prompt):通常较便宜
- 输出 token(模型的回答):通常更贵(因为需要逐个生成)
一些优化策略:
- 精简 prompt:去掉不必要的内容
- 设置合理的 max tokens:避免生成过长的回答
- 缓存:相同或相似的请求可以缓存结果
- 选择合适的模型:简单任务用小模型,复杂任务才用大模型
要点总结
- Temperature 和 Top-p 控制创造性与确定性的平衡。根据场景选择合适的值。
- Temperature = 0 并不意味着 100% 确定性,但已经足够接近。
- 流式输出应该是默认选择,除非你有特殊原因需要等待完整响应。
- 输出 token 比输入 token 贵。设计 prompt 时要考虑成本。
- 推理速度受模型大小、输入长度和输出长度影响。对延迟敏感的场景需要权衡。