InternLM/lmdeploy项目中的自定义对话模板详解
什么是对话模板
在大型语言模型(LLM)应用中,对话模板(Dialogue Template)是指定模型如何组织和格式化对话历史的结构化方式。它定义了系统消息、用户输入、助手响应等各个部分在对话中的排列方式以及特殊标记的使用。
InternLM/lmdeploy项目提供了灵活的对话模板定制功能,让开发者可以根据需求调整模型对话的格式和行为。
查看内置对话模板
在开始自定义之前,我们可以先查看lmdeploy内置的对话模板。通过命令行工具可以列出所有可用模板:
lmdeploy list
这将显示项目预定义的各种对话模板名称,如"internlm"、"vicuna"等。
自定义对话模板的两种方法
方法一:通过JSON配置文件
这是最简单快捷的自定义方式,适合大多数场景。我们创建一个JSON文件来定义模板:
{
"model_name": "my_custom_template",
"system": "<|im_start|>system\n",
"meta_instruction": "你是一个专业的AI助手",
"eosys": "<|im_end|>\n",
"user": "<|im_start|>user\n",
"eoh": "<|im_end|>\n",
"assistant": "<|im_start|>assistant\n",
"eoa": "<|im_end|>",
"separator": "\n",
"capability": "chat",
"stop_words": ["<|im_end|>"]
}
关键字段说明:
model_name
: 必填,可以是内置模板名称(覆盖原有模板)或新名称(创建新模板)system
: 系统消息前缀meta_instruction
: 系统提示词user/eoh
: 用户输入的前缀和后缀assistant/eoa
: 助手回复的前缀和后缀stop_words
: 停止词列表,用于控制生成终止
使用此模板的两种方式:
- 命令行方式:
lmdeploy serve api_server internlm/internlm2_5-7b-chat --chat-template my_template.json
- Python API方式:
from lmdeploy import ChatTemplateConfig, serve
serve('internlm/internlm2_5-7b-chat',
chat_template_config=ChatTemplateConfig.from_json('my_template.json'))
方法二:通过Python类继承
对于需要更复杂控制的场景,可以继承BaseChatTemplate
类创建自定义模板:
from lmdeploy.model import MODELS, BaseChatTemplate
@MODELS.register_module(name='my_advanced_template')
class MyChatTemplate(BaseChatTemplate):
"""高级自定义对话模板"""
def __init__(self,
system='[SYSTEM]',
meta_instruction='你是一个专家级AI',
user='[USER]',
assistant='[ASSISTANT]',
eosys='\n',
eoh='\n',
eoa='\n',
separator='\n',
stop_words=['[END]']):
super().__init__(system=system,
meta_instruction=meta_instruction,
eosys=eosys,
user=user,
eoh=eoh,
assistant=assistant,
eoa=eoa,
separator=separator,
stop_words=stop_words)
使用自定义类:
from lmdeploy import ChatTemplateConfig, pipeline
messages = [{'role': 'user', 'content': '你好'}]
pipe = pipeline('internlm/internlm2_5-7b-chat',
chat_template_config=ChatTemplateConfig('my_advanced_template'))
for response in pipe.stream_infer(messages):
print(response.text, end='')
模板调试技巧
- 设置日志级别为INFO可以查看模板应用效果
- 模板中的特殊标记(如
<|im_end|>
)需要与模型训练时使用的标记一致 - 确保停止词(stop_words)设置正确,避免生成不完整
最佳实践建议
- 对于简单调整,优先使用JSON配置文件方式
- 需要复杂逻辑(如动态生成系统提示)时使用Python类方式
- 保持模板风格与模型训练时一致
- 测试不同模板对生成质量的影响
- 记录使用的模板配置以便复现结果
通过灵活使用lmdeploy的对话模板功能,开发者可以更好地控制模型对话行为,适应各种应用场景需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考