NVIDIA LogitsProcessorZoo: 使用模块化 Logits 处理器控制语言模型生成
语言模型中的 Logits 是什么?
Logits 是语言模型为其词汇表中的每个 token 生成的原始、未归一化的分数,这些分数通过 softmax 函数转换为概率以指导下一个 token 的选择。
生成过程如下:模型为每个 token 输出 logits;应用 softmax 将其转换为概率分布;采样或 argmax 选择下一个 token。🤗 Transformers 库的 generate() 方法会自动处理这些步骤。
为什么要处理 Logits?
处理 logits 使开发者能够在 token 选择之前修改概率分布,以施加约束、避免过度泛化,并使模型输出符合特定任务需求。 原始 logits 可能缺少所需的约束,产生通用响应,或与诸如长度限制、短语包含或多选格式之类的任务不匹配。
NVIDIA 的 LogitsProcessorZoo
NVIDIA 的 LogitsProcessorZoo 是一组与 Hugging Face Transformers 兼容的模块化 logits 处理器集合,能够控制序列长度、提示引用、强制短语包含以及多选答案选择。
该库可以通过 pip install logits-processor-zoo 安装,并通过 LogitsProcessorList 与 generate() 方法配合使用。
GenLengthLogitsProcessor
GenLengthLogitsProcessor 通过调整结束序列(EOS) token 的可能性来控制生成序列的长度。 增加 boost factor 会使模型更早发出 EOS,从而产生更短的输出;减小它(或使用负值)会抑制 EOS,产生更长的输出。该处理器还可以配置为在停止前完成句子。 示例用法如下:
[GenLengthLogitsProcessor(runner.tokenizer, boost_factor=0.1, p=2, complete_sentences=True)]
产生一个短篇故事,而
[GenLengthLogitsProcessor(runner.tokenizer, boost_factor=-10.0, p=0, complete_sentences=False)]
产生更长的续写。
CiteFromPromptLogitsProcessor
CiteFromPromptLogitsProcessor 提升或降低出现在提示中的 token 的概率,以鼓励模型生成与输入紧密相关的内容。 这对于诸如基于段落的问答或带有特定细节的摘要等任务很有用。 示例用法:
[CiteFromPromptLogitsProcessor(runner.tokenizer, example_prompts, boost_factor=5.0)]
在用户评论提示下,会得到一个重复评论中关于价格观点的响应。
ForceLastPhraseLogitsProcessor
ForceLastPhraseLogitsProcessor 强制模型在结束输出前包含用户指定的短语。 这有助于为引用、报告或任何必须以特定字符串结尾的结构化输出保持一致的格式。 示例用法:
[ForceLastPhraseLogitsProcessor(phrase, runner.tokenizer, batch_size)]
其中 phrase 设置为 "\n\nReferences:" 时会添加一个参考文献块,或设置为 "\n\nThanks for trying our RAG application!" 时会添加一个结束注释。
MultipleChoiceLogitsProcessor
MultipleChoiceLogitsProcessor 引导模型在多选题中恰好选择一个提供的选项,抑制所有其他 token。 这确保输出符合严格的答案格式,这对于测验、调查或决策系统非常有价值。 示例用法:
MultipleChoiceLogitsProcessor(
runner.tokenizer,
choices=["0", "1", "2", "3"],
delimiter=\n\n" .
\)
在询问手机功能的提示下,仅返回所选选项,例如 "1).
总结
Logits 处理器提供了灵活性,能够有效控制语言模型的输出,使其在需要精确度、遵守约束或特定任务行为的场景中变得不可或缺。 进一步探索的资源包括 Transformers 生成指南、生成策略文档、LogitsProcessor API 参考以及 NVIDIA LogitsProcessorZoo 仓库(其中包含示例和用例)。 借助这些工具,开发者可以优化 AI 工作流以满足精确的生成需求。