很多时候,模型“答得好不好”不只取决于模型本身,也取决于你怎么设置 decoding。SamplingParams 就是 vLLM 里控制输出风格、长度、停止条件、概率信息和约束生成的核心入口。


SamplingParams 不是“玄学调参”,它是在管模型下一步怎么选 token

大模型每次生成文本,本质上是在一堆候选 token 里选下一个 token。SamplingParams 负责规定“候选范围多大”“选择要不要随机”“是否惩罚重复”“什么时候停下”“要不要返回概率信息”等规则。

在 vLLM v0.6.4 中,SamplingParams 的整体设计和 OpenAI text completion API 的 sampling parameters 对齐,同时 vLLM 文档也说明它额外支持 beam search。实际工程里,你通常不会一次调完所有参数,而是先抓住几个主旋钮:temperaturetop_pmax_tokensstoprepetition_penalty

先别背参数名,先看它们分别管哪一层

一、输出数量

n 表示返回几条结果;best_of 表示先生成多少条,再从中挑出前 n 条。best_of 必须大于或等于 n。如果只是普通服务接口,通常 n=1 就够。

二、随机性

temperature 越低,输出越确定;temperature=0 是 greedy sampling。top_p 用累计概率筛候选 token;top_k 限制只看概率最高的 k 个 token;min_p 则按照“相对于最高概率 token 的比例”过滤太弱的候选。

三、重复控制

presence_penalty 看 token 是否已经出现;frequency_penalty 看出现频率;repetition_penalty 同时参考 prompt 和已生成文本。它们都不是“质量开关”,调得过重会让文本变得生硬。

四、停止与长度

max_tokens 控制最多生成多少 token;min_tokens 控制至少生成多少 token;stop 和 stop_token_ids 负责遇到指定字符串或 token 时停止。需要注意,文档中说明 stop 触发后返回文本默认不包含 stop string,而 stop_token_ids 触发时通常会包含 stop token,除非它是 special token。

五、概率与后处理

logprobsprompt_logprobs 用于拿到 token 级概率信息,适合分析模型置信度或做候选重排。detokenizeskip_special_tokensspaces_between_special_tokens 则决定输出文本如何从 token 还原。

六、约束生成

bad_words 禁止部分词,allowed_token_ids 只允许指定 token,logit_bias 调整特定 token 的 logits,logits_processors 和 guided_decoding 则更偏底层或结构化控制。

实用判断:如果你只是在做普通问答服务,先调 temperaturetop_pmax_tokensstop。只有当你需要概率分析、结构化输出或安全约束时,再碰 logprobsguided_decodinglogit_bias 这些参数。

常用参数怎么理解

可以在搜索框里输入参数名或关键词,例如 temperaturestop概率重复

vLLM v0.6.4 · SamplingParams

参数 默认值 作用 使用建议 类别
n 1 返回的 output sequences 数量。 普通在线服务多用 1;多候选生成才调大。 数量
best_of None 先生成多条,再返回其中最好的 n 条;要求 best_of ≥ n。 会增加计算量,离线生成或候选筛选时更适合。 数量
temperature 1.0 控制 sampling 随机性;越低越稳定,0 表示 greedy sampling。 事实问答 0~0.3;通用写作 0.6~0.9;创意任务可更高。 随机性
top_p 1.0 按累计概率截断候选 token。 常和 temperature 一起调;0.8~0.95 是常见区间。 随机性
top_k -1 只考虑概率最高的 k 个 token;-1 表示不限制。 需要更硬的候选范围时再用,不必每次都开。 随机性
min_p 0.0 按“相对最高概率 token 的比例”过滤候选 token。 适合减少极低概率 token 干扰;0 表示关闭。 随机性
seed None 设置 random seed。 复现实验结果时设置;线上服务一般不固定。 复现
presence_penalty 0.0 根据 token 是否已经出现来惩罚。 想减少“原地打转”可小幅加,比如 0.1~0.5。 重复
frequency_penalty 0.0 根据 token 出现频率来惩罚。 对长文本重复词有用,但过高会牺牲自然度。 重复
repetition_penalty 1.0 根据 prompt 和已生成文本中的重复情况惩罚。 大于 1 减少重复;略微调高即可,避免过度。 重复
stop None 遇到指定字符串停止生成,默认返回文本不包含 stop string。 做模板输出、对话分隔、代码块截断时很有用。 停止
stop_token_ids None 遇到指定 token id 停止生成。 更贴近 tokenizer 层,适合底层工程控制。 停止
include_stop_str_in_output False 是否把 stop string 也放进输出文本。 需要保留分隔符时才打开。 停止
ignore_eos False 是否忽略 EOS token,继续生成。 一般不要打开,除非明确知道模型会过早输出 EOS。 停止
max_tokens 16 每条 output sequence 最多生成多少 token。 默认 16 很短;实际问答通常要显式设置更大。 长度
min_tokens 0 生成达到该 token 数前,不允许 EOS 或 stop_token_ids 停止。 避免模型太早结束时可用。 长度
logprobs None 返回每个输出 token 的 top log probabilities。 会增加返回信息量;分析、重排、置信度估计时使用。 概率
prompt_logprobs None 返回 prompt token 的 log probabilities。 评估 prompt 或做打分任务时更有意义。 概率
detokenize True 是否把输出 token 还原成文本。 普通应用保持 True;底层 token 处理可关闭。 输出
skip_special_tokens True 输出时是否跳过 special tokens。 普通用户可见文本保持 True。 输出
spaces_between_special_tokens True special tokens 之间是否添加空格。 一般保持默认。 输出
bad_words None 禁止指定词生成;更准确地说,是当下一 token 会完成对应 token 序列时禁止最后一个 token。 适合简单黑名单,不适合替代完整安全策略。 约束
allowed_token_ids None 只保留指定 token ids 的分数。 强约束场景使用,配置错会让输出异常。 约束
logit_bias None 对指定 token 施加 logit bias。 轻微引导可用;强行偏置容易造成怪输出。 约束
logits_processors None 自定义函数,在生成过程中修改 logits。 高级用法,适合自定义 decoding 规则。 约束
guided_decoding None 根据参数构造 guided decoding logits processor。 结构化输出、schema 约束时考虑。 约束
truncate_prompt_tokens None 只保留 prompt 最后的 k 个 tokens,即 left truncation。 长上下文截断时有用,但可能丢掉前文关键信息。 工程
output_kind CUMULATIVE 控制 request output 的形式。 流式或增量输出场景再深入配置。 输出

