Skip to content

大模型在生成每一个 Token 的时候,都不是"直接写"出来的,而是通过一个"概率轮盘"来决定下一个 Token 是什么

注:在本文中,我们使用"Token"而不是"词"来指代模型处理的最小单位。一个Token可能是一个完整的词,也可能是一个词的一部分,甚至是一个标点符号。例如,"不错"这个词可能被切分为两个Token:"不"和"错"。

想象一下,在生成"今天天气真"之后,模型内部会计算一个列表,列出所有可能的下一个Token以及它们的概率:

  • "好":85%
  • "不错":10%
  • "棒":3%
  • "糟":0.5%
  • "热":0.4%
  • ...
  • "龙":0.00001%

模型的任务就是从这个概率轮盘上,选出一个Token作为下一步的输出。我们接下来要讲的这4个参数,就是用来调校和控制这个概率轮盘以及选择方式的工具。

1. temperature

  • 一句话概括: 控制模型输出的"随机性"和"创造性"的阀门。
  • 作用机制:
    • 这个参数直接作用于上面提到的那个概率列表。它通过一个叫做 Softmax 的数学公式来调整概率分布。
    • temperature 较低 (比如 0.1, 0.2): 它会"锐化"概率分布。高概率的Token(如"好")会变得更高,低概率的Token会趋近于0。这使得模型几乎总是选择最常见、最符合逻辑的那个Token。轮盘上的"好"那一格会变得巨大,其他格变得微不足道。
    • temperature 较高 (比如 0.8, 1.0, 1.5): 它会"平滑"概率分布。高概率和低概率Token之间的差距会变小,给了那些不那么常见、但也有可能性的Token(如"棒"、"热")更多的机会被选中。这增加了输出的随机性、多样性和创造性。轮盘上各个格的大小差距会缩小。
  • 直白的比喻:temperature 就像一个创意兴奋剂的剂量
    • 低剂量 (低 temperature): 大脑非常冷静、理性,只会说最稳妥、最合乎逻辑的话。
    • 高剂量 (高 temperature): 大脑变得兴奋、天马行空,可能会说出一些出人意料、富有创意甚至有点奇怪的话。
  • 效果与应用场景:
    • 调低: 适用于需要精确、事实性的回答,如:客服问答、代码生成、数学计算、文章摘要。
    • 调高: 适用于需要创造力、多样性的场景,如:写诗、写故事、市场营销文案、头脑风暴。

2. top_k

  • 一句话概括: 限制模型在选择下一个Token时,只从概率最高的 k 个Token中进行选择。
  • 作用机制:
    • 这是一个简单粗暴的截断方法。在模型计算出所有候选Token的概率后,top_k会先对它们进行排序,然后只保留排名前 k 的Token,形成一个"候选Token池"。最后,模型再从这个小得多的池子里根据它们的相对概率进行抽样(这个抽样过程依然受 temperature 影响)。
    • 例如,如果 k=3,模型在"今天天气真"之后,只会考虑"好"、"不"+"错"、"棒"这3个Token,其他所有Token的概率直接被视为0(哪怕是"糟"),绝无可能被选中。
  • 直白的比喻:top_k 就像一个考前划重点的老师
    • 老师说:"这次考试只考前 k 个重点知识。" 于是你只复习这 k 个重点,其他的看都不看。k 越小,重点范围越窄,考试(输出)结果越容易预测。
  • 效果与应用场景:
    • 调低 (如 k=5, 10): 可以有效排除那些非常不合逻辑、奇怪的Token,让输出更安全、更可控。
    • 调高 (如 k=50): 允许更多可能性,但如果 temperature 也很高,可能会引入一些不相关的Token。通常不建议设置得过高。
    • 缺点: k 是固定的,不够智能。有时最合理的Token只有一个(比如1+1=后面只能是2),有时合理的Token有很多(比如写诗),top_k 无法动态适应。

