通俗理解LLM大模型配置参数浅析:核心采样参数(温度、top-p、top-k)、惩罚参数(频率惩罚、存在惩罚、重复惩罚)、输出参数(Max Tokens、停止序列、seed随机种子)及配置综合使用
LLM 原理是根据前面的 token 预测后面的 token,Prompt 是最早输入的 token。LLM 有一些配置也能影响模型输出。
我用一个点菜的比喻来串联所有参数:想象 LLM 是一个厨师,每次要"选"下一个词,就像从菜单上点一道菜。
一、核心采样参数
1、温度 Temperature
温度是 softmax 函数中的除数,一般取值从 0 ~ 1(2)。
温度越低,生成的结果越确定,温度越高,生成的结果越随机。
在代码、数学、事实问题方面取低值;文学创作、营销方面取高值。
比喻:厨师的"冒险精神"
低温 (0~0.3) → 保守厨师:只做最拿手的菜
中温 (0.5~0.8) → 正常厨师:偶尔尝试新菜
高温 (1.0~1.5) → 疯狂厨师:什么奇怪搭配都敢试
原理:
原始概率: 好(72%), 棒(20%), 差(8%)
T=0.3 → 好(98%), 棒(1.9%), 差(0.1%) # 差距拉大
T=1.0 → 好(72%), 棒(20%), 差(8%) # 保持原样
T=1.5 → 好(55%), 棒(28%), 差(17%) # 差距缩小
2、Top-K & Top-P
LLM 预测的下一堆 token 中,是一群概率加起来为 1 的 token,Top-K 表示挑选前 K 个概率最大的 token,Top-P 表示挑选累计概率超过 P 的前 n 个 token。比如 token 对应的概率队列是 [0.4,0.3,0.2,0.1],Top-K 为 2 表示取 [0.4,0.3],Top-P 为 0.3 取 [0.4]。
Top-P 也叫核采样,一般只用这个,如果两个都配置了则取两者结果的交集。
(1)Top-k 比喻:只看菜单前 k 名
Top-k = 3 → 只从排名前3的菜里选,其他不考虑
候选词概率:
好(40%) ✓
棒(30%) ✓
妙(15%) ✓
差(10%) ✗ 被淘汰
坏(5%) ✗ 被淘汰
特点:(1)简单粗暴,固定数量(2)k 太小 → 太死板(3)k 太大 → 可能选到奇怪的词
(2)Top-p(核采样 / Nucleus Sampling) 比喻:选"够热门"的菜,凑够 p% 的人气就停
Top-p = 0.9 → 从高到低累加,直到概率和 ≥ 90%
候选词概率:
好(40%) → 累计40% ✓
棒(30%) → 累计70% ✓
妙(15%) → 累计85% ✓
差(10%) → 累计95% ✓ (刚超过90%,入选)
坏(5%) → ✗ 不需要了
(3)Top-p vs Top-k 的区别:
| 情况 | Top-k=3 | Top-p=0.9 |
|---|---|---|
| 概率分布均匀 | 只选3个 | 可能选很多个 |
| 概率分布集中 | 还是选3个 | 可能只选1-2个 |
3、三者如何配合
┌─────────────────────────────────────────────────┐
│ 采样流程 │
├─────────────────────────────────────────────────┤
│ │
│ [模型输出 logits] │
│ ↓ │
│ [Temperature 缩放] ← 调整概率分布的"尖锐度" │
│ ↓ │
│ [Top-k 过滤] ← 只保留前k个 │
│ ↓ │
│ [Top-p 过滤] ← 再按累积概率筛选 │
│ ↓ │
│ [重新归一化概率] │
│ ↓ │
│ [随机采样] → 输出一个词 │
│ │
└─────────────────────────────────────────────────┘
二、惩罚参数
1、Frequency Penalty(频率惩罚)比喻:这道菜点过了,下次少推荐
惩罚力度 与 出现次数 成正比
"我喜欢猫,猫很可爱,猫..."
↑
"猫"出现3次了,大幅降低再选"猫"的概率
取值:-2.0 ~ 2.0
(1)正值:惩罚重复(推荐 0.5~1.0)
(2)负值:鼓励重复(几乎不用)
(3)0:不干预
2、Presence Penalty(存在惩罚)比喻:只要点过,就不想再点(不管点了几次)
只看"有没有出现过",不看次数
"我喜欢猫,猫很可爱,猫..."
↑
"猫"出现过 → 固定惩罚(不管出现1次还是10次)
(1)vs 频率惩罚
| 参数 | 惩罚依据 | 效果 |
|---|---|---|
| Frequency - 频率惩罚 | 出现次数 | 减少高频词重复 |
| Presence - 存在惩罚 | 是否出现过 | 鼓励话题多样性 |
Frequency=0.5 + Presence=0.5
→ 减少重复词 + 鼓励新话题
3、Repetition Penalty(重复惩罚)比喻:另一种防复读机制
对已出现的 token 统一乘以惩罚系数
原始概率 × (1 / repetition_penalty)
常用值:1.0~1.5
- 1.0 = 不惩罚
- 1.2 = 适度惩罚
- 1.5 = 强力惩罚
三、输出控制参数详解
整体比喻:LLM 是一个"话痨演员",想象 LLM 是一个话特别多的演员,给他一个话题他能说一整天。输出控制参数就是导演的控制手段:
(1)Max Tokens = "最多说100个字就停!"
(2)Stop Sequences = "说到'谢谢'就闭嘴!"
(3)Seed = "按照剧本123号来演,每次都一样"
1、Max Tokens(最大令牌数)
通俗理解就是给模型设置一个"字数限制",就像老师布置作文:"这篇作文最多写500字"
你: "介绍一下北京"
max_tokens = 50 → 模型说50个token就被强制打断
max_tokens = 500 → 模型可以说500个token
(1)⚠️ 什么是 Token?Token ≠ 字数,它是模型处理文本的最小单位
中文: "我爱北京天安门"
→ 可能拆成: ["我", "爱", "北京", "天安", "门"]
→ 5个token
英文: "I love Beijing"
→ 拆成: ["I", " love", " Beijing"]
→ 3个token
代码: "print('hello')"
→ 拆成: ["print", "('", "hello", "')"]
→ 4个token
经验公式:(1)中文:1个字 ≈ 1~2个token(2)英文:1个单词 ≈ 1个token(3)代码:比较碎,token数偏多
(2)案例演示
案例1:max_tokens 太小,回答被截断
问: "请详细介绍一下Python语言的特点"
max_tokens: 30
答: "Python是一种高级编程语言,具有以下特点:
1. 简洁易读:Python的语法..."
← 戛然而止!因为到了30个token
案例2:合适的 max_tokens
问: "请详细介绍一下Python语言的特点"
max_tokens: 300
答: "Python是一种高级编程语言,具有以下特点:
1. 简洁易读:Python的语法简洁清晰
2. 跨平台:可在Windows、Mac、Linux运行
3. 丰富的库:拥有大量第三方库
4. 动态类型:不需要声明变量类型
..."
← 完整回答
(3)设置建议
| 场景 | 建议值 | 原因 |
|---|---|---|
| 简短问答 | 100~200 | 防止啰嗦 |
| 代码生成 | 500~1000 | 代码通常较长 |
| 文章写作 | 1000~2000 | 需要完整内容 |
| 翻译 | 原文长度×1.5 | 预留空间 |
2、Stop Sequences(停止序列)
通俗理解:给模型设置"暗号",说到这个词就立刻停下就像:
(1)唱歌比赛说"谢谢"就表示唱完了
(2)写信写"此致敬礼"就表示信写完了
stop = ["。", "\n\n", "END"]
# 模型生成时,一旦输出这些字符串,立刻停止
案例1:不设置 stop,模型可能啰嗦
问: "北京的首都是哪里?"
答: "北京是中国的首都。
补充说明:北京是中国的政治、文化中心,
有着悠久的历史,著名景点包括故宫、
长城、天坛等。北京还是2008年奥运会
的举办城市..."
← 模型自己加戏,说了一堆没问的内容
案例2:设置 stop=['。']
问: "北京的首都是哪里?"
stop: ["。"]
答: "北京是中国的首都。" ← 遇到句号就停了,干净利落
案例3:结构化输出时特别有用
prompt = """
请用JSON格式回答:
{
"name": "用户姓名",
"age": 年龄
}
END
"""
stop = ["END", "```"] # 遇到END或代码块结束就停
# 模型输出:
{
"name": "张三",
"age": 25
}
# ← 在这里停止,不会继续瞎说
3、Seed(随机种子)详解
3.1、什么是 seed?
生活中的比喻,想象你在玩一个抽奖转盘:
普通转盘(无 seed):
每次转,停在哪里完全随机
→ 第1次:一等奖
→ 第2次:三等奖
→ 第3次:谢谢参与
每次结果都不同!
作弊转盘(有 seed):
转盘内部有个"记忆芯片",记住了转动顺序
→ seed=42 时:永远停在二等奖
→ seed=123 时:永远停在一等奖
同样的 seed,每次结果都一样!
3.2、在 LLM 里的作用?
(1)不设置 seed(默认行为)
你: "讲个笑话"
第1次回答: "为什么程序员分不清万圣节和圣诞节?
因为 Oct 31 = Dec 25"
第2次回答: "一只蜗牛爬上苹果树,毛毛虫问:你来干嘛?
蜗牛说:我来等苹果熟..."
第3次回答: "我买了本书叫《如何解决一半的问题》,
回家发现只有前半本..."
↑ 同样的问题,每次回答都不同
(2)设置 seed=42
你: "讲个笑话" (seed=42)
第1次回答: "为什么程序员分不清万圣节和圣诞节?
因为 Oct 31 = Dec 25"
第2次回答: "为什么程序员分不清万圣节和圣诞节?
因为 Oct 31 = Dec 25"
第3次回答: "为什么程序员分不清万圣节和圣诞节?
因为 Oct 31 = Dec 25"
↑ 同样的问题 + 同样的 seed = 每次回答都一样
3.3、为什么需要 seed?
(1)场景1:调试代码
问题:模型有时候输出格式不对,但不是每次都出错
没有 seed:
→ 运行10次,可能只有2次出错
→ 很难抓到 bug
有 seed:
→ 找到出错的那次,记下 seed 值
→ 每次用这个 seed 都能复现问题
→ 方便修复
(2)场景2:A/B 测试对比
想对比两个 prompt 哪个效果好:
prompt A: "请简洁回答:什么是AI?"
prompt B: "用一句话解释:什么是AI?"
没有 seed:
→ 每次结果都不同,无法公平对比
有 seed:
→ 两个 prompt 用同样的 seed
→ 只有 prompt 不同,其他条件一样
→ 公平对比效果
(3)场景3:学术研究
发表论文需要:实验结果可复现
没有 seed:
→ 别人无法复现你的结果
→ 论文可信度低
有 seed:
→ 公开你的 seed 值
→ 别人可以复现完全一样的结果
→ 论文更可信
(4)代码示例
from openai import OpenAI
client = OpenAI()
# ===== 不设置 seed:每次结果可能不同 =====
response1 = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "讲个笑话"}]
# 没有 seed 参数
)
# ===== 设置 seed:每次结果相同 =====
response2 = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "讲个笑话"}],
seed=42 # 固定随机种子
)
# 场景:生成产品描述,要求简洁、可复现
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "user",
"content": "用一句话描述iPhone"
}],
max_tokens=50, # 限制长度,防止啰嗦
stop=["。", "."], # 说完一句就停
seed=42 # 保证每次结果一样
)
print(response.choices[0].message.content)
# 输出: "iPhone是苹果公司推出的高端智能手机"
(5)使用建议
| 情况 | 是否设置 Seed | 原因 |
|---|---|---|
| 日常聊天 | ❌ 不设置 | 希望回答有变化 |
| 创意写作 | ❌ 不设置 | 需要多样性 |
| 调试问题 | ✅ 设置 | 方便复现 bug |
| 对比测试 | ✅ 设置 | 控制变量 |
| 学术实验 | ✅ 设置 | 结果可复现 |
| 生产环境 | ❌ 通常不设置 | 用户体验要多样 |
(6)注意事项
⚠️ Seed 不是 100% 精确复现
可能导致差异的因素:
1. 模型版本更新了
2. 不同的 API 服务商
3. 服务器负载变化(极少数情况)
但在同一环境下,99% 的情况都能复现
(7)一句话总结:Seed 就是给"随机"加一个开关:关掉随机性,让每次输出都一样。
四、参数速查表
| 参数 | 取值范围 | 默认值 | 作用 |
|---|---|---|---|
| temperature | 0 ~ 2 | 1.0 | 控制随机性 |
| top_k | 1 ~ 词表大小 | 50 | 候选词数量上限 |
| top_p | 0 ~ 1 | 1.0 | 累积概率阈值 |
| frequency_penalty | -2 ~ 2 | 0 | 按次数惩罚重复 |
| presence_penalty | -2 ~ 2 | 0 | 按存在惩罚重复 |
| max_tokens | 1 ~ 上限 | 模型上限 | 最大输出长度 |
| stop | 字符串数组 | 无 | 停止生成的标记 |
| seed | 整数 | 随机 | 随机种子 |
1、场景配置推荐
(1)代码生成:要确定性,不要创意
{
"temperature": 0.2,
"top_p": 0.95,
"frequency_penalty": 0,
"presence_penalty": 0
}
(2)创意写作:要多样性,避免重复
{
"temperature": 1.0,
"top_p": 0.9,
"frequency_penalty": 0.5,
"presence_penalty": 0.5
}
(3)客服问答:稳定回答,略有变化
{
"temperature": 0.3,
"top_p": 0.9,
"frequency_penalty": 0.3,
"presence_penalty": 0
}
(4)头脑风暴:最大创意,避免套路
{
"temperature": 1.3,
"top_p": 0.95,
"frequency_penalty": 0.8,
"presence_penalty": 0.8
}
2、常见误区
| 误区 | 正解 |
|---|---|
| "温度越低越好" | 太低会死板,失去自然感 |
| "top_p 和 top_k 二选一" | 可以同时使用,效果叠加 |
| "惩罚参数越高越好" | 太高会导致语句不通顺 |
| "max_tokens 设很大没关系" | 浪费算力和费用 |
3、参数优先级:优先级主要是看先调哪个?按影响力排序:
1. temperature ← 影响最大,优先调
2. top_p ← 与temperature配合
3. max_tokens ← 根据任务需求定
4. frequency_penalty ← 解决重复问题时调
5. presence_penalty ← 需要多样性时调
4、常见问题排查
| 现象 | 可能原因 | 调整建议 |
|---|---|---|
| 输出太死板/重复 | temperature 太低 | 提高到 0.7+ |
| 输出胡说八道 | temperature 太高 | 降低到 0.5 以下 |
| 总是输出同样的内容 | top_p 太低 | 提高到 0.9+ |
| 同一个词反复出现 | 缺少惩罚 | 加 frequency_penalty |
| 话题单一不发散 | 缺少多样性 | 加 presence_penalty |
| 回答截断不完整 | max_tokens 太小 | 增加 token 上限 |

浙公网安备 33010602011771号