一、基础对话模板结构

DeepSeek模型的对话模板通常遵循多角色分块标记格式,需严格使用预设的标识符分隔不同对话回合。以官方发布的7B/67B对话模型为例,典型结构如下:

<|im_start|>system 
{系统提示内容}<|im_end|>
<|im_start|>user 
{用户输入内容}<|im_end|>
<|im_start|>assistant 
{模型应答内容}<|im_end|>
  • 关键标记
    • <|im_start|>:标识对话角色(system/user/assistant)的起始
    • <|im_end|>:标识当前对话块的结束
  • 强制要求:每个对话块必须包含完整的开始和结束标记,否则可能导致生成失控13

二、模板配置来源

  1. Tokenizer配置文件
    模型目录中的tokenizer_config.json 会明确指定对话模板参数,例如:

    {
      "chat_template": "{% for message in messages %}<|im_start|>{{ message['role'] }}\n{{ message['content'] }}<|im_end|>\n{% endfor %}",
      "roles": ["system", "user", "assistant"]
    }

    需根据实际文件调整数据格式3

  2. Hugging Face官方指南
    通过apply_chat_template方法自动格式化输入:

    from transformers import AutoTokenizer 
    tokenizer = AutoTokenizer.from_pretrained("deepseek-ai/deepseek-llm-7b-chat") 
    messages = [{"role": "user", "content": "你好!"}]
    inputs = tokenizer.apply_chat_template(messages,  return_tensors="pt")


三、微调数据格式要求

  1. 数据集规范
    训练数据需转换为与模板匹配的JSON格式,示例:

    {
      "messages": [
        {"role": "system", "content": "你是一个助手"},
        {"role": "user", "content": "如何学习机器学习?"},
        {"role": "assistant", "content": "建议从线性代数和Python编程开始..."}
      ]
    }

  2. 常见错误规避

    • 缺失结束标记:未添加<|im_end|>会导致生成无限延续3
    • 角色顺序混乱:需严格按system→user→assistant顺序组织对话回合
    • 特殊符号未转义:包含<>的内容需进行HTML转义处理5

四、模板变体与适配

  1. 非对话任务模板
    对于非对话场景(如文本续写),需禁用对话标记,直接输入原始文本:

    inputs = tokenizer("今天天气晴朗,", return_tensors="pt", add_special_tokens=False)

  2. 第三方衍生模型
    基于Llama架构的DeepSeek变体(如DeepSeek-R1-Distill-Llama)可能采用Llama模板:

    [INST] <<SYS>>{系统提示}<</SYS>>\n\n{用户输入} [/INST]
    {模型回答}

    需根据具体模型文档调整5


五、调试与验证方法

  1. 生成效果检查
    通过对比格式化前后的输入数据,验证模板是否正确应用:
    
    print(tokenizer.decode(inputs[0]()[2]()[3]() 。

附:参考资料

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