自定义 MLC Chat 配置
mlc-chat-config.json
在编译时和运行时都是必需的,因此有两个用途:
指定我们如何编译模型(如 编译模型库 所示),以及
在运行时指定对话行为。
本页重点介绍第二个目的。 解释了聊天配置的组成部分,以及如何通过修改文件来自定义这些部分。此外,运行时环境还提供了 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>>