直接可抄的几组 SamplingParams

稳定问答 / RAG

目标是少编、少跑题、尽量贴近检索内容。

temperature=0.2top_p=0.8max_tokens=512

from vllm import SamplingParams

params = SamplingParams(
    temperature=0.2,
    top_p=0.8,
    max_tokens=512,
)

通用聊天 / 解释型回答

目标是稳定但不死板,适合写解释、课程笔记、普通问答。

temperature=0.7top_p=0.9max_tokens=800

from vllm import SamplingParams

params = SamplingParams(
    temperature=0.7,
    top_p=0.9,
    max_tokens=800,
)

创意写作 / 多样化生成

目标是让表达更有变化,但仍保留基本可控性。

temperature=0.95top_p=0.95presence_penalty=0.3

from vllm import SamplingParams

params = SamplingParams(
    temperature=0.95,
    top_p=0.95,
    presence_penalty=0.3,
    max_tokens=1000,
)

严格格式 / 批处理输出

目标是让模型更听格式要求,减少自由发挥。

temperature=0stop=[...]max_tokens=256

from vllm import SamplingParams

params = SamplingParams(
    temperature=0,
    max_tokens=256,
    stop=["\n\nEND", "</answer>"],
)

实际调 SamplingParams,可以按这条顺序来

先定任务类型。

事实问答、RAG、代码解释这类任务,先降低 temperature;创意写作、改写、头脑风暴,则允许更高的 temperature 和 top_p

再定输出边界。

先设置 max_tokens,否则默认值可能让输出过短。需要明确截断位置时,再加 stop 或 stop_token_ids

处理重复问题。

如果模型反复绕圈,先小幅增加 repetition_penalty 或 presence_penalty。不要一上来把多个 penalty 都调得很高。

需要分析时再打开概率。

logprobs 和 prompt_logprobs 很适合调试、打分、候选重排,但普通业务接口不一定需要返回这些信息。

结构化输出才上强约束。

当你需要固定 JSON、枚举答案或 schema 输出时,再考虑 guided_decodingallowed_token_idslogit_bias 等更强的约束手段。

一个完整调用示例

复制代码

from vllm import LLM, SamplingParams

llm = LLM(model="your-model-path-or-name")

prompts = [
    "用三句话解释什么是 KV Cache。"
]

sampling_params = SamplingParams(
    temperature=0.4,
    top_p=0.9,
    max_tokens=300,
    stop=["\n\n"],
    repetition_penalty=1.05,
)

outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    print(output.outputs[0].text)

一句话记忆:temperature 管“敢不敢乱想”,top_p/top_k/min_p 管“候选池有多大”,max_tokens/stop 管“什么时候收手”,penalty 管“别老重复自己”。

两个方法:clone 与 update_from_generation_config

文档里还列出了两个方法。clone() 会做 deep copy,但排除 LogitsProcessor 对象,因为这类对象可能携带任意且较大的数据。update_from_generation_config() 则用于从 generation_config 里更新非默认值。

复制代码

base_params = SamplingParams(
    temperature=0.7,
    top_p=0.9,
    max_tokens=512,
)

new_params = base_params.clone()
new_params.max_tokens = 1024

实际项目里,可以把一组稳定的 SamplingParams 当作 base config,再针对不同接口做轻量修改。这样比到处散落参数更容易维护。

参考来源:vLLM v0.6.4 官方文档 · Sampling Parameters

说明:本文不是逐句翻译,而是按工程使用逻辑对 SamplingParams 做中文化整理。参数名称、API 名称和关键技术词保留英文。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