Transformers 文档
生成
并获取增强的文档体验
开始使用
生成
每个框架都在其各自的 GenerationMixin
类中实现了文本生成的 generate 方法
- PyTorch generate() 在 GenerationMixin 中实现。
- TensorFlow generate() 在 TFGenerationMixin 中实现。
- Flax/JAX generate() 在 FlaxGenerationMixin 中实现。
无论您选择哪个框架,您都可以使用 GenerationConfig 类实例来参数化 generate 方法。请参考此类以获取生成参数的完整列表,这些参数控制生成方法的行为。
要了解如何检查模型的生成配置、默认值是什么、如何临时更改参数以及如何创建和保存自定义生成配置,请参阅文本生成策略指南。该指南还解释了如何使用相关功能,如令牌流式传输。
GenerationConfig
class transformers.GenerationConfig
< source >( **kwargs )
控制输出长度的参数
- max_length (
int
, 可选, 默认为 20) — 生成的令牌可以具有的最大长度。对应于输入提示的长度 +max_new_tokens
。如果也设置了max_new_tokens
,则其效果将被覆盖。 - max_new_tokens (
int
, 可选) — 要生成的最大令牌数,忽略提示中的令牌数。 - min_length (
int
, 可选, 默认为 0) — 要生成的序列的最小长度。对应于输入提示的长度 +min_new_tokens
。如果也设置了min_new_tokens
,则其效果将被覆盖。 - min_new_tokens (
int
, 可选) — 要生成的最小令牌数,忽略提示中的令牌数。 - early_stopping (
bool
或str
, 可选, 默认为False
) — 控制基于束搜索的方法(如束搜索)的停止条件。它接受以下值:True
,其中生成在有num_beams
个完整候选时立即停止;False
,其中应用启发式方法,并且当不太可能找到更好的候选时生成停止;"never"
,其中束搜索过程仅在无法找到更好的候选时停止(规范束搜索算法)。 - max_time (
float
, 可选) — 您允许计算运行的最长时间(以秒为单位)。即使超过分配的时间,生成仍将完成当前pass。 - stop_strings (
str 或 List[str]
, 可选) — 如果模型输出字符串或字符串列表,则应终止生成。
控制所用生成策略的参数
- do_sample (
bool
, 可选, 默认为False
) — 是否使用采样;否则使用贪婪解码。 - num_beams (
int
, 可选, 默认为 1) — 用于束搜索的束数量。1 表示不进行束搜索。 - num_beam_groups (
int
, 可选, 默认为 1) — 将num_beams
分成组的数量,以确保不同束组之间的多样性。本文 以了解更多详情。 - penalty_alpha (
float
, 可选) — 这些值平衡了对比搜索解码中的模型置信度和退化惩罚。 - dola_layers (
str
或List[int]
, 可选) — 用于 DoLa 解码的层。如果为None
,则不使用 DoLa 解码。如果是字符串,则必须是 “low” 或 “high” 之一,分别表示使用模型层的较低部分或较高部分。“low” 表示前一半层,最多前 20 层,“high” 表示后一半层,最多后 20 层。如果是整数列表,则必须包含要在 DoLa 中用作候选过早层的层的索引。第 0 层是模型的词嵌入层。设置为'low'
以改善长答案推理任务,'high'
以改善短答案任务。查看 文档 或 论文 以了解更多详情。
控制缓存的参数
- use_cache (
bool
, 可选, 默认为True
) — 模型是否应使用过去的最后一次键/值注意力(如果适用于模型)以加速解码。 - cache_implementation (
str
, 可选, 默认为None
) — 将在generate
中实例化的缓存类的名称,用于更快的解码。可能的值为:"dynamic"
: DynamicCache"static"
: StaticCache"offloaded_static"
: OffloadedStaticCache"sliding_window"
: SlidingWindowCache"hybrid"
: HybridCache"mamba"
: MambaCache"quantized"
: QuantizedCache
如果未指定任何内容,我们将使用模型的默认缓存(通常是 DynamicCache)。请参阅我们的 缓存文档 以获取更多信息。
- cache_config (
CacheConfig
或dict
, 可选, 默认为None
) — 键值缓存类中使用的参数可以在cache_config
中传递。可以作为Dict
传递,它将在内部转换为其相应的CacheConfig
。否则,可以作为与指示的cache_implementation
匹配的CacheConfig
类传递。 - return_legacy_cache (
bool
, 可选, 默认为True
) — 当默认使用DynamicCache
时,是否返回旧版或新版缓存格式。
用于操作模型输出 logits 的参数
- temperature (
float
, 可选,默认为 1.0) — 用于调整下一个 token 概率的值。此值在模型的generation_config.json
文件中设置。如果未设置,则默认值为 1.0。 - top_k (
int
, 可选,默认为 50) — 用于 top-k 过滤的最高概率词汇 tokens 的数量。此值在模型的generation_config.json
文件中设置。如果未设置,则默认值为 50。 - top_p (
float
, 可选,默认为 1.0) — 如果设置为小于 1 的浮点数,则仅保留概率总和达到top_p
或更高的最小概率 tokens 集合用于生成。此值在模型的generation_config.json
文件中设置。如果未设置,则默认值为 1.0。 - min_p (
float
, 可选) — 最小 token 概率,它将按最可能 token 的概率进行缩放。它必须是 0 到 1 之间的值。典型值在 0.01-0.2 范围内,与在 0.99-0.8 范围内设置top_p
具有可比的选择性(使用正常top_p
值的相反值)。 - typical_p (
float
, 可选,默认为 1.0) — 局部典型性衡量了预测下一个目标 token 的条件概率与预测下一个随机 token 的预期条件概率(给定已生成的部分文本)的相似程度。如果设置为小于 1 的浮点数,则保留概率总和达到typical_p
或更高的局部最典型 tokens 的最小集合用于生成。有关更多详细信息,请参见 本文。 - epsilon_cutoff (
float
, 可选,默认为 0.0) — 如果设置为严格介于 0 和 1 之间的浮点数,则仅采样条件概率大于epsilon_cutoff
的 tokens。在论文中,建议值范围为 3e-4 到 9e-4,具体取决于模型的大小。有关更多详细信息,请参见 Truncation Sampling as Language Model Desmoothing。 - eta_cutoff (
float
, 可选,默认为 0.0) — Eta 采样是局部典型性采样和 epsilon 采样的混合。如果设置为严格介于 0 和 1 之间的浮点数,则仅当 token 大于eta_cutoff
或sqrt(eta_cutoff) * exp(-entropy(softmax(next_token_logits)))
时才考虑该 token。后一个术语直观上是预期的下一个 token 概率,按sqrt(eta_cutoff)
缩放。在论文中,建议值范围为 3e-4 到 2e-3,具体取决于模型的大小。有关更多详细信息,请参见 Truncation Sampling as Language Model Desmoothing。 - diversity_penalty (
float
, 可选,默认为 0.0) — 如果 beam 在特定时间生成与来自其他组的任何 beam 相同的 token,则从该 beam 的得分中减去此值。请注意,仅当启用group beam search
时,diversity_penalty
才有效。 - repetition_penalty (
float
, 可选,默认为 1.0) — 重复惩罚的参数。1.0 表示没有惩罚。有关更多详细信息,请参见 本文。 - encoder_repetition_penalty (
float
, 可选,默认为 1.0) — encoder_repetition_penalty 的参数。对不在原始输入中的序列进行指数惩罚。1.0 表示没有惩罚。 - length_penalty (
float
, 可选,默认为 1.0) — 用于基于 beam 生成的长度指数惩罚。它作为指数应用于序列长度,而序列长度又用于除以序列的分数。由于分数是序列的对数似然(即负数),因此length_penalty
> 0.0 鼓励更长的序列,而length_penalty
< 0.0 鼓励更短的序列。 - no_repeat_ngram_size (
int
, 可选,默认为 0) — 如果设置为大于 0 的整数,则该大小的所有 n-gram 只能出现一次。 - bad_words_ids (
List[List[int]]
, 可选) — 不允许生成的 token id 列表的列表。有关更多文档和示例,请查看 NoBadWordsLogitsProcessor。 - force_words_ids (
List[List[int]]
或List[List[List[int]]]
, 可选) — 必须生成的 token id 列表。如果给定List[List[int]]
,则将其视为必须包含的简单单词列表,与bad_words_ids
相反。如果给定List[List[List[int]]]
,则会触发 析取约束,其中可以允许每个单词的不同形式。 - renormalize_logits (
bool
, 可选,默认为False
) — 是否在应用所有 logits 处理器(包括自定义处理器)后重新归一化 logits。强烈建议将此标志设置为True
,因为搜索算法假设得分 logits 是归一化的,但某些 logits 处理器会破坏归一化。 - constraints (
List[Constraint]
, 可选) — 可以添加到生成中的自定义约束,以确保输出将包含由Constraint
对象定义的某些 token 的使用,以尽可能合理的方式。 - forced_bos_token_id (
int
, 可选,默认为model.config.forced_bos_token_id
) — 强制作为decoder_start_token_id
之后生成的第一个 token 的 token id。对于多语言模型(如 mBART)非常有用,其中生成的第一个 token 需要是目标语言 token。 - forced_eos_token_id (
int
或 List[int], *可选*, 默认为
model.config.forced_eos_token_id) -- 强制作为达到
max_length` 时生成的最后一个 token 的 token id。可以选择使用列表来设置多个序列结束 token。 - remove_invalid_values (
bool
, 可选,默认为model.config.remove_invalid_values
) — 是否删除模型可能存在的 nan 和 inf 输出,以防止生成方法崩溃。请注意,使用remove_invalid_values
可能会减慢生成速度。 - exponential_decay_length_penalty (
tuple(int, float)
, 可选) — 此元组在生成一定数量的 token 后添加指数增长的长度惩罚。该元组应包含:(start_index, decay_factor)
,其中start_index
指示惩罚开始的位置,decay_factor
表示指数衰减因子 - suppress_tokens (
List[int]
, 可选) — 在生成时将被抑制的 token 列表。SupressTokens
logits 处理器将它们的 log probs 设置为-inf
,以便不采样它们。 - begin_suppress_tokens (
List[int]
, 可选) — 在生成开始时将被抑制的 token 列表。SupressBeginTokens
logits 处理器将它们的 log probs 设置为-inf
,以便不采样它们。 - forced_decoder_ids (
List[List[int]]
, 可选) — 一个整数对列表,指示从生成索引到将在采样之前强制执行的 token 索引的映射。例如,[[1, 123]]
表示第二个生成的 token 将始终是索引为 123 的 token。 - sequence_bias (
Dict[Tuple[int], float]
, 可选)) — 将 token 序列映射到其偏差项的字典。正偏差会增加选择该序列的几率,而负偏差则相反。有关更多文档和示例,请查看 SequenceBiasLogitsProcessor。 - token_healing (
bool
, 可选,默认为False
) — 通过将 prompts 的尾部 token 替换为适当的扩展来修复它们。这提高了受贪婪 token 化偏差影响的 prompts 的完成质量。 - guidance_scale (
float
, 可选) — 用于无分类器引导 (CFG) 的引导缩放。通过设置guidance_scale > 1
启用 CFG。较高的引导缩放鼓励模型生成与输入 prompt 更紧密相关的样本,但通常以质量较差为代价。 - low_memory (
bool
, 可选) — 切换到顺序 beam search 和顺序 topk 以进行对比搜索,以减少峰值内存。与 beam search 和对比搜索一起使用。 - watermarking_config (
BaseWatermarkingConfig
或dict
, 可选) — 用于为模型输出添加水印的参数,通过向随机选择的“绿色” token 集合添加小的偏差。 有关更多详细信息,请参阅 SynthIDTextWatermarkingConfig 和 WatermarkingConfig 的文档。 如果作为Dict
传递,它将在内部转换为WatermarkingConfig
。
定义 generate 输出变量的参数
- num_return_sequences (
int
, 可选, 默认为 1) — 批次中每个元素独立计算的返回序列的数量。 - output_attentions (
bool
, 可选, 默认为False
) — 是否返回所有注意力层的注意力张量。 有关更多详细信息,请参阅返回张量下的attentions
。 - output_hidden_states (
bool
, 可选, 默认为False
) — 是否返回所有层的隐藏状态。 有关更多详细信息,请参阅返回张量下的hidden_states
。 - output_scores (
bool
, 可选, 默认为False
) — 是否返回预测分数。 有关更多详细信息,请参阅返回张量下的scores
。 - output_logits (
bool
, 可选) — 是否返回未经处理的预测 logits 分数。 有关更多详细信息,请参阅返回张量下的logits
。 - return_dict_in_generate (
bool
, 可选, 默认为False
) — 是否返回 ModelOutput,而不是仅返回生成的序列。 必须将此标志设置为True
才能返回生成缓存(当use_cache
为True
时)或可选输出(请参阅以output_
开头的标志)。
生成时可以使用的特殊 token
- pad_token_id (
int
, 可选) — 填充 (padding) token 的 id。 - bos_token_id (
int
, 可选) — beginning-of-sequence (序列开始) token 的 id。 - eos_token_id (
Union[int, List[int]]
, 可选) — end-of-sequence (序列结束) token 的 id。 可选地,使用列表来设置多个 end-of-sequence token。
编码器-解码器模型独有的生成参数
- encoder_no_repeat_ngram_size (
int
, 可选, 默认为 0) — 如果设置为大于 0 的整数,则在encoder_input_ids
中出现的所有该大小的 n-gram 都不能在decoder_input_ids
中出现。 - decoder_start_token_id (
int
或List[int]
, 可选) — 如果编码器-解码器模型以与 bos 不同的 token 开始解码,则该 token 的 id 或长度为batch_size
的列表。 指示列表允许批次中每个元素使用不同的起始 id(例如,在一个批次中使用不同目标语言的多语言模型)。
助手生成独有的生成参数
- is_assistant (
bool
, 可选, 默认为False
) — 模型是否为助手(草稿)模型。 - num_assistant_tokens (
int
, 可选, 默认为 20) — 定义助手模型在每次迭代中被目标模型检查之前应生成的推测性 token 的数量。num_assistant_tokens
的值越高,生成就越推测性:如果助手模型性能良好,则可以实现更大的加速;如果助手模型需要大量校正,则加速会降低。 - num_assistant_tokens_schedule (
str
, 可选, 默认为"constant"
) — 定义在推理期间应更改最大助手 token 的计划。"heuristic"
: 当所有推测性 token 都正确时,将num_assistant_tokens
增加 2,否则减少 1。num_assistant_tokens
值在同一助手模型的多个生成调用中保持不变。"heuristic_transient"
: 与"heuristic"
相同,但num_assistant_tokens
在每次生成调用后重置为其初始值。"constant"
:num_assistant_tokens
在生成期间保持不变
- assistant_confidence_threshold (
float
, 可选, 默认为 0.4) — 助手模型的置信度阈值。 如果助手模型对其当前 token 预测的置信度低于此阈值,则即使尚未达到推测性 token 的数量(由num_assistant_tokens
定义),助手模型也会停止当前 token 生成迭代。 助手的置信度阈值在整个推测性迭代中进行调整,以减少不必要的草稿和目标前向传递的次数,并偏向于避免假阴性。assistant_confidence_threshold
值在同一助手模型的多个生成调用中保持不变。 它是动态推测前瞻的无监督版本,来自 Dynamic Speculation Lookahead Accelerates Speculative Decoding of Large Language Models https://arxiv.org/abs/2405.04304。 - prompt_lookup_num_tokens (
int
, 可选) — 要作为候选 token 输出的 token 数量。 - max_matching_ngram_size (
int
, 可选) — 在 prompt 中要考虑匹配的最大 n-gram 大小。 如果未提供,则默认为 2。 - assistant_early_exit(
int
, 可选) — 如果设置为正整数,则模型的提前退出将用作助手。 只能与支持提前退出的模型一起使用(即,中间层的 logits 可以被 LM 头解释的模型)。 - assistant_lookbehind(
int
, 可选, 默认为 10) — 如果设置为正整数,则重新编码过程将额外考虑最后assistant_lookbehind
个助手 token,以正确对齐 token。 只能在推测性解码中使用不同的 tokenizer。 有关更多详细信息,请参阅此博客。 - target_lookbehind(
int
, 可选, 默认为 10) — 如果设置为正整数,则重新编码过程将额外考虑最后target_lookbehind
个目标 token,以正确对齐 token。 只能在推测性解码中使用不同的 tokenizer。 有关更多详细信息,请参阅此博客。
与性能和编译相关的参数
Class that holds a configuration for a generation task. A generate
call supports the following generation methods for text-decoder, text-to-text, speech-to-text, and vision-to-text models
- 当
num_beams=1
且do_sample=False
时为贪婪解码 - 当
penalty_alpha>0.
且top_k>1
时为对比搜索 - 当
num_beams=1
且do_sample=True
时为多项式采样 - 当
num_beams>1
且do_sample=False
时为束搜索解码 - 当
num_beams>1
且do_sample=True
时为束搜索多项式采样 - 当
num_beams>1
且num_beam_groups>1
时为多样化束搜索解码 - 当
constraints!=None
或force_words_ids!=None
时为约束束搜索解码 - 如果将
assistant_model
或prompt_lookup_num_tokens
传递给.generate()
,则为辅助解码 - 如果将
dola_layers
传递给.generate()
,则为dola 解码
要了解有关解码策略的更多信息,请参阅文本生成策略指南。
这些标志中的绝大部分控制着生成的 logits 或停止标准。请务必查看generate 相关类,以获得对可能操作的完整描述,以及它们的使用示例。
from_pretrained
< source > ( pretrained_model_name: typing.Union[str, os.PathLike] config_file_name: typing.Union[str, os.PathLike, NoneType] = None cache_dir: typing.Union[str, os.PathLike, NoneType] = None force_download: bool = False local_files_only: bool = False token: typing.Union[str, bool, NoneType] = None revision: str = 'main' **kwargs ) → GenerationConfig
参数
- pretrained_model_name (
str
或os.PathLike
) — 可以是以下之一:- 一个字符串,即托管在 huggingface.co 上的模型仓库内的预训练模型配置的模型 ID。
- 一个目录的路径,其中包含使用 save_pretrained() 方法保存的配置文件,例如,
./my_model_directory/
。
- config_file_name (
str
或os.PathLike
, 可选, 默认为"generation_config.json"
) — 要从pretrained_model_name
加载的生成配置 JSON 文件的名称。 - cache_dir (
str
或os.PathLike
, 可选) — 如果不想使用标准缓存,则应在其中缓存下载的预训练模型配置的目录路径。 - force_download (
bool
, 可选, 默认为False
) — 是否强制(重新)下载配置文件并覆盖缓存版本(如果存在)。 - resume_download — 已弃用且被忽略。现在所有下载在可能的情况下默认恢复。将在 Transformers v5 中移除。
- proxies (
Dict[str, str]
, 可选) — 按协议或端点使用的代理服务器字典,例如,{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}.
代理用于每个请求。 - token (
str
或bool
, 可选) — 用作远程文件的 HTTP Bearer 授权的令牌。如果为True
,或未指定,将使用运行huggingface-cli login
时生成的令牌(存储在~/.huggingface
中)。 - revision (
str
, 可选, 默认为"main"
) — 要使用的特定模型版本。它可以是分支名称、标签名称或提交 ID,因为我们使用基于 git 的系统来存储 huggingface.co 上的模型和其他工件,因此revision
可以是 git 允许的任何标识符。要测试您在 Hub 上创建的拉取请求,您可以传递
revision="refs/pr/<pr_number>"
。 - return_unused_kwargs (
bool
, 可选, 默认为False
) — 如果为False
,则此函数仅返回最终配置对象。如果为
True
,则此函数返回一个Tuple(config, unused_kwargs)
,其中 unused_kwargs 是一个字典,其中包含键/值对,其键不是配置属性:即,kwargs
中未用于更新config
的部分,否则将被忽略。 - subfolder (
str
, 可选, 默认为""
) — 如果相关文件位于 huggingface.co 上的模型仓库的子文件夹中,您可以在此处指定文件夹名称。 - kwargs (
Dict[str, Any]
, 可选) — kwargs 中任何键是配置属性的值将用于覆盖加载的值。关于键/值对的行为,其键不是配置属性,由return_unused_kwargs
关键字参数控制。
从此预训练模型实例化的配置对象。
从生成配置文件实例化一个 GenerationConfig。
示例
>>> from transformers import GenerationConfig
>>> # Download configuration from huggingface.co and cache.
>>> generation_config = GenerationConfig.from_pretrained("openai-community/gpt2")
>>> # E.g. config was saved using *save_pretrained('./test/saved_model/')*
>>> generation_config.save_pretrained("./test/saved_model/")
>>> generation_config = GenerationConfig.from_pretrained("./test/saved_model/")
>>> # You can also specify configuration names to your generation configuration file
>>> generation_config.save_pretrained("./test/saved_model/", config_file_name="my_configuration.json")
>>> generation_config = GenerationConfig.from_pretrained("./test/saved_model/", "my_configuration.json")
>>> # If you'd like to try a minor variation to an existing configuration, you can also pass generation
>>> # arguments to `.from_pretrained()`. Be mindful that typos and unused arguments will be ignored
>>> generation_config, unused_kwargs = GenerationConfig.from_pretrained(
... "openai-community/gpt2", top_k=1, foo=False, do_sample=True, return_unused_kwargs=True
... )
>>> generation_config.top_k
1
>>> unused_kwargs
{'foo': False}
from_model_config
< source > ( model_config: PretrainedConfig ) → GenerationConfig
从 PretrainedConfig 实例化一个 GenerationConfig。此函数对于将可能包含生成参数的旧版 PretrainedConfig 对象转换为独立的 GenerationConfig 非常有用。
save_pretrained
< source > ( save_directory: typing.Union[str, os.PathLike] config_file_name: typing.Union[str, os.PathLike, NoneType] = None push_to_hub: bool = False **kwargs )
参数
- save_directory (
str
或os.PathLike
) — 将保存配置 JSON 文件的目录(如果不存在将创建)。 - config_file_name (
str
或os.PathLike
, 可选, 默认为"generation_config.json"
) — 要保存在save_directory
中的生成配置 JSON 文件的名称。 - push_to_hub (
bool
, 可选, 默认为False
) — 是否在保存模型后将其推送到 Hugging Face 模型 Hub。您可以使用repo_id
指定要推送到的仓库(默认为您命名空间中save_directory
的名称)。 - kwargs (
Dict[str, Any]
, 可选) — 传递给 push_to_hub() 方法的附加关键字参数。
将生成配置对象保存到目录 save_directory
,以便可以使用 from_pretrained() 类方法重新加载它。
update
< source > ( **kwargs ) → Dict[str, Any]
如果 kwargs
中的属性与现有属性匹配,则使用这些属性更新此类实例的属性,并返回所有未使用的 kwargs。
验证 GenerationConfig 实例的属性值。如果存在仅从配置实例即可检测为不正确的参数化,则引发异常。
请注意,此处未验证的某些参数最好在生成运行时进行验证,因为它们可能取决于其他输入和/或模型,例如与生成长度相关的参数。
get_generation_mode
< source > ( assistant_model: typing.Optional[ForwardRef('PreTrainedModel')] = None ) → GenerationMode
返回由 GenerationConfig 实例触发的生成模式。
GenerationMixin
一个类,包含用于自回归文本生成的所有函数,用作模型类中的 mixin。继承此类会导致模型具有与生成相关的特殊行为,例如在初始化时加载 GenerationConfig,或确保在 transformers CI 中运行与 generate 相关的测试。
模型类应继承 GenerationMixin 以启用调用 generate 等方法,或者当它定义了一个自定义的 generate 方法,直接或间接地依赖于 GenerationMixin,并且该方法与 generate 等公共方法大致共享相同的接口时。以下是三个例子:
- LlamaForCausalLM 应该继承 GenerationMixin,以启用调用 mixin 中的 generate 和其他公共方法;
- BlipForQuestionAnswering 有一个自定义的 generate 方法,该方法与 GenerationMixin.generate 大致共享相同的接口(它有一些额外的参数,并且输出相同)。该函数还通过内部模型间接调用 GenerationMixin.generate。因此,BlipForQuestionAnswering 应该继承 GenerationMixin,以受益于我们代码库中所有与生成相关的自动化;
- BarkModel 有一个自定义的 generate 方法,并且它的一个内部模型调用了 GenerationMixin.generate。但是,它的 generate 方法与 GenerationMixin.generate 不共享相同的接口。在这种情况下,BarkModel 不应该继承 GenerationMixin,因为它破坏了 generate 接口。
此类公开了 generate(),可用于:
- 当
num_beams=1
且do_sample=False
时为贪婪解码 - 对比搜索(如果 penalty_alpha>0 且 top_k>1)
- 当
num_beams=1
且do_sample=True
时为多项式采样 - 当
num_beams>1
且do_sample=False
时为束搜索解码 - 当
num_beams>1
且do_sample=True
时为束搜索多项式采样 - 当
num_beams>1
且num_beam_groups>1
时为多样化束搜索解码 - 当
constraints!=None
或force_words_ids!=None
时为约束束搜索解码 - 如果将
assistant_model
或prompt_lookup_num_tokens
传递给.generate()
,则为辅助解码
要了解有关解码策略的更多信息,请参阅文本生成策略指南。
generate
< 源代码 > ( inputs: typing.Optional[torch.Tensor] = None generation_config: typing.Optional[transformers.generation.configuration_utils.GenerationConfig] = None logits_processor: typing.Optional[transformers.generation.logits_process.LogitsProcessorList] = None stopping_criteria: typing.Optional[transformers.generation.stopping_criteria.StoppingCriteriaList] = None prefix_allowed_tokens_fn: typing.Optional[typing.Callable[[int, torch.Tensor], typing.List[int]]] = None synced_gpus: typing.Optional[bool] = None assistant_model: typing.Optional[ForwardRef('PreTrainedModel')] = None streamer: typing.Optional[ForwardRef('BaseStreamer')] = None negative_prompt_ids: typing.Optional[torch.Tensor] = None negative_prompt_attention_mask: typing.Optional[torch.Tensor] = None use_model_defaults: typing.Optional[bool] = None **kwargs ) → ModelOutput 或 torch.LongTensor
参数
- **inputs** (`torch.Tensor`,形状取决于模态,*可选*) — 用作生成提示或作为模型输入到编码器的序列。如果为 `None`,则该方法使用 `bos_token_id` 和批量大小 1 进行初始化。对于仅解码器模型,`inputs` 应为 `input_ids` 格式。对于编码器-解码器模型,*inputs* 可以表示 `input_ids`、`input_values`、`input_features` 或 `pixel_values` 中的任何一个。
- **generation_config** (GenerationConfig,*可选*) — 用作生成调用的基本参数化的生成配置。传递给 generate 的与 `generation_config` 属性匹配的 `**kwargs` 将覆盖它们。如果未提供 `generation_config`,将使用默认值,默认值具有以下加载优先级:1) 来自 `generation_config.json` 模型文件(如果存在);2) 来自模型配置。请注意,未指定的参数将继承 GenerationConfig 的默认值,应查阅其文档以参数化生成。
- **logits_processor** ([`LogitsProcessorList`](transformers.generation.logits_process.LogitsProcessorList), *可选*) — 自定义 logits 处理器,用于补充从参数和生成配置构建的默认 logits 处理器。如果传递的 logits 处理器已经使用参数或生成配置创建,则会抛出错误。此功能旨在供高级用户使用。
- **stopping_criteria** ([`StoppingCriteriaList`](transformers.generation.stopping_criteria.StoppingCriteriaList), *可选*) — 自定义停止标准,用于补充从参数和生成配置构建的默认停止标准。如果传递的停止标准已经使用参数或生成配置创建,则会抛出错误。如果您的停止标准依赖于 `scores` 输入,请确保将 `return_dict_in_generate=True, output_scores=True` 传递给 `generate`。此功能旨在供高级用户使用。
- **prefix_allowed_tokens_fn** (`Callable[[int, torch.Tensor], List[int]]`, *可选*) — 如果提供,此函数将 beam search 限制为每步仅允许的 tokens。如果未提供,则不应用任何约束。此函数接受 2 个参数:批量 ID `batch_id` 和 `input_ids`。它必须返回一个列表,其中包含在批量 ID `batch_id` 和先前生成的 tokens `inputs_ids` 的条件下,下一步生成步骤允许的 tokens。此参数对于在 prefix 条件下的约束生成非常有用,如 Autoregressive Entity Retrieval 中所述。
- **synced_gpus** (`bool`, *可选*) — 是否继续运行 while 循环直到 `max_length`。除非被覆盖,否则如果使用 FullyShardedDataParallel 或 DeepSpeed ZeRO Stage 3 与多个 GPU,则此标志将设置为 `True`,以避免在一个 GPU 在其他 GPU 之前完成生成时发生死锁。否则,默认为 `False`。
- **assistant_model** ([`PreTrainedModel`](transformers.PreTrainedModel), *可选*) — 可用于加速生成的辅助模型。辅助模型必须具有完全相同的 tokenizer。当使用辅助模型预测候选 tokens 比使用您从中调用 generate 的模型运行生成快得多时,可以实现加速。因此,辅助模型应该小得多。
- **streamer** ([`BaseStreamer`](transformers.generation.streamer.BaseStreamer), *可选*) — 将用于流式传输生成序列的 Streamer 对象。生成的 tokens 通过 `streamer.put(token_ids)` 传递,streamer 负责任何进一步的处理。
- **negative_prompt_ids** (`torch.LongTensor`,形状为 `(batch_size, sequence_length)`,*可选*) — 某些处理器(如 CFG)所需的负面提示。批量大小必须与输入批量大小匹配。这是一个实验性功能,未来版本中可能会发生破坏性的 API 更改。
- **negative_prompt_attention_mask** (`torch.LongTensor`,形状为 `(batch_size, sequence_length)`,*可选*) — `negative_prompt_ids` 的 Attention_mask。
- **use_model_defaults** (`bool`, *可选*) — 当为 `True` 时,`generation_config` 中未设置的参数将设置为模型特定的默认生成配置 (`model.generation_config`),而不是全局默认值 (`GenerationConfig()`)。如果未设置,则从 `v4.50` 开始保存的模型将认为此标志为 `True`。
- **kwargs** (`Dict[str, Any]`, *可选*) — `generation_config` 的临时参数化和/或将转发到模型的 `forward` 函数的其他模型特定 kwargs。如果模型是编码器-解码器模型,则编码器特定的 kwargs 不应添加前缀,解码器特定的 kwargs 应添加 `decoder_` 前缀。
返回
ModelOutput 或 torch.LongTensor
[`ModelOutput`](/docs/transformers/v4.50.0/en/main_classes/output#transformers.utils.ModelOutput)(如果 `return_dict_in_generate=True` 或当 `config.return_dict_in_generate=True` 时)或 `torch.LongTensor`。
如果模型*不是*编码器-解码器模型 (`model.config.is_encoder_decoder=False`),则可能的 ModelOutput 类型为:
如果模型是编码器-解码器模型 (`model.config.is_encoder_decoder=True`),则可能的 ModelOutput 类型为:
为具有语言建模头的模型生成 token id 序列。
大多数生成控制参数在 `generation_config` 中设置,如果未传递,则将设置为模型的默认生成配置。您可以通过将相应的参数传递给 `generate()` 来覆盖任何 `generation_config`,例如 `.generate(inputs, num_beams=4, do_sample=True)`。
有关生成策略和代码示例的概述,请查看以下指南。
compute_transition_scores
< 源代码 > ( sequences: Tensor scores: typing.Tuple[torch.Tensor] beam_indices: typing.Optional[torch.Tensor] = None normalize_logits: bool = False ) → torch.Tensor
参数
- **sequences** (`torch.LongTensor`) — 生成的序列。如果所有批次由于 `eos_token_id` 提前完成,则第二个维度(`sequence_length`)等于 `max_length` 或更短。
- **scores** (`tuple(torch.FloatTensor)`) — 每个生成步骤中每个词汇表 token 的转移分数。Beam 转移分数由 tokens 的对数概率组成,这些概率以该 beam 中先前生成的 tokens 的对数 softmax 为条件。`torch.FloatTensor` 的元组,最多包含 `max_new_tokens` 个元素(每个生成的 token 一个元素),每个张量的形状为 `(batch_size*num_beams, config.vocab_size)`。
- **beam_indices** (`torch.LongTensor`, *可选*) — 每个生成步骤中生成的 token id 的 beam 索引。形状为 `(batch_size*num_return_sequences, sequence_length)` 的 `torch.LongTensor`。仅当在生成时 `num_beams>1` 时才需要。
- **normalize_logits** (`bool`, *可选*, 默认为 `False`) — 是否标准化 logits(出于遗留原因,logits 可能未标准化)。
返回
torch.Tensor
形状为 `(batch_size*num_return_sequences, sequence_length)` 的 `torch.Tensor`,包含转移分数 (logits)
计算给定生成分数(以及 beam 索引,如果使用了 beam search)的序列的转移分数。这是一种方便的方法,可以在生成时快速获得所选 tokens 的分数。
示例
>>> from transformers import GPT2Tokenizer, AutoModelForCausalLM
>>> import numpy as np
>>> tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> tokenizer.pad_token_id = tokenizer.eos_token_id
>>> inputs = tokenizer(["Today is"], return_tensors="pt")
>>> # Example 1: Print the scores for each token generated with Greedy Search
>>> outputs = model.generate(**inputs, max_new_tokens=5, return_dict_in_generate=True, output_scores=True)
>>> transition_scores = model.compute_transition_scores(
... outputs.sequences, outputs.scores, normalize_logits=True
... )
>>> # input_length is the length of the input prompt for decoder-only models, like the GPT family, and 1 for
>>> # encoder-decoder models, like BART or T5.
>>> input_length = 1 if model.config.is_encoder_decoder else inputs.input_ids.shape[1]
>>> generated_tokens = outputs.sequences[:, input_length:]
>>> for tok, score in zip(generated_tokens[0], transition_scores[0]):
... # | token | token string | log probability | probability
... print(f"| {tok:5d} | {tokenizer.decode(tok):8s} | {score.numpy():.3f} | {np.exp(score.numpy()):.2%}")
| 262 | the | -1.414 | 24.33%
| 1110 | day | -2.609 | 7.36%
| 618 | when | -2.010 | 13.40%
| 356 | we | -1.859 | 15.58%
| 460 | can | -2.508 | 8.14%
>>> # Example 2: Reconstruct the sequence scores from Beam Search
>>> outputs = model.generate(
... **inputs,
... max_new_tokens=5,
... num_beams=4,
... num_return_sequences=4,
... return_dict_in_generate=True,
... output_scores=True,
... )
>>> transition_scores = model.compute_transition_scores(
... outputs.sequences, outputs.scores, outputs.beam_indices, normalize_logits=False
... )
>>> # If you sum the generated tokens' scores and apply the length penalty, you'll get the sequence scores.
>>> # Tip 1: recomputing the scores is only guaranteed to match with `normalize_logits=False`. Depending on the
>>> # use case, you might want to recompute it with `normalize_logits=True`.
>>> # Tip 2: the output length does NOT include the input length
>>> output_length = np.sum(transition_scores.numpy() < 0, axis=1)
>>> length_penalty = model.generation_config.length_penalty
>>> reconstructed_scores = transition_scores.sum(axis=1) / (output_length**length_penalty)
>>> print(np.allclose(outputs.sequences_scores, reconstructed_scores))
True
TFGenerationMixin
一个类,包含所有支持生成的功能,用作 TFPreTrainedModel 中的 mixin。
此类公开了 generate(),可用于:
- 如果
num_beams=1
且do_sample=False
,则通过调用greedy_search()
实现贪婪解码 - 如果
penalty_alpha>0
且top_k>1
,则通过调用contrastive_search()
实现对比搜索 - 如果
num_beams=1
且do_sample=True
,则通过调用sample()
实现多项式采样 - 如果
num_beams>1
,则通过调用beam_search()
实现束搜索解码
您无需直接调用上述任何方法。请将自定义参数值传递给 ‘generate’ 代替。要了解有关解码策略的更多信息,请参阅文本生成策略指南。
generate
< source > ( inputs: typing.Optional[tensorflow.python.framework.tensor.Tensor] = None generation_config: typing.Optional[transformers.generation.configuration_utils.GenerationConfig] = None logits_processor: typing.Optional[transformers.generation.tf_logits_process.TFLogitsProcessorList] = None seed = None **kwargs ) → ModelOutput 或 tf.Tensor
参数
- inputs (根据模态而变化形状的
tf.Tensor
,可选) — 用作生成的提示或作为模型编码器输入的序列。如果为None
,则该方法使用bos_token_id
和批量大小 1 初始化它。对于仅解码器模型,inputs
应采用input_ids
的格式。对于编码器-解码器模型,inputs 可以表示input_ids
、input_values
、input_features
或pixel_values
中的任何一个。 - generation_config (
~generation.GenerationConfig
,可选) — 用作生成调用的基本参数化的生成配置。传递给 generate 的与generation_config
的属性匹配的**kwargs
将覆盖它们。如果未提供generation_config
,将使用默认值,其加载优先级如下:1) 来自generation_config.json
模型文件(如果存在);2) 来自模型配置。 请注意,未指定的参数将继承 GenerationConfig 的默认值,应检查其文档以参数化生成。 - logits_processor (
LogitsProcessorList
,可选) — 自定义 logits 处理器,用于补充从参数和生成配置构建的默认 logits 处理器。 如果传递的 logits 处理器已使用参数或生成配置创建,则会引发错误。 此功能适用于高级用户。 - seed (
List[int]
,可选) — 用于控制采样的随机种子,包含两个整数,当do_sample
为True
时使用。 请参阅tf.random
中无状态函数的seed
参数。 - kwargs (
Dict[str, Any]
,可选) —generate_config
的特定参数化和/或将转发到模型的forward
函数的其他模型特定 kwargs。 如果模型是编码器-解码器模型,则编码器特定的 kwargs 不应加前缀,解码器特定的 kwargs 应以 decoder_ 为前缀。
返回
ModelOutput 或 tf.Tensor
一个 ModelOutput (如果 return_dict_in_generate=True
或当 config.return_dict_in_generate=True
时) 或一个 tf.Tensor
。
如果模型*不是*编码器-解码器模型 (`model.config.is_encoder_decoder=False`),则可能的 ModelOutput 类型为:
- TFGreedySearchDecoderOnlyOutput,
- TFSampleDecoderOnlyOutput,
- TFBeamSearchDecoderOnlyOutput,
- TFBeamSampleDecoderOnlyOutput
如果模型是编码器-解码器模型 (`model.config.is_encoder_decoder=True`),则可能的 ModelOutput 类型为:
为具有语言建模头的模型生成 token id 序列。
大多数生成控制参数在 generation_config
中设置,如果未传递,则将设置为模型的默认生成配置。您可以通过将相应的参数传递给 generate 来覆盖任何 generation_config
,例如 .generate(inputs, num_beams=4, do_sample=True)
。
有关生成策略和代码示例的概述,请查看以下指南。
compute_transition_scores
< source > ( sequences: Tensor scores: typing.Tuple[tensorflow.python.framework.tensor.Tensor] beam_indices: typing.Optional[tensorflow.python.framework.tensor.Tensor] = None normalize_logits: bool = False ) → tf.Tensor
参数
- sequences (
tf.Tensor
) — 生成的序列。 第二维度(sequence_length)等于max_length
,或者如果所有批次由于eos_token_id
而提前完成,则更短。 - scores (
tuple(tf.Tensor)
) — 每个生成步骤中每个词汇表标记的转换得分。 Beam 转换得分由以先前生成的标记的 log softmax 为条件的标记的对数概率组成。tf.Tensor
元组,最多包含max_new_tokens
个元素(每个生成的标记一个元素),每个张量的形状为(batch_size*num_beams, config.vocab_size)
。 - beam_indices (
tf.Tensor
,可选) — 每个生成步骤中生成的标记 id 的 Beam 索引。 形状为(batch_size*num_return_sequences, sequence_length)
的tf.Tensor
。 仅当 generate-time 的num_beams>1
时才需要。 - normalize_logits (
bool
,可选,默认为False
) — 是否标准化 logits(由于历史原因,logits 可能未标准化)。
返回
tf.Tensor
形状为 (batch_size*num_return_sequences, sequence_length)
的 tf.Tensor
,包含转换得分 (logits)
计算给定生成分数(以及 beam 索引,如果使用了 beam search)的序列的转移分数。这是一种方便的方法,可以在生成时快速获得所选 tokens 的分数。
示例
>>> from transformers import GPT2Tokenizer, TFAutoModelForCausalLM
>>> import numpy as np
>>> tokenizer = GPT2Tokenizer.from_pretrained("openai-community/gpt2")
>>> model = TFAutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> tokenizer.pad_token_id = tokenizer.eos_token_id
>>> inputs = tokenizer(["Today is"], return_tensors="tf")
>>> # Example 1: Print the scores for each token generated with Greedy Search
>>> outputs = model.generate(**inputs, max_new_tokens=5, return_dict_in_generate=True, output_scores=True)
>>> transition_scores = model.compute_transition_scores(
... outputs.sequences, outputs.scores, normalize_logits=True
... )
>>> # input_length is the length of the input prompt for decoder-only models, like the GPT family, and 1 for
>>> # encoder-decoder models, like BART or T5.
>>> input_length = 1 if model.config.is_encoder_decoder else inputs.input_ids.shape[1]
>>> generated_tokens = outputs.sequences[:, input_length:]
>>> for tok, score in zip(generated_tokens[0], transition_scores[0]):
... # | token | token string | logits | probability
... print(f"| {tok:5d} | {tokenizer.decode(tok):8s} | {score.numpy():.3f} | {np.exp(score.numpy()):.2%}")
| 262 | the | -1.414 | 24.33%
| 1110 | day | -2.609 | 7.36%
| 618 | when | -2.010 | 13.40%
| 356 | we | -1.859 | 15.58%
| 460 | can | -2.508 | 8.14%
>>> # Example 2: Reconstruct the sequence scores from Beam Search
>>> outputs = model.generate(
... **inputs,
... max_new_tokens=5,
... num_beams=4,
... num_return_sequences=4,
... return_dict_in_generate=True,
... output_scores=True,
... )
>>> transition_scores = model.compute_transition_scores(
... outputs.sequences, outputs.scores, outputs.beam_indices, normalize_logits=False
... )
>>> # If you sum the generated tokens' scores and apply the length penalty, you'll get the sequence scores.
>>> # Tip: recomputing the scores is only guaranteed to match with `normalize_logits=False`. Depending on the
>>> # use case, you might want to recompute it with `normalize_logits=True`.
>>> output_length = np.sum(transition_scores.numpy() < 0, axis=1)
>>> length_penalty = model.generation_config.length_penalty
>>> reconstructed_scores = np.sum(transition_scores, axis=1) / (output_length**length_penalty)
>>> print(np.allclose(outputs.sequences_scores, reconstructed_scores))
True
FlaxGenerationMixin
一个包含用于自回归文本生成的所有功能的类,用作 FlaxPreTrainedModel 中的 mixin。
该类公开了 generate(),可用于
- 如果
num_beams=1
且do_sample=False
,则通过调用_greedy_search()
实现贪婪解码 - 如果
num_beams=1
且do_sample=True
,则通过调用_sample()
实现多项式采样 - 如果
num_beams>1
且do_sample=False
,则通过调用_beam_search()
实现束搜索解码
您无需直接调用上述任何方法。请将自定义参数值传递给 ‘generate’ 代替。要了解有关解码策略的更多信息,请参阅文本生成策略指南。
generate
< source > ( input_ids: Array generation_config: typing.Optional[transformers.generation.configuration_utils.GenerationConfig] = None prng_key: typing.Optional[jax.Array] = None trace: bool = True params: typing.Optional[typing.Dict[str, jax.Array]] = None logits_processor: typing.Optional[transformers.generation.flax_logits_process.FlaxLogitsProcessorList] = None **kwargs )
参数
- input_ids (形状为
(batch_size, sequence_length)
的jnp.ndarray
) — 用作生成的提示的序列。 - generation_config (
~generation.GenerationConfig
,可选) — 用作生成调用的基本参数化的生成配置。传递给 generate 的与generation_config
的属性匹配的**kwargs
将覆盖它们。如果未提供generation_config
,将使用默认值,其加载优先级如下:1) 来自generation_config.json
模型文件(如果存在);2) 来自模型配置。 请注意,未指定的参数将继承 GenerationConfig 的默认值,应检查其文档以参数化生成。 - trace (
bool
,可选,默认为True
) — 是否跟踪生成。 设置trace=False
仅应用于调试,并将导致运行时速度明显降低。 - params (
Dict[str, jnp.ndarray]
,可选) — 可选地,可以传递模型参数。 这对于并行化生成很有用。 - logits_processor (
FlaxLogitsProcessorList
,可选) — 自定义 logits 处理器,用于补充从参数和生成配置构建的默认 logits 处理器。 如果传递的 logits 处理器已使用参数或生成配置创建,则会引发错误。 此功能适用于高级用户。 - kwargs (
Dict[str, Any]
,可选) —generate_config
的特定参数化和/或将转发到模型的forward
函数的其他模型特定 kwargs。 如果模型是编码器-解码器模型,则编码器特定的 kwargs 不应加前缀,解码器特定的 kwargs 应以 decoder_ 为前缀。
为具有语言建模头的模型生成 token id 序列。