채팅 템플릿과 시스템 프롬프트
채팅 템플릿과 시스템 프롬프트
대형 언어 모델은 기본적으로 평문을 이어 쓰는 능력만 있고, 입력과 출력을 구분하지 못해요. 사람과 대화하려면 대화를 특정 형식의 평문으로 바꿔 주는 채팅 템플릿이 필요한데, 모델마다 이 형식이 달라서 제대로 된 결과를 얻으려면 각 모델에 맞는 템플릿을 써야 해요. 여기서는 템플릿이 무엇이고, 언제 직접 고쳐야 하는지, 그리고 GPT4All v3.5부터 바뀐 점을 정리해 드릴게요.
채팅 템플릿이란
모델은 각자 잘 맞는 특정 형식으로 설계되어 있기 때문에, 해당 모델에 맞는 채팅 템플릿을 쓰는 게 중요해요. 내장 모델에 포함된 채팅 템플릿으로는 대부분 충분해요.
템플릿을 직접 바꾸고 싶은 경우는 주로 두 가지예요.
- 모델을 직접 불러오는데(sideloading) 사용할 채팅 템플릿이 없을 때,
- 시스템 메시지가 주는 것보다 LLM 입력을 더 세밀하게 제어하고 싶을 때.
시스템 메시지는 LLM 응답을 대화 전체에 걸쳐 통제하는 메시지예요. "해적처럼 말해."처럼 짧을 수도 있고, LLM이 유지해야 할 컨텍스트를 잔뜩 담은 긴 문장일 수도 있어요. 다만 모든 모델이 시스템 메시지용으로 설계된 건 아니라서, 모델에 따라 더 잘 맞기도 하고 덜 맞기도 해요.
템플릿을 직접 써야 할까
보통 직접 쓸 필요는 없어요. 예외는 공식 모델 목록에 없으면서 내장 채팅 템플릿도 없는 모델이에요. 이 경우 Model Settings 페이지의 채팅 템플릿 필드 위에 Reset 대신 Clear가 표시된답니다.
GPT4All v3.5에서 바뀐 점
GPT4All v3.5는 채팅 템플릿 시스템을 전면 재작업했어요. 핵심 차이는 세 가지예요.
- 채팅 템플릿이 이제 메시지 한 쌍이 아니라 대화 전체를 형식화해요.
%1·%2플레이스홀더 대신 Jinja 문법을 사용해요.- 시스템 메시지에 제어 토큰이나 끝의 공백이 들어가면 안 돼요.
v3.5 이전에 기본값에서 추가·수정한 채팅 템플릿이나 시스템 메시지는 더 이상 동작하지 않아요.
업그레이드 후 생긴 흔한 오류는 시스템 프롬프트에서 다음 세 가지를 확인하면 대부분 해결돼요.
<|im_start|>,<|start_header_id|>,<|system|>같은 제어 토큰### System이나SYSTEM:같은 접두어- 공백 문자나 빈 줄 같은 끝의 공백
이런 게 보이면 제거하면 돼요. 예를 들어 이전 식 시스템 프롬프트:
<|start_header_id|>system<|end_header_id|>
You are a helpful assistant.<|eot_id|>
이렇게 바꾸면 돼요:
You are a helpful assistant.
바꿀 게 없다고 보이면, 메시지를 살짝 고쳤다가 되돌리는 방식으로 오류를 해제할 수 있어요.
채팅 템플릿 찾는 법
모델 채팅 템플릿의 권위 있는 출처는 원본(비-GGUF) 모델이 올라온 HuggingFace 리포지토리예요. GGUF 모델을 받은 페이지의 README가 보통 원본 모델로 연결해 주니까 그 페이지를 찾으면 돼요.
CLI로 찾기 (모든 모델)
- 선호하는 패키지 매니저(Windows는 Chocolatey, macOS는 Homebrew, Ubuntu는 apt)로
jq를 설치합니다. - 모델의 "Files and versions" 탭에서
tokenizer_config.json을 내려받습니다. - 모델 파일을 받은 디렉토리에서 명령 프롬프트를 엽니다.
jq -r ".chat_template" tokenizer_config.json을 실행하면 채팅 템플릿이 사람이 읽기 쉬운 형태로 나옵니다. 이를 복사해 설정 페이지에 붙여 넣으면 돼요.- (선택)
jq -r ".chat_template" tokenizer_config.json > chat_template.txt처럼 텍스트 파일로 저장할 수도 있어요.
출력이 null이면 그 모델은 채팅 템플릿을 제공하지 않는 거예요.
Python으로 찾기 (공개 모델)
pip install transformers로transformers를 설치합니다. 버전은 최소 v4.43.0 이상이어야 해요.- 모델 이름 옆의 클립보드 아이콘으로 HuggingFace 모델 ID를 복사합니다. 예를 들어
https://huggingface.co/NousResearch/Hermes-2-Pro-Llama-3-8B의 ID는NousResearch/Hermes-2-Pro-Llama-3-8B예요. - 파이썬 인터프리터에서 아래 명령을 실행하되, 모델 ID를 복사한 값으로 바꿔주세요.
>>> from transformers import AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained('NousResearch/Hermes-2-Pro-Llama-3-8B')
>>> print(tokenizer.get_chat_template())
출력을 복사해 설정 페이지에 붙여 넣으면 돼요. ValueError가 나면 해당 모델은 채팅 템플릿을 제공하지 않는 거예요.
Python으로 찾기 (게이트 모델)
Llama이나 Mistral 같은 일부 모델은 채팅 템플릿을 공개로 열어두지 않아요. 이 경우 CLI 방법을 쓰거나 아래 파이썬 방법을 따르면 돼요.
git과git-lfs가 설치되어 있어야 해요.- HuggingFace 계정이 있고 로그인되어 있어야 해요.
- 게이트 모델에 이미 접근 권한이 있어야 해요. 없으면 접근을 요청하세요.
- git으로 HuggingFace에 접근할 SSH 키가 설정되어 있어야 해요.
- 모델의 HuggingFace 리포지토리를 SSH 클론 URL로
git clone합니다. 모델 전체(매우 큼)를 받을 필요는 없어요. Linux에서 좋은 방법은 이렇습니다.
$ GIT_LFS_SKIP_SMUDGE=1 git clone hf.co:meta-llama/Llama-3.1-8B-Instruct.git
$ cd Llama-3.1-8B-Instruct
$ git lfs pull -I "tokenizer.*"
- 공개 모델 안내를 따르되, 모델 ID 대신
tokenizer_config.json이 있는 디렉토리 경로를 넣으면 돼요.
>>> tokenizer = AutoTokenizer.from_pretrained('.')