常用生成参数:temperature、top_p、max_tokens 与停止条件
前几篇文章我们学会了调用 API、管理对话历史和裁剪 token。这些解决了“能不能请求”的问题,但还没涉及“请求后得到什么样的输出”。同样的提示词,模型可能给出严谨的学术回答,也可能脑洞大开胡说八道——这取决于生成参数。本文介绍四个核心参数:temperature、top_p、max_tokens 和 stop。
生成参数概览
这四个参数在 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 | import os |
运行效果大致如下(每次可能有差异):
1 | temperature=0.0: 春天是万物复苏、生机盎然的季节。 |
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 | for p in [0.1, 0.5, 1.0]: |
1 | top_p=0.1: 咪咪。 |
top_p 越小,名字越“安全”和常见;越大,越可能出冷门名字。
实际使用建议:日常开发中优先调整 temperature,行为更直观。top_p 在你发现即使 temperature=0 模型仍然有一些你不想要的随机性时作为补充手段。
max_tokens:限制生成长度
max_tokens 控制模型最多生成多少 token。它不是“让模型写够这么多字”,而是“到了这个上限就截断”。
注意事项:
max_tokens和输入 token 加起来不能超过模型的上下文窗口。- 设得太小,回答可能被截断;设得太大,既不经济也增加延迟。
- 一般建议:先用默认值或较大的值,观察实际用量后再精调。
1 | response = client.chat.completions.create( |
输出可能被截断,finish_reason 为 "length",表示因达到 max_tokens 而提前终止。正常情况下 finish_reason 为 "stop"。
stop:指定停止序列
stop 让你可以指定一个或多个字符串,模型生成到这些字符串时立即停止(停止符本身不会出现在输出中)。
这是控制输出结构最简单、最可靠的方法之一。常见场景:
- 多轮对话格式:在自定义格式中,用
"\n用户:"或"\nUser:"作为停止条件,防止模型自问自答。 - 结构化输出:让模型生成列表时,用
"\n\n"作为停止符,确保只输出一项。
1 | # 场景:让模型写一句广告语,遇到句号就停 |
1 | # 场景:多个停止符 |
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 上限。