Template

模板是用于将 Trajectory 转换为 InputFeature 的关键组件。

class Template:

    def __init__(self,
                 model_id: str,
                 use_chat_template: bool = True,
                 max_length: Optional[int] = 8192,
                 truncation_strategy: Literal['raise', 'left', 'right', 'split'] = 'raise',
                 default_system: Optional[str] = None):
        ...

    def batch_encode(self, trajectories: Union[Dict[str, Any], List[Trajectory]]) -> List[InputFeature]:
        # 批量编码样本
        ...

    def check(self, trajectory: Trajectory) -> Optional[Trajectory]:
        # 编码一条样本,并返回原样本
        # 一般用于在GRPO等RL算法中检查数据合理性
        ...

    def batch_check(self, trajectories: List[Trajectory]) -> List[Optional[Trajectory]]:
        # 批量检查样本
        ...

    def decode(self, token_ids: List[int], **kwargs) -> str:
        # 解码样本
        ...

    def batch_decode(self, token_ids: List[List[int]], **kwargs) -> List[str]:
        # 批量解码样本
        ...
  • model_id: 包含tokenizer或者processor的模型id

  • use_chat_template: 是否使用 chat_template。如果不使用,一般是预训练场景

  • max_length: 单样本的最大长度

  • truncation_strategy: 如果超过了最大长度,如何处理该样本

    • raise: 抛出异常。一般用于非常精确的数据集场景

    • left: 移除左边的 token,使其符合 max_length

    • right: 移除右边的 token,使其符合 max_length

    • default_system: 如果数据集没有 system,则使用默认 system

Template 不支持使用函数来代替,因为其内部要支持的功能较多。如果需要编写新的 Template,请继承 Template 类。 一般来说,纯文本模型使用 Template 基类就足够了,在基类中我们使用了 tokenizer.apply_chat_template 来编码模型,对一般的纯文本模型是通用的。

模板对应关系

目前模板关系较为简单:

  • Template类:纯文本模型通用

  • DeepseekV4Template类:DeepSeek V4 使用,重写了 chat template 编码逻辑,encode_messages 已内置在 twinkle 中

  • Qwen3_5Template类:Qwen3.5多模态模型使用