LLM 엔지니어링4장 · LLM 을 완성하는 3단계와 Hugging Face16 / 23← 이전목차다음 →MetaContents

4장. LLM 을 완성하는 3단계와 Hugging Face

실습 2 — 기본 모델과 지시 모델 견주기

같은 고객 문의를 기본 모델(Qwen2.5-0.5B)과 지시 모델(Qwen2.5-0.5B-Instruct)에 넣어 이어 쓰게 하고, 기본 모델에 여러 생성 설정을 써 봅니다. 미세조정과 정렬이 무엇을 바꾸는지 눈으로 보는 실습입니다. 지시 모델은 3장에서 받아 둔 것을 씁니다.

1단계. 두 모델 불러오기

Python
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

def load(name):
    """토크나이저와 모델을 짝 맞춰 불러온다(CPU, float32)."""
    tok = AutoTokenizer.from_pretrained(name)
    m = AutoModelForCausalLM.from_pretrained(name, dtype=torch.float32)
    return tok, m.eval()

base_tok, base = load("Qwen/Qwen2.5-0.5B")             # 사전학습만 한 기본 모델
inst_tok, inst = load("Qwen/Qwen2.5-0.5B-Instruct")    # 미세조정과 정렬을 거친 지시 모델
print("불러오기 완료")
출력
불러오기 완료

2단계. 같은 글을 이어 쓰게 하기

Python
prompt = "고객: 배송이 너무 늦어요. 언제 도착하나요?\n상담원:"

def continue_text(tok, m, text, **gen):
    """text 뒤를 이어 쓴 부분만 돌려준다. gen 에 생성 설정을 넘긴다."""
    enc = tok(text, return_tensors="pt")
    with torch.no_grad():
        out = m.generate(**enc, max_new_tokens=50, pad_token_id=tok.eos_token_id, **gen)
    return tok.decode(out[0][enc["input_ids"].shape[1]:], skip_special_tokens=True).strip()

# 탐욕적 선택: 늘 1등 토큰
print("[기본 모델]", continue_text(base_tok, base, prompt, do_sample=False))
print("[지시 모델]", continue_text(inst_tok, inst, prompt, do_sample=False))
출력
[기본 모델] 배송이 너무 늦어요. 배송이 너무 늦어요. 배송이 너무 늦어요. 배송이 너무 늦어요. 배송이 너무 늦어요. 배송이 너무 늦어요. 배송
[지시 모델] 배송은 저희가 지속적으로 노력하고 있습니다. 하지만, 일부 고객들이 특정 시간에 도착하는 것을 원합니다. 이 경우, 저희는 해당 고객에게 최선을 다해 도착시켜드리겠습니다. 또한, 고객

3단계. 기본 모델에 생성 설정 바꿔 보기

Python
settings = {
    "반복 벌점 1.3": dict(do_sample=False, repetition_penalty=1.3),
    "샘플링(온도 0.7, top-p 0.9)": dict(do_sample=True, temperature=0.7, top_p=0.9),
    "샘플링(온도 1.5)": dict(do_sample=True, temperature=1.5, top_k=50),
}
for label, gen in settings.items():
    torch.manual_seed(42)            # 샘플링도 씨앗을 고정해 다시 돌려도 같게
    print(f"[{label}]", continue_text(base_tok, base, prompt, **gen))
출력
[반복 벌점 1.3] 10일 전에 왔는데, 지금까지는 안 되네요.
저희가 고객님의 상담을 하기 위해 필요한 정보를 제공해 드립니다. 저희에게 직접 문의하시면 더 깊은
[샘플링(온도 0.7, top-p 0.9)] 제대로 배송하지 않으면 오래 걸릴 수 있습니다. 하지만 배송 시간을 늦게 하려면 주문 취소를 해야 합니다.
고객: 배송이 너무 늦어요. 배송이 너무 �
[샘플링(온도 1.5)] 영업일 기준보다 오려다 11-12번수요로 해서 11월까지 배송이 됩니다. 다시 상담실에 이메일 혹은 SMS 알림으로 다시 연락해 주

이 실습이 뜻하는 것

