首页 / 文章 / Temperature, Top-K, and Top-P: A Practical Guide to LLM Sampling

Temperature, Top-K, and Top-P: A Practical Guide to LLM Sampling

Learn how temperature, top-k, and top-p settings control LLM output, with practical recipes and pitfalls for tuning chatbots, coding assistants, and RAG systems.

2423 词

你将聊天机器人上线,人们都很喜欢。直到某个下午,有人上传了一张回复的截图,内容如此离奇,简直就像模型在做噩梦。与此同时,无论你如何表述问题,你的编程助手总是给出完全相同的泛化答案,就像一只记住了教学大纲的鹦鹉。

这两种现象都源于同一个原因:采样设置从未被调整过。

在幕后,模型会逐个词地进行数千次概率计算

  • 每一个单词。
  • 每一个逗号。
  • 接下来的每个想法。

而大多数开发者忽视的是:

回复的创造性、准确性或可预测性会因温度值、Top-K和Top-P这三项设置的不同而发生巨大变化。

这三个旋钮相当于控制语言模型行为的方向盘

无论你使用的是OpenAI的API、Anthropic的模型、Google Gemini还是Meta的Llama系列,真正了解这些参数会改变你使用它们的方式。

我们不会以学术的方式讲解,而是用你能实际应用的方法逐一介绍。

首先:大语言模型究竟如何生成文本

在探讨Temperature、Top-K和Top-P之前,有一个核心概念需要掌握。

语言模型并非像人类那样组合句子,而是逐个预测标记。

以这个提示语为例:

"JavaScript是"

模型会计算出一组可能的下一个标记及其概率:

awesome -> 30%
a -> 25%
the -> 15%
used -> 10%
not -> 8%
weird -> 7%
broken -> 5%

这些数值源自模型在大量文本训练过程中吸收的模式。

真正的问题是:它实际上会选择这些标记中的哪一个?

这一决策由采样参数决定,这些参数相当于对原始概率列表的过滤机制。

如果模型总是选择概率最高的那个标记,这种方法就被称为贪心解码。虽然听起来合乎逻辑,但在创意写作、对话以及任何需要细腻表达的任务中表现不佳,因为它往往会产生枯燥、重复且过于谨慎的文本。

相反,模型通常会从概率分布中采样,也就是说它们是根据可能性来选择标记,而非总是选取排名最高的那个。

温度参数:创造力的调节器

在这三个参数中,温度参数最为人熟知,但也是最常被误解的一个。

