采样与生成参数
生成不是「模型内部唯一正确的下一词」,而是按 采样参数 从词表分布里取 token。vLLM 离线用 SamplingParams;在线则把同一套概念映射到 OpenAI 字段和 extra_body。
默认值可能来自模型仓库的 generation_config.json,见 OpenAI 兼容 API。调参前先固定 max_tokens,避免无限生成占满调度槽。
离线:SamplingParams
同一 LLM 实例可复用;换的是每批请求的 SamplingParams。Instruct 模型也可用 llm.chat(messages, sampling_params=...)(方法名以当前 API 为准)。
参数直觉
把 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 字段
user 等部分 OpenAI 字段会被忽略。vLLM 额外采样键通过 extra_body 传递,列表见官方「Extra parameters」。
和 Transformers generate() 对齐时
vLLM 会自己做 tokenize / detokenize。不要把已经是 token id 的列表和字符串 prompt 搞混。Hub 模型卡上的推荐采样,往往已经写进 generation_config.json。
调试清单
- 先
temperature=0、max_tokens=32确认模型真的在生成,而不是模板或停止符立刻结束。 - 再打开采样,对比两次输出是否变化。
- 若「永远重复同一句话」,降温度、加 stop、或检查是否误用补全接口喂了聊天 prompt。
- 延迟随
max_tokens与并发上升——这是连续批处理在工作,不是死机。