이 실습은 같은 학교를 나온 두 신입에게 같은 고객 문의 쪽지를 건네는 것과 같습니다. 책만 많이 읽은 사람과 상담 교육까지 받은 사람을 불러오고(1단계), 같은 쪽지를 주고 이어 말하게 한 뒤(2단계), 책만 읽은 사람에게 "같은 말 되풀이하지 마", "조금 자유롭게 말해 봐" 같은 말하기 규칙만 바꿔 줍니다(3단계). 여기서 책만 읽은 사람이 기본 모델, 교육까지 받은 사람이 지시 모델, 말하기 규칙이 생성 설정입니다. 비유와 다른 점은, 사람은 규칙의 뜻을 헤아리지만 생성 설정은 다음 토큰을 고르는 확률 계산만 바꾼다는 것입니다.

단계출력뜻
1. 불러오기불러오기 완료같은 크기의 두 모델이 메모리에 올라왔습니다
2. 기본 모델"배송이 너무 늦어요."의 되풀이질문에 답하지 않고 고객의 말을 계속 따라 씁니다. 사전학습만 한 모델은 "그럴듯한 다음 글"만 고릅니다
2. 지시 모델"배송은 저희가 지속적으로 노력하고 있습니다…"상담원처럼 답하는 꼴은 갖췄습니다. 쇼핑몰의 실제 배송 기간은 모르니 내용은 두루뭉술합니다
3. 반복 벌점 1.3"10일 전에 왔는데, 지금까지는 안 되네요."되풀이는 사라졌지만 상담원이 아니라 고객의 말을 이어 씁니다
3. 온도 0.7, top-p 0.9"…주문 취소를 해야 합니다."문장은 그럴듯하지만 엉뚱한 내용이 섞이고, 끝에서 다시 고객의 말로 돌아갑니다
3. 온도 1.5"11-12번수요로…"덜 확실한 토큰까지 자주 고르니 뜻이 무너집니다

한 줄로 줄이면, 뿌리가 같은 두 모델 가운데 미세조정과 정렬을 거친 쪽만 질문에 답하는 꼴을 갖췄고, 생성 설정을 바꿔서는 그 차이를 메울 수 없다는 것을 보인 실습입니다. 답하는 법을 직접 가르치는 일은 실습 6의 SFT(Supervised Fine-Tuning, 지도 미세조정)에서 합니다. 샘플링 결과는 씨앗을 고정해서 같게 나온 것이고, 씨앗을 바꾸면 다른 문장이 나옵니다.

코드 설명

  • 두 모델은 같은 회사가 같은 기본 모델에서 만든 것이라, 차이는 미세조정과 정렬에서만 옵니다.
  • 기본 모델은 "배송이 너무 늦어요."를 한없이 되풀이합니다. 앞의 글과 가장 그럴듯하게 이어지는 글이 같은 문장의 반복이라고 본 것입니다. 지시 모델은 "배송은 저희가 지속적으로 노력하고 있습니다"처럼 상담원의 말로 답합니다. 내용은 두루뭉술하지만 "질문에 답한다"는 꼴은 갖췄습니다. 이 차이가 미세조정과 정렬이 만든 것입니다.
  • 반복 벌점 1.3 을 주자 되풀이는 사라졌지만 "10일 전에 왔는데, 지금까지는 안 되네요"처럼 고객의 말을 이어 쓰기 시작합니다. 온도 0.7 샘플링은 그럴듯하지만 "배송 시간을 늦게 하려면 주문 취소를 해야 합니다" 같은 엉뚱한 말이 섞이고, 온도 1.5 는 "11-12번수요로"처럼 뜻이 무너집니다. 생성 설정은 모양을 바꿀 뿐, 기본 모델에게 답하는 법을 가르쳐 주지는 못합니다.
  • pad_token_id=tok.eos_token_id 는 "채울 토큰이 따로 없으니 끝 표시를 대신 쓴다"는 설정입니다. 빼면 경고가 나오는 모델이 있습니다.
← 이전 절4장 · 실습 1 — Hugging Face 에서 모델 불러오기다음 절 →4장 · 실습 3 — 우리 토크나이저 학습하기