8장. PEFT와 LoRA 학습
실습 2 — 학습 전의 답 기록해 두기
학습 효과를 비교하려면 학습 전 답을 먼저 적어 두어야 합니다. 다이어트 전 사진을 찍어 두는 것과 같습니다. 학습 데이터에 없는 질문 두 개로 학습 전 답을 저장합니다. 실습 1을 실행한 상태에서 이어서 실행합니다.
코드를 단계별로 따라가기 전에 실행 흐름을 한 장으로 봅니다. 두 갈래는 질문만 다르고 꼴이 같은 셀입니다.
| 갈래 | 단계 | 반복과 조건 | 핵심 한 줄 |
|---|---|---|---|
| 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 함수로 업무 질문 하나를 던져 지금의 말투를 기록합니다.
# 학습 데이터(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단계. 두 번째 질문의 학습 전 답
성격이 다른 질문 하나를 더 기록해 둡니다.
# 공부 방법을 묻는 두 번째 질문(역시 학습 데이터에 없다)
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 모델이라 "업무실시" 같은 어색한 말도 섞입니다. - 두 질문은 학습 데이터에 없는 것으로 골랐습니다. 학습 데이터의 질문으로 확인하면 외운 답인지 배운 말투인지 가를 수 없습니다.