9장. 모델 평가와 활용, QLoRA
종합평가 안내
운전 연수의 마지막은 혼자 도로 주행을 하는 실기 시험입니다. 지금까지 강사가 옆에서 같이 했던 일을 이제 스스로 해 봅니다. 종합평가는 별도 노트북에서, 이번에는 말투가 아니라 실제 업무 형식을 가르칩니다. 고객 문의를 받으면 "분류 / 긴급도 / 답변" 세 줄 꼴로 답하도록 Qwen2.5-0.5B-Instruct 를 LoRA 로 학습합니다.
강사자료의 그림입니다. 고객 문의 데이터 100건(5개 분류)을 대화 형식으로 바꿔 학습 90건, 평가 10건(분류마다 2건)으로 나눕니다. 학습 전에는 "문의만 준 경우"와 "형식 지시 프롬프트를 준 경우"를 견주고(캡처 1), SFTTrainer 로 LoRA 를 학습한 뒤(캡처 2), 세 방식을 비교표로 평가하고(캡처 3), 끝으로 r 을 줄여 다시 학습해 견줍니다(캡처 4). 그림 아래의 출력 형식에서 분류는 배송, 교환, 환불, 결제, 계정 중 하나이고, 긴급도는 높음, 보통, 낮음 중 하나입니다.
종합평가 한눈에 보기
| 항목 | 내용 | 이 과정의 어디에서 배웠나 |
|---|---|---|
| 주제 | 고객 문의 응답 형식 LoRA 파인튜닝 | 8장 |
| SFT 데이터 변환 | inquiry → 질문, category·urgency·answer → 세 줄 답변 | 7장 |
| Chat Template | 학습과 추론에 같은 대본 양식 | 7장 |
| LoraConfig·SFTConfig | r, lora_alpha, 학습률, epoch | 8장 |
| 학습 전후 평가 | 형식 준수율, 분류 정확도 같은 규칙 기반 채점 | 9장 |
| 제출 | 실행 결과 네 가지를 캡처해 과정에서 안내하는 제출 양식에 붙여 낸다 | 이 절 |
짧은 예시
import re
import pandas as pd
# 종합평가 데이터: 문의 100건, 열은 inquiry, category, urgency, answer
df = pd.read_csv("data/support_inquiries.csv")
print(df["category"].value_counts().to_dict())
# 결과: {'배송': 20, '교환': 20, '환불': 20, '결제': 20, '계정': 20}
print(df["urgency"].value_counts().to_dict())
# 결과: {'낮음': 47, '보통': 32, '높음': 21}
# 세 줄 형식을 검사하는 규칙: 분류와 긴급도는 정해진 값 중 하나여야 한다
cats = "|".join(df["category"].unique())
urgs = "|".join(df["urgency"].unique())
# re.compile = 정규식(글자 꼴 검사 규칙) 만들기. ^ 와 $ 는 처음과 끝, \n 은 줄바꿈
pattern = re.compile(rf"^분류: ({cats})\n긴급도: ({urgs})\n답변: .+$")
good = "분류: 배송\n긴급도: 높음\n답변: 택배사에 배송 위치를 바로 조회하겠습니다."
bad = "배송 문의시군요. 바로 확인해 드리겠습니다."
print(bool(pattern.match(good)), bool(pattern.match(bad)))
# 결과: True False → 둘째 답은 내용이 좋아도 형식 점수는 0점이 코드가 뜻하는 것
실기 시험의 채점표를 먼저 만들어 본 것입니다. 데이터를 열어 분류마다 20건씩 고르게 있고, 긴급도는 낮음이 가장 많다는 것을 확인했습니다. 그다음 "세 줄 형식"을 정규식 하나로 검사합니다. 여기서 시험 문제지가 df, 채점표가 pattern, 두 답안이 good 과 bad 입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
df["category"].value_counts() | 분류별 건수 | 문제 유형 분포 |
"|".join(df["category"].unique()) | 허용 값을 "배송|교환|..." 로 잇는다 | 정답 보기 목록 |
rf"^분류: (...)\n긴급도: (...)\n답변: .+$" | 세 줄 꼴 규칙 | 답안 칸 모양 |
pattern.match(good) | 꼴에 맞는지 본다 | 형식 채점 |
긴급도 "높음"이 21건으로 가장 적습니다. 분류 정확도만 보면 높음 문의를 놓쳐도 점수가 크게 떨어지지 않으므로, 긴급도는 따로 채점하는 편이 좋습니다.
주의할 점
- 종합평가 노트북은 이 교안의 원본이 아닙니다. 노트북 안의 안내 순서대로 실행하고, 캡처는 노트북이 정한 네 장면을 남깁니다.
- 제출 양식 파일 이름에 본인 이름을 넣으라는 안내가 있으면 그대로 따르되, 교안이나 공유 폴더에 다른 사람의 개인정보를 올리지 않습니다.
- 학습 데이터 90건은 적습니다. 결과가 기대보다 약하면 epoch, 학습률,
r을 바꿔 다시 학습해 보는 것이 캡처 4의 목적입니다.