3. top_p (也叫 Nucleus Sampling)

  • 一句话概括: 动态地选择一个核心候选Token池,池中Token的概率总和不低于 p
  • 作用机制:
    • 这是一种比 top_k 更智能的截断方法。它也是先将所有Token按概率排序,然后从高到低逐个累加它们的概率,直到总和刚刚超过 p 这个阈值。所有被累加进来的Token构成了"候选Token池"。
    • 例如,p=0.9。模型会选择:
      • "好"(85%) -> 当前总和 0.85
      • "不"+"错"(10%) -> 累加后总和 0.95,已经超过了0.9。
      • 于是,候选Token池就是 {"好", "不"+"错"}。模型将从这两个Token中选择一个。
    • 关键点: 候选Token池的大小是动态变化的。如果某个上下文下,一个Token的概率极高(如"伊丽莎白二世是英国女" -> "王"的概率可能是99.9%),那么候选池可能就只有1个Token。如果上下文很开放,候选池可能会包含很多Token。
  • 直白的比喻:top_p 就像一个购物预算
    • 你有 p(比如95%)的预算,用来"购买"最有可能的Token。你从最贵的(概率最高)开始买,一个一个放进购物车,直到花掉95%的预算为止。购物车里的东西就是你的候选Token。
  • 效果与应用场景:
    • 它在 保留多样性(防止错过好Token)抑制胡言乱语(排除垃圾Token) 之间取得了绝佳的平衡。
    • 在大多数场景下,top_p 是比 top_k 更受推荐的选择。通常设置在 0.850.95 之间效果很好。
    • 注意: 通常我们只在 top_ktop_p 中选择一个使用,不要同时设置。

4. frequency_penalty (频率惩罚)

  • 一句话概括: 降低那些在已生成文本中重复出现的Token的被选中概率。
  • 作用机制:
    • 它直接修改模型计算出的原始概率(在应用 temperature 之前)。模型会检查到目前为止已经生成了哪些Token以及它们出现的次数。
    • 对于每个已经在前面出现过的Token,模型会根据其出现频率,对其下一次被选中的概率进行"罚款"(降低其概率值)。一个Token出现的次数越多,罚款越重。
    • 惩罚值为正数(如 0.1 到 1.0)时生效。值越大,惩罚力度越强。
  • 直白的比喻:frequency_penalty 就像一个重复发言税
    • 你在会议上每重复说一次同一个Token,就要交一次税。重复的次数越多,税率越高,导致你下次再说这个Token的"成本"就越高,你就会倾向于换个Token说。
  • 效果与应用场景:
    • 主要目的: 减少无意义的重复,提升文本的可读性和信息量。当你发现模型总是在说车轱辘话时(例如,"这是一个很好的例子,这个例子非常好,这个例子..."),就可以调高这个参数。
    • 调高: 强力避免重复,鼓励模型使用新Token,让文本更多样化。
    • 调低 (或为0): 对重复不作惩罚,模型可能会更频繁地重复一些高频核心Token。

总结与协同工作

这四个参数协同工作,共同塑造了模型的最终输出:

  1. 第一步:原始计算

    模型根据上下文,计算出所有候选Token的原始概率分数(Logits)。

  2. 第二步:施加惩罚

    frequency_penalty 登场,检查已生成内容,对重复Token的原始分数进行"罚款"。

  3. 第三步:温度调控

    temperature 对被罚款后的分数进行加工,形成最终的、或尖锐或平滑的概率分布。

  4. 第四步:筛选候选池

    top_ktop_p 登场,从这个最终的概率分布中划定一个候选范围。

  5. 第五步:最终抽样

    模型从这个小小的、精心筛选过的候选池里,随机选择一个Token作为输出。

通用建议:

  • 优先调整 temperaturetop_p 这是最核心的两个参数。通常将 top_p 固定在 0.9 左右,然后微调 temperature 来寻找创造性和准确性之间的平衡点。
  • 当发现有明显重复时,再引入 frequency_penalty
  • top_k 可以在特定、需要强力控制输出范围的场景下替代 top_p 使用。