采样与生成参数

生成不是「模型内部唯一正确的下一词」,而是按 采样参数 从词表分布里取 token。vLLM 离线用 SamplingParams;在线则把同一套概念映射到 OpenAI 字段和 extra_body

默认值可能来自模型仓库的 generation_config.json,见 OpenAI 兼容 API。调参前先固定 max_tokens,避免无限生成占满调度槽。


离线:SamplingParams

from vllm import LLM, SamplingParams

llm = LLM(model="Qwen/Qwen2.5-0.5B-Instruct")

greedy = SamplingParams(temperature=0, max_tokens=64)
sampled = SamplingParams(
    temperature=0.8,
    top_p=0.95,
    top_k=50,
    max_tokens=64,
)

prompt = "Write one short slogan for a GPU inference engine."
print("greedy:", llm.generate(prompt, greedy)[0].outputs[0].text)
print("sampled:", llm.generate(prompt, sampled)[0].outputs[0].text)

同一 LLM 实例可复用;换的是每批请求的 SamplingParams。Instruct 模型也可用 llm.chat(messages, sampling_params=...)(方法名以当前 API 为准)。


参数直觉

参数作用实践
temperature越大越随机;0 近贪婪(实现细节以版本为准)事实问答偏低;头脑风暴偏高
top_p核采样:只在累积概率达 p 的集合里抽常与 temperature 一起,如 0.90.95
top_k只保留概率最高的 k 个 tokenOpenAI 官方字段没有,走 extra_body
max_tokens最多新生成多少 token必设心理上限,保护显存与延迟
stop / stop_token_ids遇到停止串就结束防止模型续写到下一轮角色标签
n每条 prompt 返回几条候选评测、选优;显存与时间倍增
presence / frequency penalty抑制重复长文重复时可小幅打开
seed尽量可复现完全位级复现仍受内核与批大小影响

把 temperature 调到很高却把 top_p 设成极小,效果会互相打架。一次只动一两个旋钮,对比同一 prompt。


贪婪 vs 采样

  • 贪婪 / 近确定性: temperature=0(或极低)+ 不靠随机核。适合抽取、分类、格式化输出、回归测试。
  • 采样: temperature 约 0.6–1.0,配合 top_p。适合聊天、写作。小模型(0.5B)温度过高会胡言,先从 0.7 试。

需要「JSON 一样的结构」时,优先看官方 structured outputs / guided decoding(字段名在变),不要只靠「在 prompt 里求它输出 JSON」。


在线:Chat Completions 字段

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")

resp = client.chat.completions.create(
    model="Qwen/Qwen2.5-0.5B-Instruct",
    messages=[{"role": "user", "content": "List three GPU serving tips."}],
    temperature=0.4,
    top_p=0.9,
    max_tokens=128,
    extra_body={"top_k": 40},
)
print(resp.choices[0].message.content)

user 等部分 OpenAI 字段会被忽略。vLLM 额外采样键通过 extra_body 传递,列表见官方「Extra parameters」。


和 Transformers generate() 对齐时

TransformersvLLM
max_new_tokensmax_tokens
do_sample=Falsetemperature=0 一类设置
top_p / top_k同名
eos_token_id停止条件 / tokenizer EOS

vLLM 会自己做 tokenize / detokenize。不要把已经是 token id 的列表和字符串 prompt 搞混。Hub 模型卡上的推荐采样,往往已经写进 generation_config.json


调试清单

  1. temperature=0max_tokens=32 确认模型真的在生成,而不是模板或停止符立刻结束。
  2. 再打开采样,对比两次输出是否变化。
  3. 若「永远重复同一句话」,降温度、加 stop、或检查是否误用补全接口喂了聊天 prompt。
  4. 延迟随 max_tokens 与并发上升——这是连续批处理在工作,不是死机。

下一步

评论