核心理念是:温度值决定了在采样词元之前,概率分布的集中程度或分散程度。

  • 低温(大约0.1到0.4):使分布更加集中。原本就概率较高的词元会变得更占优势,因此模型的行为更具可预测性、保守性和一致性。
  • 高温(大约0.8到1.5及以上):使分布更加平滑。那些原本概率较低的词元也有机会被选中,因此输出内容会更富有创意、更出人意料,但偶尔也会出现逻辑混乱的情况。
  • 温度=0:完全确定性的输出。模型始终会输出概率最高的那个词元——本质上就是贪婪解码。
  • 温度值 = 1.0:完全不进行调整。模型直接使用原始的、未经修改的概率值。
  • 数学原理(别担心,很简单)

    实际上,温度值会在将模型原始得分(对数几率)转换为概率值之前对其进行除法运算:

    adjusted_logit = original_logit / temperature
    

    经过重新缩放的对数几率值随后会通过softmax函数处理,从而生成最终的概率分布。

    • 除以较小的数值(低温):会使对数几率值之间的差距更大,从而使概率分布更加集中,模型能更自信地选择最优选项。
    • 除以较大的数值(高温):会使对数几率值相互靠近,使概率分布趋于平坦,并增加随机性。

    示例:温度值 = 0

    提示:“为一种AI编程工具撰写一句宣传语。”

    结果:“借助AI更快地构建软件。”

    重复这个请求十次,每次得到的都会是完全相同的句子。

    原因很简单:温度值为0时总是选择概率最高的那个选项,没有任何例外。

    这种确定性行为非常适合:

    • 代码生成
    • SQL查询
    • JSON输出
    • 结构化数据提取

    示例:温度值=0.3

    结果:“利用智能AI加速软件开发。”

    仍然相当一致,但灵活性稍高一些。

    这个数值范围非常适合:

    • 技术文档撰写
    • 文档编写
    • API说明

    示例:温度值=1.0

    结果:“将午夜时的创意转化为可运行代码的AI助手。”

    现在的输出更具个性与多样性。这类设置适合:

    • 博客写作
    • 营销文案
    • 头脑风暴会议

    示例:温度值=2.0

    结果:“用代码实现梦想,构建庞大系统,以硅基想象力重塑未来。”

    有想象力吗?当然。

    实用吗?不太行。

    若将温度值设置得过高,就有可能生成毫无意义的文本。

    何时该使用何种设置

    Use                     | CaseTemperature
    ========================|=================
    Code generation         | 0.0 – 0.2
    Factual Q&A / RAG.      | 0.1 – 0.3
    Summarization           | 0.3 – 0.5
    Chatbot/conversation.   | 0.6 – 0.8
    Creative writing        | 0.8 – 1.2
    Brainstorming/ideation. | 1.0 – 1.5
    

    什么是Top-K?

    Top-K限制了模型可以考虑的候选词条数量。

    模型不会考虑全部词汇表,而只聚焦于概率最高的K个词条。

    其基本规则为:

    “忽略排名在前K位的候选项之外的所有内容。”

    K = 50 时,模型仅从概率最高的50个下一个标记中采样。排名第51位及以后的内容无论原本的概率多高都会被完全剔除。

    其存在原因

    想象一个包含50,000个可能标记的分布。即使概率极低的标记偶尔也会被选中,从而导致奇怪或无意义的输出。Top-K机制起到了硬性限制的作用,相当于在说:“我们甚至不会考虑这些异常值。”

    示例

    提示词:

    “React是”

    候选的下一个标记:

    Token    -> Probability
    a        -> 35%
    the      -> 20%
    one      -> 15%
    becoming -> 10%
    fast     -> 8%
    useful   -> 7%
    wild     -> 5%
    

    Top-K = 1

    仅保留:[a]

    输出结果:“React是a”

    极其安全,没有创意上的变化。其功能与贪婪解码完全相同。

    Top-K = 3

    保留的词:[a, the, one]

    这种方式会带来一定程度的可控变化。

    可能的补全内容包括:

    • React是……
    • React就是……
    • React属于其中一种……

    这是较为合理的折中方案。

    Top-K = 5

    保留的词:[a, the, one, becoming, fast]

    变化空间更大,生成的回复明显更加多样化。

    Top-K = 50

    覆盖范围更广。虽然可能出现一些不寻常但可能有趣的词汇选择,同时产生异常结果的概率也会上升。

    Top-K的现实类比

    想象一下从包含200道菜的菜单中挑选食物。

    将Top-K设置为5意味着你只查看最推荐的五道菜。

    决策过程会更快,也不再那么令人望而生畏。这其实就是 Top-K 为语言模型所承担的功能。

    什么是 Top-P?(核心采样)

    Top-P 比 Top-K 采用了更为精细的方法。

    它不是根据固定数量的候选项来截断,而是依据累积概率来决定截断点。你会按概率从高到低的顺序不断添加词元,直到这些词元的总概率达到 P 为止,之后仅从该集合中抽取样本。

    因此,如果你将 P = 0.9,模型就会从概率总和占整体分布 90% 的最小词元组中抽取样本。

    为何称为“核心采样”?

    这一名称体现了这样一个理念:排名最高的标记构成了真实延续内容的核心,即“核心”。核心之外的所有内容都被视为噪声——那些模型虽然计算出了概率但并不适合作为采样候选的低概率尾部标记。

    示例概率:

    Top-P = 0.50

    持续添加标记,直到累计概率达到至少50%。

    A = 40% B = 25%

    合计 = 65%

    保留的标记:[A, B]

    Top-P = 0.80

    A = 40% B = 25% C = 20%

    合计 = 85%

    保留的标记:[A, B, C]

    Top-P = 0.95

    A+B+C+D = 95%

    保留的标记:[A, B, C, D]

    需要注意的是,Top-P会动态调整其候选池的大小。

    这正是它在现代系统中往往比Top-K更受青睐的原因。

    典型数值

    P    | ValueBehavior
    =====|============================
    0.5. | Very conservative, focused
    0.75 | Balanced
    0.9  | Standard creative tasks
    0.95 | More exploratory
    1.0  | No filtering (use all tokens)
    

    Top-K与Top-P的比较

    Top-K 使用固定数量的标记。

    Top-P 则使用可变数量的标记。

    示例:

    当概率分布呈现尖锐峰值时,Top-P 可能只会保留2个标记。

    而当概率分布较为分散时,Top-P 可能会保留15个标记。

    正是这种适应性使其如此有效。

    Top-K 是告诉模型“从这X个选项中选择”。而 Top-P 则是告诉模型“从所有可行的好选项中选择”。

    在实践中,这种区别非常重要。

    将它们结合使用(这才是关键所在)

    有一点很少被明确说明:温度参数、Top-K 和 Top-P 是依次应用的,而非单独使用。

    典型的采样流程如下:

    Raw logits
        ↓
    ÷ Temperature  (reshape the distribution)
        ↓
    Apply Top-K    (cut to top K tokens)
        ↓
    Apply Top-P    (cut to nucleus)
        ↓
    Sample         (pick one token from what's left)
    

    每个阶段都会进一步缩小候选令牌的范围,这些过滤器的应用顺序十分重要。

    实际项目中的实用方案

    方案1:代码助手

    temperature = 0.1
    top_p = 0.95
    top_k = 40
    

    在这种情况下,你需要的是可预测性、唯一的正确答案以及没有意外情况。较低的温度值能完成大部分工作,而Top-P则起到辅助约束的作用。

    方案2:聊天机器人

    temperature = 0.7
    top_p = 0.9
    top_k = 50
    

    这种方式能生成具有对话感、听起来自然的回复,且不会出现随机性。生成的文本更像人类语言而非机器语言。

    方案3:创意写作伙伴

    temperature = 1.1
    top_p = 0.95
    top_k = 0  # disabled
    

    给模型足够的探索空间。你追求的是真正的创意多样性,而非千篇一律的内容。此时会完全关闭Top-K功能,让Top-P独自负责内容筛选。

    方案4:事实型RAG系统

    temperature = 0.0
    top_p = 1.0
    top_k = 1
    

    这是一种完全贪婪的解码方式。由于模型已经掌握了相关上下文,因此需要得到最可能的单一答案,在类似发票处理这样的场景中绝不能有任何随机采样。

    方法5:博客写作

    Temperature = 0.8
    Top-K = 40
    Top-P = 0.95
    

    这种方式生成的文本自然且富有吸引力,非常适合用于长篇文章。

    方法6:故事写作

    Temperature = 1.2
    Top-K = 100
    Top-P = 0.98
    

    它倾向于产生富有想象力、难以预测的输出,非常适合用于创作小说。

    方法7:数据提取

    Temperature = 0
    Top-K = 1
    Top-P = 1
    

    这是一种严格且完全确定性的方法,非常适合用于JSON提取、分类或实体提取等任务。

    没人告诉你的隐患

    1. 温度值越高并不意味着输出更智能

    人们很容易想要提高温度值,期望模型“更努力地思考”或更具创造力。但实际上这样做只会引入噪声。模型会开始使用那些它认为出现概率较低的词元,而通常这是有充分理由的。其结果就是产生幻觉内容、逻辑混乱以及语法错误。由随机性驱动的创造力与基于合理推理产生的创造力并非同一回事。

    2. 温度值为0仅在单次会话中是确定性的

    当温度值为0时,模型实际上是在执行argmax操作,始终选择概率最高的那个词元。但在不同的硬件、批量大小或API版本下,微小的浮点数舍入差异仍可能导致输出略有不同。除非在API支持的情况下设置了随机种子,否则不要认为结果能够完全复现。

    3. Top-P与Top-K可能相互抵消

    如果将Top-K设置得非常低,比如K=5,而Top-P设置得较高,比如P=0.95,那么Top-K实际上会占据优势。因为采样范围已经被限制在5个标记内,Top-P就再也没有可进一步筛选的选项了。在配置时需明确究竟是哪个参数在起真正的过滤作用。

    4. 不同提供商的默认值不同

    OpenAI的GPT-4默认值为temperature=1.0top_p=1.0。Anthropic的Claude系列模型没有统一的默认值,会因版本不同而有所差异。Google的Gemini在某些配置中通常使用temperature=1.0top_p=0.95top_k=40

    务必亲自验证这些数值,而非凭猜测行事。若在不调整这些参数的情况下将同一应用程序移植到不同模型上,可能会导致行为出现显著差异。

    推荐默认值

    一个合理的通用起始值如下:

    需根据具体任务调整这些数值。

    你需要牢记的思维模型

    若其他内容都记不住,至少要记住这点:

    “温度”参数控制随机性,“Top-K”参数决定可选选项的数量,“Top-P”参数则设定这些选项出现的概率范围。

    这就是全部要点。

    一旦理解了这三者之间的相互作用,你就不再只是“使用”AI模型,而是开始有意识地设计其输出结果。正是这种转变,区分了普通的提示方式与专业级的AI系统。

    今后,这一区别将愈发重要。

    总结

    许多开发者把全部精力都投入到优化提示词上,但提示词仅是其中的一半。采样参数则是那些不太显眼却同样起着关键作用的控制因素。

    很多时候,它们甚至比提示词本身的措辞更为重要。

    下次大语言模型生成奇怪结果时,不要立刻责怪模型本身。

    不妨检查以下内容:

    • 温度参数
    • Top-K
    • Top-P

    有时犯错的并非模型,而是你的配置。一旦明白这一点,你就能更深入地掌控这些系统的运行方式。

    愉快编码!

    相关阅读

  • AI工程概念的分级图及应用场景 — 了解哪些AI工程概念决定了系统是否能够正常运行,哪些在投入生产后至关重要,而哪些可以暂缓处理。
  • TypeSafe AI的Jev模型:用于类型化决策的非聊天式模型 — 本文阐述了TypeSafe AI的Jev模型如何完全跳过文本生成,直接返回经过校准的类型化答案,以及这种设计在哪些场景下能带来实际优势。
  • 30种源自实际日常使用的实用Claude提示技巧 —— 这篇文章对30种Claude提示技巧进行了实地测试与分析,按照这些技巧的实际功能进行分类,涵盖从简单指令到完整提示系统的内容。