본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 17. 08:27

Foundation vs. Instruct vs. Chat 모델: 하나의 질문, 세 가지 답변

요약

Foundation, Instruct, Chat 모델의 차이점을 SmolLM2 모델을 통해 설명하는 실습 튜토리얼입니다. 각 모델의 작동 원리와 인스트럭트 모델 사용 시 채팅 템플릿의 중요성을 다룹니다.

핵심 포인트

  • Foundation 모델은 어시스턴트가 아닌 텍텍스트 완성기(Text Completer)로 동작함
  • Instruct 모델은 지시어와 응답 쌍을 통한 미세 조정(Fine-tuning)을 거침
  • Instruct 모델 사용 시 토크나이저의 채팅 템플릿을 통한 특수 형식 적용이 필수적임

Google Colab에서 무료로 실행할 수 있는 실습 튜토리얼입니다.

직접 실행해 보세요: Google Colab에서 foundation_instruct_chat_tutorial.ipynb를 열고 모든 셀을 위에서 아래로 실행하세요. 이 튜토리얼은 SmolLM2-135M 제품군을 사용하며, GPU 없이 무료 CPU 런타임에서도 실행 가능할 만큼 작습니다.

왜 모두를 혼란스럽게 만드는가

사람들은

그것은 _"이 질문에 답해야겠다."_라고 생각하지 않습니다. 대신 _"인터넷상에서, 이런 문장 뒤에는 보통 무엇이 뒤따라오는가?"_라고 생각합니다. 그리고 그 답은 종종... 더 많은 퀴즈 문제, 학습지, 혹은 곁가지 내용인 경우가 많습니다:

프랑스의 수도는 어디인가요? 독일의 수도는 어디인가요? 이탈리아의
수도는 어디인가요? ...

노트북에서는 아무런 포맷팅 없이 원문 문자열(raw string)을 파이프라인(pipeline)에 그대로 전달합니다:

base_pipe = pipeline("text-generation", model="HuggingFaceTB/SmolLM2-135M")
base_raw_out = base_pipe(test_query, max_new_tokens=30, do_sample=False)
print(base_raw_out[0]['generated_text'])

핵심 요약(Takeaway): 파운데이션 모델 (foundation model)은 어시스턴트(assistant)가 아니라 **텍스트 완성기 (text completer)**입니다. 방대한 지식을 담고 있지만, _도움이 되어야 한다_는 개념은 없습니다. 그것은 다른 모든 것들이 형상화되는 가공되지 않은 점토와 같습니다.

2. 인스트럭트 모델 (The instruct model): 모델에게 답변하는 법 가르치기

**인스트럭트 모델 (instruct model)**은 동일한 베이스 모델에서 시작하여 두 번째 훈련 단계인 **(지시(instruction) → 응답(response)) 쌍에 대한 미세 조정 (fine-tuning)**을 거칩니다. _"여기 요청이 있습니다. 여기 좋은 응답이 있습니다."_라는 형태의 수천에서 수백만 개의 예시를 학습합니다. 이를 통해 모델은 새로운 계약을 배웁니다: 사용자가 무언가를 요청하면, 실제로 그것을 수행하고 멈춰라.

하지만 사람들이 놓치는 결정적인 세부 사항이 있습니다. 인스트럭트 모델은 텍스트를 **모델이 훈련받은 정확한 특수 형식 (special format)**으로 감싸야만 올바르게 동작한다는 점입니다. 그 형식은 제어 토큰 (control tokens)을 사용하며, SmolLM2의 경우 다음과 같이 생겼습니다:

<|im_start|>user
What is the capital of France?<|im_end|>
<|im_start|>assistant

이 토큰들을 직접 타이핑하는 것은 아닙니다. 모든 인스트럭트 모델은 토크나이저 (tokenizer)에 내장된 **채팅 템플릿 (chat template)**을 함께 제공하여 이를 자동으로 생성해 줍니다:

