9장. 모델 평가와 활용, QLoRA
서비스에 활용하는 방법
프랜차이즈 카페를 떠올려 봅니다. 커피 머신(기반 모델)은 하나인데, 지점마다 레시피 카드(어댑터)만 바꿔 꽂아 각자의 메뉴를 냅니다. 늘 같은 메뉴만 파는 지점은 레시피를 머신에 아예 새겨 넣습니다(병합). 메뉴판의 가격처럼 자주 바뀌는 정보는 레시피가 아니라 계산대 옆 안내판(RAG)에 붙여 둡니다.
그림의 네 상자는 학습한 어댑터를 실제 서비스에 쓰는 방법입니다. 왼쪽 둘은 "어떻게 올려 둘까", 셋째는 "무엇을 어댑터에 맡기고 무엇을 검색에 맡길까", 넷째는 "어떻게 계속 좋아지게 할까"입니다.
서비스 활용 방법
| 방식 | 설명 | 카페로 치면 |
|---|---|---|
| 다중 어댑터 운영 | 기반 모델 하나에 업무별 LoRA(상담, 요약, 분류)를 두고 요청마다 바꿔 끼운다. vLLM, TGI 같은 서빙 엔진이 여러 LoRA 를 함께 띄운다 | 머신 하나, 레시피 카드 여러 장 |
| 병합 모델 배포 | merge_and_unload() 뒤 일반 모델처럼 배포한다. 필요하면 GGUF 로 바꿔 llama.cpp, Ollama 로 내 PC 에서 돌린다 | 레시피를 머신에 새기기 |
| Hub 공유 | push_to_hub() 로 어댑터만 올려 팀과 나눈다. 쓰기(Write) 권한 토큰이 필요하고, 기반 모델의 라이선스를 확인한다 | 레시피 카드를 본사에 공유 |
| RAG 와 조합 | 형식, 말투, 절차는 파인튜닝으로 익히고, 사실 정보는 RAG 로 준다 | 레시피는 카드, 가격은 안내판 |
| 지속 개선 | 실제 사용 기록에서 실패 사례를 모아 SFT 데이터에 더하고 다시 학습한다 | 손님 불만을 레시피에 반영 |
짧은 예시
# 기반 모델 하나 + 업무별 어댑터(폴더 이름은 설명용)를 요청마다 골라 쓰는 흐름 흉내
adapters = {
"상담": "outputs/cs-lora",
"요약": "outputs/summary-lora",
"분류": "outputs/classify-lora",
}
def route(task):
# 업무 이름으로 어댑터를 고르고, 없으면 어댑터 없이 기반 모델로 답한다
return adapters.get(task, "(어댑터 끔: 기반 모델)")
for task in ["요약", "날씨"]:
print(task, "→", route(task))
# 결과: 요약 → outputs/summary-lora / 날씨 → (어댑터 끔: 기반 모델)
# 저장 공간 견주기: 업무 3개를 어댑터로 둘 때와 병합 모델 3벌로 둘 때(MB)
n = len(adapters)
print(round(942 + n * 33.6, 1), n * 942)
# 결과: 1042.8 2826 → 어댑터 방식이 약 2.7배 작다이 코드가 뜻하는 것
카페 점원이 주문서의 메뉴 이름을 보고 레시피 카드를 고르는 일입니다. 맞는 카드가 없는 주문(날씨 질문)은 카드 없이 기본 머신으로 만듭니다. 이것이 실습 2에서 본 부작용을 피하는 "필요할 때만 켜기"입니다. 여기서 레시피 카드 꽂이가 adapters, 점원이 route 입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
adapters = {...} | 업무 이름 → 어댑터 폴더 | 레시피 카드 꽂이 |
adapters.get(task, "...") | 맞는 어댑터, 없으면 기본값 | 카드 고르기 |
942 + n * 33.6 | 기반 하나 + 어댑터 n개 | 머신 하나에 카드 세 장 |
n * 942 | 병합 모델 n벌 | 머신 세 대 |
업무가 늘수록 차이가 커집니다. 어댑터 10개는 942 + 336 = 1,278 MB 이지만, 병합 모델 10벌은 9,420 MB 입니다.
주의할 점
- 어댑터 교체 운영은 기반 모델이 같아야 합니다. Qwen2.5-0.5B-Instruct 로 학습한 어댑터를 다른 모델에 붙일 수 없습니다.
- 사실 정보(가격, 정책, 날짜)를 파인튜닝으로 외우게 하면, 정보가 바뀔 때마다 다시 학습해야 합니다. 이런 정보는 RAG 로 줍니다.
- Hub 에 올릴 때 쓰는 토큰은 코드에 직접 적지 않습니다. 교안에는
hf_...같은 자리표시자만 씁니다.