推理:模型如何生成文本

训练 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:避免生成过长的回答
  • 缓存:相同或相似的请求可以缓存结果
  • 选择合适的模型:简单任务用小模型,复杂任务才用大模型

要点总结

  1. Temperature 和 Top-p 控制创造性与确定性的平衡。根据场景选择合适的值。
  2. Temperature = 0 并不意味着 100% 确定性,但已经足够接近。
  3. 流式输出应该是默认选择,除非你有特殊原因需要等待完整响应。
  4. 输出 token 比输入 token 贵。设计 prompt 时要考虑成本。
  5. 推理速度受模型大小、输入长度和输出长度影响。对延迟敏感的场景需要权衡。