chat template - alpaca & chatml
LLM 모델들의 chat-template 총정리: Alpaca부터 ChatML까지
LLM 모델 중 chat (instruct) 모델의 경우에는 API로 사용할 때 /v1/completions
를 통한 텍스트 문자열 대신 /v1/chat/completions
를 통한 role과 content로 이루어진 messages 배열을 입력으로 받습니다.
이런 메세지 배열을 실제로 모델에 입력하기 앞서 텍스트 문자열 형식으로 변환하여야 하는데 이때 chat template이 사용됩니다. chat template은 위에 messages 배열을 어떤 포맷의 텍스트 문자열로 변환할지를 결정하는 jinja template를 의미합니다.
아래는 많은 chat template format 중 하나인 chatml format의 간소화된 예시입니다.
위에 messages 배열을 chatml format을 통해 변환하면 다음과 같은 텍스트 문자열이 생성됩니다.
기본적으로 <|im_start|>
과 <|im_end|>
는 각각 턴의 시작과 끝을 나타내며, 마지막 하이라이팅된 부분은 model에게 지침을 제공하기 위해 add_generation_prompt
옵션을 True로 하여 앞으로 생성해야할 부분의 시작을 (<|im_start|>assistant\n
) 랜더링 한 결과입니다.
이렇게 랜더링된 텍스트를 모델에게 입력하면 모델은 다음과 같이 응답을 생성합니다.
여기서 실제로 모델은 <맥락과 턴에 맞게 생성된 응답>
과 <|im_end|>
를 생성하였고, stop token (eos token)으로 <|im_end|>
이 인식되어 생성이 중단되었습니다.
여기까지 완료되면 /v1/chat/completions
에 대한 응답으로 모델의 응답이 반환됩니다.
이러한 유저와 모델의 대화를 특정한 포맷으로 나타내는 것을 넓은 범위에서 Chat markup language (ChatML)이라고 하고 그 파생형들이 존재합니다. (*ChatML이라는 이름은 특정 포맷을 가리키기도 합니다.) 이런 특정 포맷으로 랜더링 시켜주는 탬플릿 코드가 Chat template이며 이는 각 모델이 Instruct tuning를 하는 과정에서 학습되기 때문에 모델별로 고유한 탬플릿이 존재합니다.
chat template 포맷 종류
ChatML
가장 광범위하게 채택된 포맷이며 준수한 성능을 보여줍니다. ChatML과 그 파생형을 사용하는 대표적인 모델은 다음과 같습니다.
Qwen, Hermes, SmolLM, Dolphin, InternLM (파생형)....
턴의 시작을 알리는 <|im_start|>{{role}}\n
과 턴의 끝을 알리는 <|im_end|>
를 사용합니다.
BOS: <|begin_of_text|>
(Depends on model)
EOS: <|im_end|>
Alpaca
스탠포드에서 개발된 Alpaca 7B 모델에서 적용된 포맷입니다. 싱글턴을 전제하에 개발되었으며 prompt_no_input, prompt_input 2가지 버전이 존재한다.
Mistral (Latest)
mistral 계열은 특징으로 렌더링 결과가 개행 없이 한 줄로 나온다는 점이 있는데, 아래에서는 시각적 편의를 위해 줄바꿈을 추가하였습니다. 또한 mistralai는 chat template를 가장 자주 업데이트하고 개선하는데 버전 별로 공백처리, 개행처리 등의 개선을 보는 것도 재미있습니다.
BOS: <s>
EOS: </s>
For more information about the tokenizer please refer to mistral-common
Llama 3.x
llama 계열 Instruct 모델에서 사용되는 포맷이다.
EOS와 다음 지침을 의미하는 스페셜 토큰 간에 개행이 없는 것이 특징이다.
BOS: <|begin_of_text|>
EOS: <|eot_id|>
모델별 chat template 찾는 법
모델 별로 학습할 때 사용된 탬플릿을 찾아서 올바르게 사용하는 것이 모델 성능에 큰 영향을 미치는데, 이를 찾는 방법은 어렵지 않습니다.
-
huggingface files에서
tokenizer_config.json
파일 찾기
모델이 instrcut 모델이라면 높은 확율로tokenizer_config.json
파일에 chat template 필드가 존재합니다. 보통 한줄로 포맷팅되어 있으며 여기에 탬플릿이 존재한다면 대부분 그대로 사용하면 됩니다.hf.co/NousResearch/Hermes-3-Llama-3.2-3B/blob/main/tokenizer_config.json -
model card에 명시된 "Prompting Template" 찾기
모델 제작자가 친절한 경우 어떤 탬플릿이 작동작하는지에 대하여 서술해두는 경우가 있습니다. 어떤 방법으로 학습했는지에 따라 완전히 다른 탬플릿이 사용되기도 하니 이를 참고하여 사용하면 됩니다.
아래의 경우 Mistral[INST]
탬플릿과 ChatML의 혼합된 형태를 사용하고 있습니다.
e.g. Sao10K/MN-12B-Lyra-v3