LLM을 공부하다 보면 챗 템플릿(Chat Template) 과 생성 프롬프트 템플릿(Generation Prompt Template) 이라는 용어를 자주 만나게 된다.
이 둘은 비슷해 보이지만 역할이 다르다.
간단히 말하면:
이다.
챗 모델은 일반적으로 다음과 같은 메시지 구조를 입력으로 사용한다.
messages = [
{"role": "system", "content": "You are helpful"},
{"role": "user", "content": "안녕"}
]
하지만 실제 모델은 결국 토큰 시퀀스만 이해한다.
따라서 이러한 메시지 구조를 모델이 학습한 문자열 형식으로 변환해야 한다.
이 변환 규칙이 바로 챗 템플릿(Chat Template) 이다.
예를 들어 다음과 같은 메시지가 있다고 하자.
messages = [
{"role": "system", "content": "You are helpful"},
{"role": "user", "content": "안녕"}
]
Llama 계열 모델에서는 다음과 같이 변환될 수 있다.
<|system|>
You are helpful
<|user|>
안녕
<|assistant|>
다른 모델에서는 다음과 같은 형식을 사용할 수도 있다.
[INST] 안녕 [/INST]
즉 챗 템플릿은
메시지 구조를 실제 모델 입력 문자열로 바꾸는 포맷
이라고 볼 수 있다.
생성 프롬프트 템플릿은 모델에게 특정 작업을 수행하도록 지시하는 프롬프트 구조이다.
예를 들어 감정 분석을 수행한다고 가정해보자.
template = """
다음 문장의 감정을 분석하시오.
문장: {text}
감정:
"""
입력 문장이 다음과 같다면
text = "오늘 너무 행복하다"
최종 프롬프트는 다음과 같이 생성된다.
다음 문장의 감정을 분석하시오.
문장: 오늘 너무 행복하다
감정:
즉 생성 프롬프트 템플릿은
입력 데이터를 특정 작업용 프롬프트로 조립하는 템플릿
이다.
| 구분 | 챗 템플릿 | 생성 프롬프트 템플릿 |
|---|---|---|
| 목적 | 메시지를 모델 입력 포맷으로 변환 | 작업 지시 프롬프트 생성 |
| 대상 | 모델 구조 및 포맷 | 사용자 작업 |
| 역할 | 시스템 레벨 포맷팅 | 작업 설계 |
| 모델 의존성 | 매우 높음 | 비교적 낮음 |
| 예시 | `< | user |
| 주 사용처 | Hugging Face Tokenizer | LangChain, 프롬프트 엔지니어링 |
실제 LLM 서비스에서는 생성 프롬프트 템플릿과 챗 템플릿을 함께 사용한다.
prompt = f"""
다음을 번역하시오.
{text}
"""
결과:
다음을 번역하시오.
Hello World
messages = [
{"role": "user", "content": prompt}
]
tokenizer.apply_chat_template(messages)
결과:
<|user|>
다음을 번역하시오.
Hello World
<|assistant|>
이후 해당 문자열이 토큰화되어 모델 입력으로 전달된다.
Hugging Face에서는 다음과 같이 챗 템플릿을 적용한다.
tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
여기서 중요한 옵션은 add_generation_prompt=True 이다.
이 옵션을 사용하면 마지막에 Assistant 응답 시작 토큰이 추가된다.
예를 들면:
<|assistant|>
가 자동으로 붙는다.
모델은 이 위치부터 응답 생성을 시작한다.
많은 사람들이 처음에는 다음과 같이 모델을 사용하려고 한다.
prompt = "안녕"
model.generate(prompt)
하지만 대부분의 챗 모델은 실제 학습 시 다음과 같은 형식으로 데이터를 학습했다.
<|user|>
안녕
<|assistant|>
따라서 챗 템플릿을 사용하지 않으면 모델이 학습한 입력 형식과 실제 입력 형식이 달라질 수 있다.
그 결과:
등의 문제가 발생할 수 있다.
챗 템플릿과 생성 프롬프트 템플릿은 서로 다른 역할을 수행한다.
결국 실제 LLM 파이프라인에서는 다음 순서로 동작한다.
사용자 입력
↓
생성 프롬프트 템플릿
↓
챗 메시지 구성
↓
챗 템플릿 적용
↓
토큰화
↓
모델 입력
↓
응답 생성
한 줄로 정리하면,
생성 프롬프트 템플릿은 "무엇을 시킬지"를 정의하고, 챗 템플릿은 "어떻게 모델에게 전달할지"를 정의한다.