大模型配置temperature、top_p、top_k的参数确定
这三个参数都在控制“模型下一步选哪个 token”,但作用不同:
temperature=1
top_p=0.95
extra_body={"top_k": 40}
可以理解为:
temperature:调随机程度
top_p:按累计概率截断候选词
top_k:只保留概率最高的 K 个候选词
1. temperature 的影响
temperature 控制概率分布的“尖锐/平滑”。
temperature 低
例如:
temperature=0.1
模型更保守,更倾向于选最高概率 token。
适合:
代码生成
JSON 输出
工具调用
工程查询
事实问答
MCP 参数解析
特点:
稳定
重复性强
不容易跑偏
但可能比较死板
temperature 高
例如:
temperature=1.0
模型会更愿意从非最高概率 token 中采样。
适合:
创意写作
头脑风暴
聊天
营销文案
多样化回答
特点:
更自然
更有变化
但更容易不稳定
如果你做的是 MCP 查重量、解析客户参数、输出 JSON,temperature=1 偏高。
2. top_k 的影响
top_k=40 的意思是:
每一步只允许模型从概率最高的 40 个 token 里选
假设模型下一步候选 token 有几万个,但只看前 40 个。
top_k 小
例如:
top_k=5
候选范围很窄。
结果:
更稳定
更保守
更少胡说
表达可能重复
适合:
固定格式输出
工具参数生成
短回答
分类任务
top_k 大
例如:
top_k=100
候选范围更宽。
结果:
更多样
更灵活
可能更有创造性
但也更可能跑偏
top_k=40
这是一个比较常见的折中值:
不会太死
也不会太放飞
3. top_p 的影响
top_p=0.95 叫 nucleus sampling,意思是:
从概率累计达到 95% 的候选 token 中采样
它不是固定保留多少个 token,而是根据当前概率分布动态变化。
情况 A:模型很确定
比如下一步概率是:
A: 90%
B: 5%
C: 2%
D: 1%
...
top_p=0.95 可能只保留:
A + B = 95%
候选很少,所以输出会很稳定。
情况 B:模型不确定
比如下一步概率是:
A: 10%
B: 9%
C: 8%
D: 7%
E: 6%
...
为了累计到 95%,可能要保留很多候选。
所以输出会更发散。
这就是 top_p 和 top_k 的区别:
top_k:固定保留前 K 个
top_p:按概率累计动态保留
4. top_k 和 top_p 同时设置时会怎样?
通常推理器会先后应用多个过滤条件,最后取交集。
你设置:
top_p=0.95
top_k=40
大致意思是:
候选 token 必须在 top 40 里面
同时也必须在累计概率 95% 的集合里
所以实际候选集合是:
top_k 过滤后的候选 ∩ top_p 过滤后的候选
谁更严格,谁影响更大。
5. 不同状态下的影响
状态 1:模型很确定
例如问:
NPS 1/8,10S 的重量是多少?
如果上下文里有明确数据,模型下一步通常很确定。
这时:
top_p 影响较小
top_k 影响较小
temperature 仍然影响措辞
推荐:
temperature=0.1
top_p=0.9
extra_body={"top_k": 20}
状态 2:模型需要创作
例如:
帮我写一个产品宣传文案
这时模型有很多合理表达。
temperature 影响很大
top_p 影响很大
top_k 太小会限制创意
推荐:
temperature=0.8
top_p=0.95
extra_body={"top_k": 40}
或者:
temperature=1.0
top_p=0.95
extra_body={"top_k": 50}
状态 3:模型要输出 JSON / 工具参数
例如:
{
"nps": "1/8",
"schedule": "10S"
}
这时不希望模型自由发挥。
temperature 太高会增加格式错误概率
top_p 太高会增加非预期 token
top_k 太大也可能增加跑偏
推荐:
temperature=0.0
top_p=0.9
extra_body={"top_k": 20}
或者:
temperature=0.2
top_p=0.9
extra_body={"top_k": 20}
状态 4:模型在做推理 / 规划
例如:
判断客户说的“2寸薄壁管”应该查哪个 schedule
需要一点灵活性,但不能太发散。
推荐:
temperature=0.3
top_p=0.9
extra_body={"top_k": 30}
状态 5:模型老是重复
如果模型输出重复,比如:
好的好的好的好的...
可以尝试:
temperature=0.7
top_p=0.95
extra_body={"top_k": 40}
同时最好加:
frequency_penalty=0.2
presence_penalty=0.1
如果后端支持的话。
状态 6:模型胡说、跑偏、不按格式
降低随机性:
temperature=0.1
top_p=0.8
extra_body={"top_k": 10}
并且加强 prompt:
只输出 JSON,不要解释。
字段必须为 nps, dn, schedule。
未知值填 null。
6. 参数组合建议
| 场景 | temperature | top_p | top_k |
|---|---|---|---|
| 精确问答 | 0.1–0.3 | 0.8–0.9 | 10–30 |
| JSON 输出 | 0–0.2 | 0.8–0.9 | 10–20 |
| MCP 工具调用 | 0–0.3 | 0.8–0.9 | 10–30 |
| 普通聊天 | 0.6–0.9 | 0.9–0.95 | 30–50 |
| 创意写作 | 0.8–1.1 | 0.95–0.98 | 40–100 |
| 头脑风暴 | 1.0–1.2 | 0.95–0.98 | 50–100 |
| 代码生成 | 0.1–0.4 | 0.8–0.95 | 20–40 |
7. 对你现在这组参数的评价
你现在是:
temperature=1
top_p=0.95
max_tokens=512
extra_body={
"top_k": 40
}
这组适合:
聊天
解释概念
创意回答
自然语言生成
不太适合:
严格 JSON
MCP 参数抽取
数据库查询
工程规格问答
工具调用
对于你的管道 MCP 场景,我建议改成:
temperature=0.2
top_p=0.9
max_tokens=512
extra_body={
"top_k": 20
}
如果是让模型生成自然解释,可以稍微高一点:
temperature=0.5
top_p=0.9
max_tokens=512
extra_body={
"top_k": 30
}
一句话总结:
temperature 决定随机强度,top_k 限制最多看几个候选,top_p 限制候选概率累计范围。工程查询和工具调用要低 temperature;创意聊天可以高 temperature。

浙公网安备 33010602011771号