tokenizer = AutoTokenizer.from_pretrained(instruct_id)
formatted_prompt = tokenizer.apply_chat_template(
    [{"role": "user", "content": test_query}],
...

이 형식을 동일한 크기의 모델에 입력하면 다음과 같이 깔끔하고 직접적인 답변을 얻을 수 있습니다:

The capital of France is Paris.

노트북은 생성하기 에 포맷팅된 프롬프트 (prompt)를 출력하므로, 모델이 받는 숨겨진 스캐폴딩 (scaffolding)을 말 그대로 직접 확인할 수 있습니다. "아하 — 모델 내부에는 이런 전체적인 구조가 있구나"라는 깨달음은 이 튜토리얼에서 가장 중요한 부분입니다.

핵심 요약 (Takeaway): 인스트럭트 (instruct) 모델 = 베이스 (base) 모델 + 인스트럭션 튜닝 (instruction tuning) + 필수 프롬프트 포맷 (prompt format). 포맷을 건너뛰면 잘 훈련된 인스트럭트 모델이라 할지라도 횡설수설하는 상태로 돌아갈 수 있습니다.

3. 채팅 (chat) 모델: 턴(turn) 간의 메모리

사람들을 놀라게 하는 부분은 바로 이것입니다: 채팅 모델은 보통 인스트럭트 모델과 동일한 가중치 (weights)를 가집니다. 차이점은 모델이 '무엇'인가가 아니라, '어떻게 구동하느냐'에 있습니다.

하나의 명령 입력에 하나의 응답이 나오는 대신, **역할(role)이 태그된 메시지들의 실행 목록 (running list)**을 유지합니다:

chat_history = [
    {"role": "user", "content": "What is the capital of France?"},
]
...

파이프라인 (pipeline)이 사용자를 대신해 채팅 템플릿 (chat template)을 적용하며, 어시스턴트 (assistant)의 답변이 추가된 대화 전체를 반환합니다. 단일 턴 (single turn)의 경우, 이는 인스트럭트 예시와 동일해 보입니다. 마법은 대화가 지속될 때 비로소 나타납니다.

따라서 노트북에서는 답변을 추가하고 의도적으로 모호한 후속 질문을 던집니다:

conversation = chat_out[0]['generated_text']        # 지금까지의 user + assistant
conversation.append({"role": "user",
                     "content": "And what is a famous landmark there?"})
...

**"거기 (there)"**라는 단어는 그 자체로는 의미가 없습니다. 하지만 우리가 _전체 이력 (entire history)_을 전달했기 때문에, 모델은 "거기"를 **파리 (Paris)**로 해석하고 유명한 랜드마크를 언급합니다. 이렇게 전달된 문맥 (context)이 단발성 질의응답을 대화처럼 느껴지게 만드는 요소입니다.

핵심 요약 (Takeaway): 채팅 모델은 멀티 턴 (multi-turn) 메시지 목록을 통해 구동되는 인스트럭트 모델이므로, 각 새로운 턴이 이전 턴들을 문맥으로 사용할 수 있습니다. 시스템 프롬프트 (system prompt), user/assistant 역할, 그리고 계속 쌓이는 이력이 바로 "채팅" 부분입니다.

하나의 표로 보는 전체 그림

모델학습 목표입력값_"프랑스의 수도는 어디인가요?"_에 대한 답변
Foundation텍스트 이어 쓰기가공되지 않은 문자열 (raw string)문장을 메아리처럼 반복하거나 이어 나감 — 답변을 하지 않을 수도 있음
...
위에서 아래로 읽어보면, 이는 서로 관련 없는 세 가지가 아니라 하나의 발전 과정입니다:
  1. Foundation 모델은 텍스트를 예측함으로써 세상을 학습합니다.
  2. Instruct 모델은 그 지식을 지시 수행 (do-what-I-ask) 동작으로 미세 조정 (fine-tune)하며, 특정 프롬프트 (prompt) 형식을 요구합니다.
  3. Chat 모델은 Instruct 모델을 _멀티턴 인터페이스 (multi-turn interface)_로 감싸서 대화의 맥락 (context)이 턴(turn)을 거쳐 흐를 수 있게 합니다.

상용 어시스턴트와 대화할 때, 여러분은 1단계 위에 구축되고 2단계 위에 놓여 있는 3단계를 사용하고 있는 것입니다.

정직함과 규모에 관한 참고 사항

SmolLM2-135M은 매우 작습니다 (tiny) — 최첨단 (frontier) 모델들이 수십억 또는 수천억 개의 파라미터 (parameters)를 가진 것에 비해 약 1억 3,500만 개의 파라미터를 가집니다. 이 정도 규모에서는 모델이 때때로 사실을 틀리게 말하거나, 말을 반복하거나, 문장을 끝맺지 못할 수 있습니다. 이는 예상된 결과이며, 그것이 핵심이 아닙니다. 이 튜토리얼은 상식 퀴즈 대회에서 이기기 위한 것이 아니라, 무료 노트북이나 Colab CPU 환경에서 세 가지 모드 사이의 행동적 (behavioral) 차이를 눈으로 확인할 수 있도록 설계되었습니다. 정확히 동일한 3단계 구조는 실제 서비스되는 가장 거대한 모델들에 이르기까지 그대로 확장 적용됩니다.

실행 및 실습

  1. Google Colab에서 foundation_instruct_chat_tutorial.ipynb를 엽니다 (파일 → 노트북 열기 → 업로드를 선택하거나, GitHub에 푸시한 후 Colab 배지를 사용하세요).
  2. 모든 셀을 실행합니다 (런타임 → 모두 실행). 첫 실행 시 모델을 다운로드하므로 잠시 기다려 주세요.
  3. 실험해 보세요:
    • test_query를 `

세 가지 동작을 직접 눈으로 확인하고 나면, base, instruct, chat, chat template, system prompt와 같은 용어들이 더 이상 전문 용어(jargon)가 아닌 당연한 개념으로 다가올 것입니다.

즐거운 실험 되시길 바랍니다! 🚀

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0