自定义 MLC Chat 配置

mlc-chat-config.json 在编译时和运行时都是必需的,因此有两个用途:

  1. 指定我们如何编译模型(如 编译模型库 所示),以及

  2. 在运行时指定对话行为。

本页重点介绍第二个目的。 解释了聊天配置的组成部分,以及如何通过修改文件来自定义这些部分。此外,运行时环境还提供了 API,可以选择性地覆盖某些配置。

在运行时,该文件存储在每个编译模型的目录下(例如 RedPajama 聊天配置)。

MLCChat 配置结构

以下是 Llama2 模型对应的 mlc-chat-config.json 文件:

// mlc-chat-config.json
{
  // 1. Metadata used to specify how to compile a model
  "model_type": "llama",
  "quantization": "q4f16_1",
  "version": "0.1.0",
  "model_config": {
    "hidden_size": 4096,
    "intermediate_size": 11008,
    // more fields here...
  },
  "vocab_size": 32000,
  "context_window_size": 4096,
  "sliding_window_size": -1,
  "prefill_chunk_size": 4096,
  "tensor_parallel_shards": 1,

  // 2. Tokenizer-related fields
  "pad_token_id": 0,
  "bos_token_id": 1,
  "eos_token_id": 2,
  "tokenizer_files": [
    "tokenizer.model",
    "tokenizer.json",
    "tokenizer_config.json"
  ]

  // 3. Conversation template related fields
  "conv_template": {
    "name": "llama-2",
    "system_template": "[INST] <<SYS>>\n{system_message}\n<</SYS>>\n\n ",
    "system_message": "You are a helpful, respectful and honest assistant.",
    // more fields here...
  },

  // 4. Chat related fields that affect runtime behavior
  "temperature": 0.6,
  "repetition_penalty": 1.0,
  "top_p": 0.9
}

备注

mlc-chat-config.json 文件的第一部分中的字段(例如 context-window-size)仅用于编译时。在运行时更改这些字段可能会导致意外行为。

如上所示,该文件分为三个部分。重点关注第三部分,可以通过自定义这部分来改变模型的行为。

conv_template

备注

旧版的 mlc-chat-config.json 可能会为该字段指定字符串以查找已注册的对话模板。这种做法将在未来被弃用。请使用最新版本的 mlc_llm 重新生成配置,以确保该字段是完整的 JSON 对象。

该聊天使用的对话模板。更多信息,请参阅 对话结构

temperature

采样前应用于 logits 的温度值。默认值为 0.7。较高的温度值会鼓励更多样化的输出,而较低的温度值则会产生更确定性的输出。

repetition_penalty

重复惩罚控制模型生成重复文本的可能性。默认值设置为 1.0,表示不应用重复惩罚。增加该值会减少生成重复文本的可能性。然而,设置过高的 repetition_penalty 可能会导致模型生成无意义的文本。理想的重复惩罚值可能因模型而异。

有关重复惩罚如何控制文本生成的更多详细信息,请查看 CTRL 论文

top_p

该参数决定了在解码过程中采样的 token 集合。默认值设置为 0.95。在每一步中,从累积概率超过 top_p 参数的最小集合中选择 token。

有关 top-p 采样的更多信息,请参阅这篇 博客文章

对话结构

MLC-LLM 提供了一组预定义的对话模板,您可以在生成配置时通过指定 --conv-template [name] 直接使用。以下是支持的对话模板列表(不完全):

  • llama-2

  • mistral_default

  • chatml

  • phi-2

  • ...

请参阅 conversation_template 目录以获取支持的模板及其实现的完整列表。

以下是 JSON 对话配置的通用结构(以 vicuna 为例):

// mlc-chat-config.json
{
  // ...
  "conv_template": {
    "name": "llama-2",
    "system_template": "[INST] <<SYS>>\n{system_message}\n<</SYS>>\n\n ",
    "system_message": "You are a helpful, respectful and honest assistant.",
    "roles": {
      "user": "[INST]",
      "assistant": "[/INST]",
      "tool": "[INST]"
    },
    "role_templates": {
      "user": "{user_message}",
      "assistant": "{assistant_message}",
      "tool": "{tool_message}"
    },
    "messages": [],
    "seps": [
      " "
    ],
    "role_content_sep": " ",
    "role_empty_sep": " ",
    "stop_str": [
      "[INST]"
    ],
    "stop_token_ids": [
      2
    ],
    "function_string": "",
    "use_function_calling": false
  }
}
name

对话的名称。

system_template

系统提示模板,它可以选择性地包含系统消息占位符,该占位符将被下面的系统消息替换。

system_message

系统提示的内容(不包含模板格式)。

system_prefix_token_ids

系统 token ids,将在生成的 tokenized 提示的开头添加。

roles

对话角色

role_templates

角色提示模板,它可以选择性地包含默认消息占位符,并将被实际内容替换。

messages

对话历史消息。每条消息是一对字符串,表示 "(角色, 内容)"。内容可以为空。

seps

字符串数组,分别指示在用户消息和模型消息后使用的分隔符。

role_content_sep

消息中角色和内容之间的分隔符。

role_empty_sep

角色和空内容之间的分隔符。

stop_str

当遇到 stop_str 时,模型将停止生成输出。

stop_token_ids

作为停止 token 的 token ID 列表。

function_string

函数调用字符串。

use_function_calling

是否使用函数调用,有助于在 API 调用中检查输出消息格式。

给定对话模板,生成的相应提示格式如下:

<<system>><<messages[0][0]>><<role_content_sep>><<messages[0][1]>><<seps[0]>>
          <<messages[1][0]>><<role_content_sep>><<messages[1][1]>><<seps[1]>>
          ...
          <<messages[2][0]>><<role_content_sep>><<messages[2][1]>><<seps[0]>>
          <<roles[1]>><<role_empty_sep>>