前几篇文章我们学会了调用 API、管理对话历史和裁剪 token。这些解决了“能不能请求”的问题,但还没涉及“请求后得到什么样的输出”。同样的提示词,模型可能给出严谨的学术回答,也可能脑洞大开胡说八道——这取决于生成参数。本文介绍四个核心参数:temperaturetop_pmax_tokensstop

生成参数概览

这四个参数在 API 请求中传递给模型,控制输出的随机性、长度和结束时机:

参数 作用 典型取值范围
temperature 控制随机性,越高输出越多样 0—2
top_p 核采样阈值,限制候选词范围 0—1
max_tokens 限制最大输出 token 数 视模型而定
stop 指定停止序列,遇到即终止 字符串或字符串列表

重要:temperature 和 top_p 一般只调其中一个,不同时设为非默认值。OpenAI 官方建议二选一。

temperature:控制“创造力”

temperature 影响概率分布:温度越低,模型越倾向于选择概率最高的词;温度越高,低概率的词也有机会被选中。

  • 0—0.3:适合事实性任务(数学计算、代码生成、信息提取),输出稳定、可复现。
  • 0.7—1.0:适合通用对话、写作,有一定多样性但不离谱。
  • 1.0—2.0:高随机性,适合头脑风暴、创意写作,但也可能胡说八道。

最小可运行示例

下面的示例向同一个模型发送相同的提示词,对比不同 temperature 的输出差异:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import os
from openai import OpenAI

client = OpenAI(
api_key=os.environ["OPENAI_API_KEY"],
base_url=os.environ.get("OPENAI_BASE_URL"),
)

prompt = "用一句话描述'春天'。"

for temp in [0.0, 0.7, 1.5]:
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
temperature=temp,
max_tokens=100,
)
print(f"temperature={temp}: {response.choices[0].message.content}")

运行效果大致如下(每次可能有差异):

1
2
3
temperature=0.0: 春天是万物复苏、生机盎然的季节。
temperature=0.7: 春天是大自然从沉睡中苏醒的季节,带着温暖的风和盛开的花朵。
temperature=1.5: 春天像一幅被风掀开的画卷,泥土的呼吸和鸟儿的争吵一同涌进耳朵。

temperature=0.0 时输出稳定且朴实,1.5 时则出现了拟人化和诗化表达。

特别说明:temperature=0 并不保证完全确定,但实践中输出高度稳定。如果你必须保证完全可复现,还需要配合 seed 参数(部分模型支持)。

top_p:核采样

top_p(也叫 nucleus sampling)从另一个角度控制多样性:模型只从累积概率达到 p 的候选词中选择。

  • top_p=0.1:只看概率最高的前 10% 候选词,输出极为保守。
  • top_p=1.0:考虑所有候选词,等同于不做 top_p 限制。
  • 典型设置:靠 temperature 调节时 top_p 保持默认 1;改用 top_p 时 temperature 保持默认 1。
1
2
3
4
5
6
7
8
9
for p in [0.1, 0.5, 1.0]:
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "给一只猫起个名字。"}],
temperature=1.0, # 保持默认值
top_p=p,
max_tokens=20,
)
print(f"top_p={p}: {response.choices[0].message.content}")
1
2
3
top_p=0.1: 咪咪。
top_p=0.5: 糯米。
top_p=1.0: 芝麻糊。

top_p 越小,名字越“安全”和常见;越大,越可能出冷门名字。

实际使用建议:日常开发中优先调整 temperature,行为更直观。top_p 在你发现即使 temperature=0 模型仍然有一些你不想要的随机性时作为补充手段。

max_tokens:限制生成长度

max_tokens 控制模型最多生成多少 token。它不是“让模型写够这么多字”,而是“到了这个上限就截断”。

注意事项:

  • max_tokens 和输入 token 加起来不能超过模型的上下文窗口。
  • 设得太小,回答可能被截断;设得太大,既不经济也增加延迟。
  • 一般建议:先用默认值或较大的值,观察实际用量后再精调。
1
2
3
4
5
6
7
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "请用 200 字介绍深度学习。"}],
max_tokens=50,
)
print(response.choices[0].message.content)
print(f"finish_reason: {response.choices[0].finish_reason}")

输出可能被截断,finish_reason"length",表示因达到 max_tokens 而提前终止。正常情况下 finish_reason"stop"

stop:指定停止序列

stop 让你可以指定一个或多个字符串,模型生成到这些字符串时立即停止(停止符本身不会出现在输出中)。

这是控制输出结构最简单、最可靠的方法之一。常见场景:

  • 多轮对话格式:在自定义格式中,用 "\n用户:""\nUser:" 作为停止条件,防止模型自问自答。
  • 结构化输出:让模型生成列表时,用 "\n\n" 作为停止符,确保只输出一项。
1
2
3
4
5
6
7
8
9
10
11
12
# 场景:让模型写一句广告语,遇到句号就停
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你只输出一句简短广告语。"},
{"role": "user", "content": "为一款智能手环写广告语。"},
],
stop=["。"], # 遇到中文句号即停止
max_tokens=100,
)
print(repr(response.choices[0].message.content))
# 输出类似:'全天候守护你的健康' (第一个句号之前的内容,不含句号)
1
2
3
4
5
6
7
8
9
10
# 场景:多个停止符
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "列出三种水果:1."},
],
stop=["4.", "\n\n"], # 只要遇到其中之一就停止
max_tokens=100,
)
print(response.choices[0].message.content)

stop 是最被低估的参数之一。与其在提示词里写“只输出一句”“不要继续编”,不如直接设 stop——提示词是请求,stop 是硬约束。

常见问题

temperature 和 top_p 应该怎么组合? 默认情况下只调其中一个。如果你同时设 temperature=0.8 和 top_p=0.5,两个约束叠加可能导致模型行为难以预测。选择一种你理解得更清楚的参数来控制即可。

为什么 temperature=0 输出还会变化? ChatGPT 风格的模型本质上是随机系统,temperature=0 只是让分布极度尖锐,不是数学意义上的“确定”。部分模型提供 seed 参数,结合 temperature=0 可进一步稳定输出。如果你的任务必须完全可复现,请查阅所用模型的文档确认是否支持 seed。

max_tokens 设多大合适? 先看任务的典型输出长度。如果只是分类或关键词提取,256 通常足够;长文生成则视需要调到 2048 或更高。但不要一开始就设为模型的极限值——浪费钱也浪费响应时间。

stop 参数和模型生成的内容冲突怎么办? 比如你要让模型写一篇关于“句号”的文章,但 stop 设了 "。"。这种情况下要么不设 stop,改用 max_tokens;要么在 stop 之外配合提示词引导模型输出特定符号的替代方案。

参数速查表

场景 temperature max_tokens stop
事实问答 / 数据提取 0—0.3 256—1024 不设
代码生成 0—0.2 1024—4096 视语言设换行序列
日常对话 0.7—1.0 512—2048 不设
创意写作 0.9—1.5 2048+ 不设
固定格式输出 0—0.3 256—1024 设结束标记

参数不是死板配置,关键是根据任务特点和你观察到的实际输出做调整。下一篇我们将讨论流式输出——如何让模型的回复像打字一样逐字显示出来。

小结

  • temperature 是最常用的随机性控制参数,0 偏保守,1 偏多样。
  • top_p 从候选词概率累积角度限制随机性,与 temperature 二选一。
  • max_tokens 限制输出长度,太小会截断,太大浪费资源。
  • stop 是硬约束,比在提示词里“请求”模型停下更可靠。
  • finish_reason 指示结束原因:stop 正常结束,length 达到 max_tokens 上限。