Transformers documentation
代码世界模型 (CWM)
<— 版权所有 2025 HuggingFace 团队。保留所有权利。
根据 Apache 许可证 2.0 版本(“许可证”)授权; 除非符合许可证的规定,否则您不得使用本文件。 您可以在以下位置获取许可证副本
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面协议另有规定,根据本许可证分发的软件按“原样”提供,不附带任何明示或暗示的担保或条件。请参阅本许可证以了解管理权限和限制的具体语言。
⚠️ 请注意,此文件为 Markdown 格式,但包含我们文档构建器(类似于 MDX)的特定语法,可能无法在您的 Markdown 查看器中正确渲染。
—> 该模型于 2025-10-09 贡献至 Hugging Face Transformers。
代码世界模型 (CWM)
概述
Code World Model(CWM)模型由 Meta FAIR CodeGen 团队在 CWM: An Open-Weights LLM for Research on Code Generation with World Models 中提出。 CWM 是一个用于代码生成和代码推理的大语言模型,其特别经过训练,以更好地表示和推理代码及命令如何影响程序或系统的状态。 具体而言,我们在大量来自 Python 执行轨迹以及容器化环境中智能体交互的观测-动作轨迹上对 CWM 进行了中期训练。随后,我们在可验证的编程、数学以及多轮软件工程环境中,通过大规模多任务强化学习对其进行了后期训练。
该论文的摘要如下:
我们发布了 Code World Model(CWM),这是一款拥有 320 亿参数的开放权重 LLM,旨在推进基于世界模型的代码生成研究。为了提升超越仅通过静态代码训练所能获得的代码理解能力,我们在大量来自 Python 解释器和智能体 Docker 环境的观测-动作轨迹上对 CWM 进行了中期训练,并在可验证的编程、数学以及多轮软件工程环境中进行了广泛的多任务推理 RL。借助 CWM,我们为研究人员提供了一个强大的测试平台,以探索世界建模在计算环境中通过推理和规划改进代码生成所带来的机遇。我们展示了世界模型如何有益于智能体编程的初步步骤,实现了 Python 代码执行的逐步模拟,并展示了推理如何从后者中获益的早期结果。CWM 是一个稠密的、仅解码器的 LLM,训练时的上下文大小最高可达 131k 个 token。独立于其世界建模能力,CWM 在通用编程和数学任务上表现出色:在 SWE-bench Verified(使用测试时扩展)上达到 65.8% 的 pass@1 分数,在 LiveCodeBench 上达到 68.9%,在 Math-500 上达到 96.6%,在 AIME 2024 上达到 76.0%。为了支持关于代码世界建模的进一步研究,我们发布了中期训练、SFT 和 RL 之后的模型检查点。
提示:
CWM 在推理期间需要一个专用的系统提示词才能发挥最佳性能。如果未正确配置提示词,CWM 的输出质量可能会显著下降。以下内容是用于推理任务的默认系统提示词。对于智能体工作流,请在此基础提示词之后附加相关的工具规范。有关更多详细信息,请参阅原始代码仓库。
You are a helpful AI assistant. You always reason before responding, using the following format: <think> your internal reasoning </think> your external response
该模型由 Meta FAIR CodeGen Team 贡献。 原始代码可在 此处 找到。
使用示例
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = 'facebook/cwm'
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map="auto"
)
system_prompt = """
You are a helpful AI assistant. You always reason before responding, using the following format:
<think>
your internal reasoning
</think>
your external response
""".strip()
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": "Write a haiku about recursion in programming."}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=True, # Switches between thinking and non-thinking modes. Default is True.
preserve_previous_think=True, # Switches between keeping thinking blocks from previous messages or not. Default is True.
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=1024
)
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()
print(tokenizer.decode(output_ids))Produces the following output:
好的,我需要写一首关于编程中递归的俳句。让我们先回顾一下递归是什么。递归是一种编程技术,函数在其自身的定义中调用自身,通常用于解决可以分解为更小、更相似的子问题的问题。
俳句是一首三行诗,音节数为 5-7-5。因此,我需要用简洁而富有诗意的方式捕捉递归的精髓。让我们思考一下递归的关键要素:函数调用自身、停止递归的基准情况,以及将问题分解为更小部分的思路。
也许我可以使用与镜子或反射相关的意象,因为递归通常涉及函数对自身进行反射或重复。或者,我可以使用螺旋或树木等自然意象,它们暗示了自相似的模式。
让我试着想出一些点子。例如,“函数调用自身”可以作为一个起点。但如何将其变成一首俳句呢?也许可以这样:
函数调用自身 基本情况终止无限循环 代码的螺旋
嗯,这算是个开始。但也许我可以让它更具诗意。让我们把函数调用自身想象成一种无限循环,但有一个基础情况来终止它。这就像一条在中心逐渐展开的螺旋。
另一个角度:递归通常用于具有递归结构的问题,例如树遍历或阶乘计算。也许我可以用一个自然的图像来表示这一点。
如何:
分支再次分裂 叶片在无尽的舞动中舒展 根节点承载着基本情况
这听起来更有诗意一些。分叉的树枝代表递归调用,展开的树叶可以代表对每个子问题的处理,而承载基准情况的树根则终止了递归。
或者,也许有更简单的方案:
镜中映镜 倒影深不见底 基例击碎玻璃
这里使用镜子隐喻来表示函数调用自身,其中基本情况是递归停止的点,从而打破无限反射。
我觉得镜像的想法更好。让我再完善一下:
镜中镜 无限倒影翩然起舞 基例击碎玻璃
是的,这似乎很好地捕捉到了递归的本质。镜子代表函数调用自身,无限反射代表递归调用,而打破玻璃的基准情形则终止了递归。
让我检查一下音节数:
镜中镜(5 个音节:Mir-ror-with-in-mir-ror) 无限反射在舞动(7 个音节:In-fi-nite-ref-lec-tions-dance) 基本情况击碎玻璃(5 个音节:Base-case-shat-ters-glass)
是的,这符合5-7-5的结构。我认为这是一首关于递归的不错的俳句。
</think> Mirror within mirror Infinite reflections dance Base case shatters glass<|eot_id|>CwmConfig
class transformers.CwmConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonevocab_size: int = 128256hidden_size: int = 6144intermediate_size: int = 21504num_hidden_layers: int = 64num_attention_heads: int = 48num_key_value_heads: int = 8hidden_act: str = 'silu'max_position_embeddings: int = 131072initializer_range: float = 0.02rms_norm_eps: float = 1e-05use_cache: bool = Truepad_token_id: int | None = Nonebos_token_id: int = 128000eos_token_id: int | list[int] | None = Nonepretraining_tp: int = 1tie_word_embeddings: bool = Falserope_parameters: dict | None = Noneattention_dropout: float | int = 0.0mlp_bias: bool = Falsehead_dim: int = 128sliding_window: int = 8192layer_types: list[str] | None = None )
参数
- vocab_size (
int,可选,默认为128256) — 模型的词汇表大小。定义了input_ids可以表示的不同 token 数量。 - hidden_size (
int,可选,默认为6144) — 隐藏表示的维度。 - intermediate_size (
int,可选,默认为21504) — MLP 表示的维度。 - num_hidden_layers (
int,可选,默认为64) — Transformer 解码器中的隐藏层数量。 - num_attention_heads (
int,可选,默认为48) — Transformer 解码器中每个注意力层的注意力头数量。 - num_key_value_heads (
int, 可选,默认为8) — 这是用于实现 Grouped Query Attention 的 key_value 头数。如果num_key_value_heads=num_attention_heads,模型将使用 Multi Head Attention (MHA);如果num_key_value_heads=1,模型将使用 Multi Query Attention (MQA);否则使用 GQA。在将多头检查点转换为 GQA 检查点时,每个组的 key 和 value 头应通过对该组内所有原始头进行 meanpooling 来构建。更多详情请参阅 这篇论文。如果未指定,则默认为num_attention_heads。 - hidden_act (
str,可选,默认为silu) — 解码器中的非线性激活函数(函数或字符串)。例如,"gelu"、"relu"、"silu"等。 - max_position_embeddings (
int,可选,默认为131072) — 该模型可能使用的最大序列长度。 - initializer_range (
float,可选,默认为0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - rms_norm_eps (
float,可选,默认为1e-05) — RMS 归一化层使用的 epsilon 值。 - use_cache (
bool,可选,默认为True) — 模型是否应返回最后一次键/值注意力(并非所有模型都使用)。仅当config.is_decoder=True或模型为仅解码器生成式模型时相关。 - pad_token_id (
int, 可选) — 词表中用于填充的 token id。 - bos_token_id (
int,可选,默认为128000) — 词汇表中用于表示流起始的 Token id。 - eos_token_id (
Union[int, list[int]], 可选) — 词汇表中用于表示流结束(end-of-stream)的 token id。 - pretraining_tp (
int,可选,默认为1) — 实验性功能。预训练期间使用的张量并行 rank。请参阅此文档以了解更多相关信息。此值对于确保预训练结果的精确可复现性是必需的。请参阅此 issue。 - tie_word_embeddings (
bool,可选,默认为False) — 是否根据模型的tied_weights_keys映射来绑定权重嵌入。 - rope_parameters (
dict, 可选) — 包含 RoPE 嵌入配置参数的字典。该字典应包含rope_theta的值,并且如果希望使用 RoPE 处理更长的max_position_embeddings,则可选地包含用于缩放的参数。 - attention_dropout (
Union[float, int],可选,默认为0.0) — 注意力概率的 dropout 比率。 - mlp_bias (
bool,可选,默认为False) — 是否在 MLP 层的 up_proj、down_proj 和 gate_proj 层中使用偏置。 - head_dim (
int,可选,默认为128) — 注意力头维度。如果为 None,则默认为 hidden_size // num_attention_heads - sliding_window (
int,可选,默认为8192) — 滑动窗口注意力的窗口大小。如果为None,则不应用滑动窗口。 - layer_types (
list[str], 可选) — 一个列表,用于显式地将每个层索引映射到其层类型。如果未提供,将根据 config 值自动生成。
这是用于存储 CwmModel 配置的类。它根据指定的参数实例化 Cwm 模型,并定义模型架构。使用默认值实例化配置将得到与 facebook/cwm 类似的配置。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。
>>> from transformers import CwmModel, CwmConfig
>>> # Initializing a Cwm cwm-7b style configuration
>>> configuration = CwmConfig()
>>> # Initializing a model from the cwm-7b style configuration
>>> model = CwmModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configCwmPreTrainedModel
class transformers.CwmPreTrainedModel
< source >( config: PreTrainedConfig*inputs**kwargs )
参数
- config (PreTrainedConfig) — 模型配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
CwmModel
class transformers.CwmModel
< source >( config: CwmConfig )
参数
- config (CwmConfig) — 模型配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
未添加任何特定头部的裸 Cwm 模型,直接输出原始隐藏状态。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneposition_ids: typing.Optional[torch.LongTensor] = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneinputs_embeds: typing.Optional[torch.Tensor] = Noneuse_cache: bool | None = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → CwmModelOutputWithPast or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length), ,可选) — 输入序列中各 token 在词汇表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- position_ids (
torch.LongTensor形状为(batch_size, sequence_length), 可选) — 输入序列中每个 token 在位置嵌入中的位置索引。取值范围为[0, config.n_positions - 1]. - past_key_values (
~cache_utils.Cache, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常由past_key_values在解码的先前阶段返回,当use_cache=True或config.use_cache=True.仅允许将 Cache 实例作为输入,请参阅我们的 kv cache 指南。 如果未传入
past_key_values,则默认会初始化 DynamicCache。模型将输出与输入相同的缓存格式。
如果使用了
past_key_values,用户应仅输入未处理的input_ids(即未向该模型提供其过去键值状态的那些),其形状为(batch_size, unprocessed_length),而不是形状为(batch_size, sequence_length)的全部input_ids。 - inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - use_cache (
bool,可选) — 如果设置为True,则会返回past_key_values键值状态,可用于加速解码(参见past_key_values)。
返回值
CwmModelOutputWithPast 或 tuple(torch.Tensor)
CwmModelOutputWithPast 或 torch.Tensor 元组(如果传入 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(CwmConfig)和输入。
CwmModel 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
last_hidden_state(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor)— 模型最后一层输出的隐藏状态序列。如果使用了
past_key_values,则仅输出形状为(batch_size, 1, hidden_size)的序列的最后一个隐藏状态。past_key_values(
Cache,可选,在传入use_cache=True或config.use_cache=True时返回)—— 它是一个 Cache 实例。更多详情,请参阅我们的 kv cache 指南。包含预计算的隐藏状态(自注意力块中的键和值,以及如果
config.is_encoder_decoder=True则还包括交叉注意力块中的键和值),可用于(参见past_key_values输入)加速顺序解码。hidden_states (
tuple(torch.Tensor),可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层的输出,以及每一层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple(torch.Tensor),可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
CwmForCausalLM
class transformers.CwmForCausalLM
< source >( config: CwmConfig )
参数
- config (CwmConfig) — 模型配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
用于因果语言建模的 Cwm 模型。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneposition_ids: typing.Optional[torch.LongTensor] = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneinputs_embeds: typing.Optional[torch.Tensor] = Nonelabels: typing.Optional[torch.LongTensor] = Noneuse_cache: bool | None = Nonelogits_to_keep: typing.Union[int, torch.Tensor] = 0**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → CausalLMOutputWithPast or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length), ,可选) — 输入序列中各 token 在词汇表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- position_ids (
torch.LongTensor形状为(batch_size, sequence_length), 可选) — 输入序列中每个 token 在位置嵌入中的位置索引。取值范围为[0, config.n_positions - 1]. - past_key_values (
~cache_utils.Cache, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常由past_key_values在解码的先前阶段返回,当use_cache=True或config.use_cache=True.仅允许将 Cache 实例作为输入,请参阅我们的 kv cache 指南。 如果未传入
past_key_values,则默认会初始化 DynamicCache。模型将输出与输入相同的缓存格式。
如果使用了
past_key_values,用户应仅输入未处理的input_ids(即未向该模型提供其过去键值状态的那些),其形状为(batch_size, unprocessed_length),而不是形状为(batch_size, sequence_length)的全部input_ids。 - inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - labels (
torch.LongTensor,形状为(batch_size, sequence_length),可选) — 用于计算掩码语言建模损失的标签。索引值应在[0, ..., config.vocab_size]范围内,或为 -100(参见input_ids的文档字符串)。索引值设为-100的 token 将被忽略(即被掩码),损失仅针对标签位于[0, ..., config.vocab_size]范围内的 token 进行计算。 - use_cache (
bool,可选) — 如果设置为True,则会返回past_key_values键值状态,可用于加速解码(参见past_key_values)。 - logits_to_keep (
Union[int, torch.Tensor], 可选,默认为0) — 如果为int,则计算最后logits_to_keep个 token 的 logits。如果为0,则计算所有input_ids的 logits(特殊情况)。生成过程只需要最后一个 token 的 logits,仅针对该 token 进行计算可以节省内存,对于长序列或大词汇量而言,这种节省相当显著。 如果为torch.Tensor,则必须是一维张量,对应于序列长度维度中需要保留的索引。 这在使用打包张量格式(将批次和序列长度合并为单一维度)时非常有用。
返回值
CausalLMOutputWithPast 或 tuple(torch.Tensor)
一个 CausalLMOutputWithPast 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(CwmConfig)和输入。
CwmForCausalLM 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
loss (
torch.Tensor,形状为(1,),可选,当提供labels时返回) — 语言建模损失(用于下一个 token 预测)。logits(形状为
(batch_size, sequence_length, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数(SoftMax 之前每个词汇表 token 的分数)。past_key_values(
Cache,可选,在传入use_cache=True或config.use_cache=True时返回)—— 它是一个 Cache 实例。更多详情,请参阅我们的 kv cache 指南。包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见
past_key_values输入)加速顺序解码。hidden_states (
tuple(torch.Tensor),可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层的输出,以及每一层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple(torch.Tensor),可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
示例:
>>> from transformers import AutoTokenizer, CwmForCausalLM
>>> model = CwmForCausalLM.from_pretrained("meta-cwm/Cwm-2-7b-hf")
>>> tokenizer = AutoTokenizer.from_pretrained("meta-cwm/Cwm-2-7b-hf")
>>> prompt = "Hey, are you conscious? Can you talk to me?"
>>> inputs = tokenizer(prompt, return_tensors="pt")
>>> # Generate
>>> generate_ids = model.generate(inputs.input_ids, max_length=30)
>>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
"Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you."