/swift/blob/main/swift/llm/utils/template.py[swift源码解析]
源码:
和llama-factory 定义qwen模板的对比:
def register_template(template_type: str, template: Template, *, exist_ok: bool = False, **kwargs) -> None:
if not exist_ok and template_type in TEMPLATE_MAPPING:
raise ValueError(f'The `{template_type}` has already been registered in the TEMPLATE_MAPPING.')
template.template_type = template_type
template_info = {'template': template, **kwargs}
TEMPLATE_MAPPING[template_type] = template_info
register_template(
TemplateType.default,
Template([], ['### Human:\n{{QUERY}}\n\n### Assistant:\n'], ['\n\n'], [['eos_token_id']], DEFAULT_SYSTEM,
['{{SYSTEM}}\n\n']))
# You can set the query as '' to serve as a template for pre-training.
class DefaultGenerationTemplate(Template):
def __init__(self):
super().__init__([], ['{{QUERY}}'], None, [['eos_token_id']], auto_add_bos=True)
register_template(TemplateType.default_generation, DefaultGenerationTemplate(), is_generation=True)
register_template(
TemplateType.default_generation_bos,
Template([['bos_token_id']], ['{{QUERY}}'], None, [['eos_token_id']]),
is_generation=True)
class QwenTemplate(Template):
def __init__(self, auto_add_bos: bool = False):
super().__init__([], ['<|im_start|>user\n{{QUERY}}<|im_end|>\n<|im_start|>assistant\n'], ['<|im_end|>\n'],
['<|im_end|>'],
DEFAULT_SYSTEM, ['<|im_start|>system\n{{SYSTEM}}<|im_end|>\n'],
auto_add_bos=auto_add_bos)
中文为您解释这段代码。让我们逐行进行分析:
claude
def register_template(template_type: str, template: Template, *, exist_ok: bool = False, **kwargs) -> None:
这个函数用于注册一个新的模板。它接受模板类型(字符串)、Template对象、可选的exist_ok标志,以及任何额外的关键字参数。
if not exist_ok and template_type in TEMPLATE_MAPPING:
raise ValueError(f'The `{template_type}` has already been registered in the TEMPLATE_MAPPING.')
这行代码检查模板类型是否已经存在于TEMPLATE_MAPPING中。如果存在且exist_ok为False,则抛出ValueError。
python
复制
template.template_type = template_type
template_info = {'template': template, **kwargs}
TEMPLATE_MAPPING[template_type] = template_info
这些行设置模板的template_type属性,创建一个包含模板和任何额外kwargs的字典,并将其添加到TEMPLATE_MAPPING中,使用template_type作为键。
python
复制
register_template(
TemplateType.default,
Template([], ['### Human:\n{{QUERY}}\n\n### Assistant:\n'], ['\n\n'], [['eos_token_id']], DEFAULT_SYSTEM,
['{{SYSTEM}}\n\n']))
这里注册了一个默认模板。它为人类和助手消息使用特定的格式,并包含查询和系统消息的占位符。
python
复制
class DefaultGenerationTemplate(Template):
def __init__(self):
super().__init__([], ['{{QUERY}}'], None, [['eos_token_id']], auto_add_bos=True)
这定义了一个DefaultGenerationTemplate类,它继承自Template。这是一个简单的模板,只包含查询。
python
复制
register_template(TemplateType.default_generation, DefaultGenerationTemplate(), is_generation=True)
这将DefaultGenerationTemplate注册为默认生成模板。
python
复制
register_template(
TemplateType.default_generation_bos,
Template([['bos_token_id']], ['{{QUERY}}'], None, [['eos_token_id']]),
is_generation=True)
这注册了另一个默认生成模板,但这个包含了一个序列开始标记。
python
复制
class QwenTemplate(Template):
def __init__(self, auto_add_bos: bool = False):
super().__init__([], ['<|im_start|>user\n{{QUERY}}<|im_end|>\n<|im_start|>assistant\n'], ['<|im_end|>\n'],
['<|im_end|>'],
DEFAULT_SYSTEM, ['<|im_start|>system\n{{SYSTEM}}<|im_end|>\n'],
auto_add_bos=auto_add_bos)
这定义了一个QwenTemplate类,它是Qwen模型使用的特定模板格式。它包含特殊标记来表示用户、助手和系统消息的开始和结束。
总的来说,这段代码为不同类型的语言模型交互设置了各种模板,允许根据不同的模型或使用场景灵活地格式化输入和输出。
Claude-3.5-Sonnet
Poe
QwenTemplate 的类
这段代码定义了一个名为 QwenTemplate 的类,它继承自 Template 类。这个类用于设置 Qwen 模型的对话模板。让我为您解释这段代码的含义,并渲染出真实的输出效果:
auto_add_bos
: 一个布尔值参数,用于控制是否自动添加开始标记(Beginning of Sequence)。
初始化参数:
- 空列表
[]
: 可能表示没有特殊的前缀。 - 用户输入模板:
['<|im_start|>user\n{{QUERY}}<|im_end|>\n<|im_start|>assistant\n']
- 助手回复结束标记:
['<|im_end|>\n']
- 整个对话结束标记:
['<|im_end|>']
- 默认系统消息:
DEFAULT_SYSTEM
(这是一个预定义的常量) - 系统消息模板:
['<|im_start|>system\n{{SYSTEM}}<|im_end|>\n']
现在,让我们渲染一下这个模板的真实输出效果。假设我们有一个用户查询和一个系统消息,它们会被这样格式化:
<|im_start|>system
你是一个友善的AI助手。
<|im_end|>
<|im_start|>user
你好,请介绍一下自己。
<|im_end|>
<|im_start|>assistant
作为一个AI助手,我很高兴能够与您交流。我是一个设计用来协助和回答各种问题的人工智能程序。我可以处理多种主题,包括但不限于科技、历史、文化、科学等。我的知识库涵盖了广泛的领域,但它是静态的,截止到2024年4月。
我的主要目标是提供有用、准确和友好的回答。我会尽力理解您的问题并给出最相关的信息。如果有什么不清楚的地方,我会请求澄清。我也可以进行一些基本的分析、计算,甚至是创意写作。
虽然我很乐意与您交流,但请记住我是一个AI,没有真实的情感或个人经历。我的回答是基于程序和数据的。如果您有任何其他问题或需要帮助,请随时告诉我。
<|im_end|>
这就是使用 QwenTemplate 类定义的模板渲染后的真实输出效果。每个部分(系统消息、用户输入和助手回复)都被特定的标记包围,以便模型能够区分不同的角色和消息边界。这种格式有助于模型理解对话的结构和上下文,从而生成更加连贯和相关的回复。