From a4186a64f3a48a8ba8f1b329be812a5035ef17e8 Mon Sep 17 00:00:00 2001 From: Jintao Huang Date: Tue, 18 Nov 2025 21:51:09 +0800 Subject: [PATCH] fix chatml chat template --- swift/llm/template/template/utils.py | 2 +- swift/llm/template/template_meta.py | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/swift/llm/template/template/utils.py b/swift/llm/template/template/utils.py index c55aaf0ae1..18c5d47079 100644 --- a/swift/llm/template/template/utils.py +++ b/swift/llm/template/template/utils.py @@ -15,7 +15,7 @@ class ChatmlTemplateMeta(TemplateMeta): prefix: Prompt = field(default_factory=list) prompt: Prompt = field(default_factory=lambda: ['<|im_start|>user\n{{QUERY}}<|im_end|>\n<|im_start|>assistant\n']) chat_sep: Optional[Prompt] = field(default_factory=lambda: ['<|im_end|>\n']) - suffix: Prompt = field(default_factory=lambda: ['<|im_end|>']) + suffix: Prompt = field(default_factory=lambda: ['<|im_end|>\n']) system_prefix: Optional[Prompt] = field(default_factory=lambda: ['<|im_start|>system\n{{SYSTEM}}<|im_end|>\n']) auto_add_bos: bool = True diff --git a/swift/llm/template/template_meta.py b/swift/llm/template/template_meta.py index 7db56f705d..ed23c84de9 100644 --- a/swift/llm/template/template_meta.py +++ b/swift/llm/template/template_meta.py @@ -114,18 +114,20 @@ def init(self, tokenizer: PreTrainedTokenizerBase) -> None: value = self._token_attr_to_id(tokenizer, value) setattr(self, key, value) - if self.suffix and self.suffix[-1] not in self.stop_words: - self.stop_words.append(self.suffix[-1]) + suffix_stop = self.suffix[-1] if self.suffix else None + if isinstance(suffix_stop, str): + suffix_stop = suffix_stop.strip() + if suffix_stop and suffix_stop not in self.stop_words: + self.stop_words.append(suffix_stop) if tokenizer.eos_token not in self.stop_words: self.stop_words.append(tokenizer.eos_token) self.stop_token_id = tokenizer.eos_token_id - if self.suffix: - suffix_tokens = self.suffix[-1] - if isinstance(suffix_tokens, str): - stop_token_id = tokenizer.convert_tokens_to_ids(suffix_tokens) - elif isinstance(suffix_tokens, list) and len(suffix_tokens) == 1: - stop_token_id = suffix_tokens[0] + if suffix_stop: + if isinstance(suffix_stop, str): + stop_token_id = tokenizer.convert_tokens_to_ids(suffix_stop) + elif isinstance(suffix_stop, list) and len(suffix_stop) == 1: + stop_token_id = suffix_stop[0] else: stop_token_id = None if stop_token_id is not None: