트랜스포머·PEFT 2일 과정8장 · PEFT와 LoRA 학습13 / 18← 이전목차다음 →MetaContents

8장. PEFT와 LoRA 학습

실습 2 — 학습 전의 답 기록해 두기

학습 효과를 비교하려면 학습 전 답을 먼저 적어 두어야 합니다. 다이어트 전 사진을 찍어 두는 것과 같습니다. 학습 데이터에 없는 질문 두 개로 학습 전 답을 저장합니다. 실습 1을 실행한 상태에서 이어서 실행합니다.

코드를 단계별로 따라가기 전에 실행 흐름을 한 장으로 봅니다. 두 갈래는 질문만 다르고 꼴이 같은 셀입니다.

실습 2 코드의 실행 흐름도. 실습 1 뒤의 model 과 6차시의 chat 함수를 쓴 뒤 A 갈래는 체크리스트 질문 question_1 의 답을 before_answer_1 에, B 갈래는 파이썬 질문 question_2 의 답을 before_answer_2 에 저장하고 찍는다
갈래단계반복과 조건핵심 한 줄
A. 체크리스트 질문1없음before_answer_1 = chat(model, question_1)
B. 파이썬 질문2없음before_answer_2 = chat(model, question_2)
  • 갈래의 색: A 는 짙은 청록, B 는 살구입니다. 두 셀은 질문 변수 이름만 다르고 하는 일이 같습니다.
  • 마름모가 없는 까닭: chat 안의 generate 는 토큰을 하나씩 최대 80개까지 이어 쓰는 반복을 하지만, 코드에는 보이지 않으므로 네모 하나로 그렸습니다.
  • 끝부분: 두 답은 before_answer_1, before_answer_2 에 남습니다. 실습 4에서 학습 후의 답과 나란히 놓고 견줍니다.

1단계. 첫 번째 질문의 학습 전 답

6장에서 만든 chat 함수로 업무 질문 하나를 던져 지금의 말투를 기록합니다.

Python · GPU 필요 (출력은 RTX 3080 에서 실행한 결과)
# 학습 데이터(persona_sft_raw.csv)에 없는 질문이라야 "말투가 일반화되었는지" 볼 수 있다
question_1 = "업무 실수를 줄이려면 체크리스트를 쓰는 게 좋을까?"  # 학습 데이터에 없는 첫 번째 질문입니다.
# chat(모델, 질문): 6차시의 함수. 대본 양식을 입히고 greedy 로 최대 80토큰을 이어 쓴다
before_answer_1 = chat(model, question_1)  # 학습 전 답변을 저장합니다.
# 결과: 친절한 기본 말투의 답("네, 업무실시 수준에서의 실수를 ...")이 80토큰에서 잘린다
print(f"Q: {question_1}\nA: {before_answer_1}")
출력
Q: 업무 실수를 줄이려면 체크리스트를 쓰는 게 좋을까?
A: 네, 업무실시 수준에서의 실수를 줄이는 것이 중요합니다. 체크리스트(예: '1번', '2번')은 일정에 따라 적절한 작업을 수행하는 데 도움이 됩니다.

하지만 이 방법은 단순히 "일반적인" 실수가 아니라 특정 상황이나 팀원

2단계. 두 번째 질문의 학습 전 답

성격이 다른 질문 하나를 더 기록해 둡니다.

Python · GPU 필요 (출력은 RTX 3080 에서 실행한 결과)
# 공부 방법을 묻는 두 번째 질문(역시 학습 데이터에 없다)
question_2 = "파이썬을 처음 배우려면 무엇부터 해야 할까?"  # 학습 데이터에 없는 두 번째 질문입니다.
# 같은 chat 함수, 같은 생성 조건(do_sample=False, repetition_penalty=1.2)
before_answer_2 = chat(model, question_2)  # 학습 전 답변을 저장합니다.
# 결과: 번호 목록과 코드 블록이 있는 설명형 답이 80토큰에서 잘린다
print(f"Q: {question_2}\nA: {before_answer_2}")
출력
Q: 파이썬을 처음 배우려면 무엇부터 해야 할까?
A: 파이썬을 처음 배울 때 가장 기본적인 부분은 Python의 기본 구문과 정수 연산자를 사용하는 것입니다.

1. **Python의 Basic Syntax**: 파이썬에서 가장 중요한 것은 'print()' 함수와 변수 선언입니다.
   ```python
   print("Hello World!")
   ```

2. **정수 연산자**:
   - `+

Qwen 의 답 안에 마크다운 코드 블록이 들어 있어, 교안 화면이 깨지지 않게 그 표시(백틱 세 개)만 전각 문자 ``` 로 바꿔 적었습니다. 실제 출력에는 보통 백틱이 찍힙니다.

이 실습이 뜻하는 것

다이어트 전 사진 두 장을 찍어 둔 일입니다. 여기서 사진기가 chat, 찍은 사진이 before_answer_1, before_answer_2 입니다.

단계출력뜻
1. 체크리스트 질문"네, 업무실시 수준에서의 실수를 줄이는 것이 중요합니다. ..."공손한 기본 비서 말투입니다
2. 파이썬 질문"파이썬을 처음 배울 때 가장 기본적인 부분은 ..." 과 번호 목록설명형 답이고, 80토큰에서 잘렸습니다

한 줄로 줄이면, 학습 전 Qwen 은 두 질문 모두 친절한 설명형 말투로 답합니다. 실습 4에서 같은 질문으로 다시 찍어 견줍니다.

코드 설명

  • chat(model, question) 은 6장 셀 7에서 만든 함수입니다. apply_chat_template 으로 대본 양식을 입히고, generate 로 최대 80토큰을 이어 씁니다.
  • do_sample=False(greedy, 늘 가장 높은 점수의 토큰)라서 같은 모델, 같은 질문이면 같은 답이 나옵니다. 그래서 학습 전후 비교가 공정합니다.
  • 답이 문장 중간에서 끊긴 것은 max_new_tokens=80 에서 멈췄기 때문입니다. 0.5B 모델이라 "업무실시" 같은 어색한 말도 섞입니다.
  • 두 질문은 학습 데이터에 없는 것으로 골랐습니다. 학습 데이터의 질문으로 확인하면 외운 답인지 배운 말투인지 가를 수 없습니다.
← 이전 절8장 · 실습 1 — Qwen 에 LoRA 붙였다 떼기다음 절 →8장 · 실습 3 — SFTTrainer 로 LoRA 학습하기