logit_bias 是什么
采样前的模型输出是一整排候选 token 的分数(logits),logit_bias 允许你在这些分数上加一个固定偏置:正值提高某个 token 被选中的倾向,负值压低,判到极端值就等价于禁止。它不是提示词技巧,而是在采样阶段直接改分布,所以对「必须不出现某个词」或「必须强制以某段文本开头」这类硬性约束比在提示里反复强调可靠。
基本信息
| 字段形态 | token id 到偏置值的映射,键为字符串形式的 token id |
|---|---|
| 取值范围 | 以服务实现为准,常见约定为 -100 到 100 的整数区间 |
| 生效阶段 | 采样之前,直接加到对应 token 的 logits 上 |
| 适用接口 | 多数兼容 OpenAI 协议的对话与补全接口,vLLM 的采样参数也提供同类能力 |
| 前置依赖 | 需要知道目标模型分词器的 token id 映射 |
典型使用场景
- 禁止输出特定词:把敏感词对应 token 压到最低,比在提示里约定更稳定
- 强制结构化开头:让回答以指定 JSON 键名或前缀开始,方便下游解析
- 抑制重复与口头禅:对高频重复片段的 token 施以负偏置,改善长文本可读性
- 分类任务收窄候选:把答案限制在少数类别 token 上,减少无效输出
- 多语言输出控制:压掉非目标语种的高频 token,降低语言串台概率
请求片段
请求片段
# 排除某个 token(id 需按目标模型 tokenizer 查询)
client.chat.completions.create(
model="<模型名>",
messages=[{"role": "user", "content": "输出一个城市的名字"}],
logit_bias={"12345": -100},
)
# 多 token 组合:分别加压或提升
logit_bias = {"12345": -100, "678": -50, "9012": 20}
# 查询 token id(以 transformers 为例)
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("<模型路径>")
print(tok.encode("敏感词")) # 得到 id 列表,注意前缀空格与大小写会造成不同 id偏置值语义
| 取值 | 效果 | 使用建议 |
|---|---|---|
| 正数(如 100) | 显著提高被选中概率 | 仅用于确定性要求的开头强制,容易造成输出僵化 |
| 小数(如 5 到 20) | 轻微提升倾向 | 用于表达风格微调,副作用小于极端值 |
| 0 | 不改变分布 | 等价于不加该条目,用于保留开关但临时失效 |
| 负数(如 -20) | 明显压低但不完全禁止 | 适合抑制口头禅,仍保留语义灵活性 |
| 极端负值(如 -100) | 实际等于禁止该 token | 慎用:被禁 token 若原本必需,会出现语法破碎或反复绕行 |
token id 与具体分词器绑定:换模型必须重新映射,取值范围与上限也以所用服务的实现为准,不同引擎对键的格式要求可能不同。
把所有敏感词一次性列成禁止表容易产生漏网与副作用:分词切分方式决定了哪些词能被精确匹配,建议先小流量验证再全量启用。