4장. LLM 을 완성하는 3단계와 Hugging Face
정렬
상담 품질 평가를 떠올려 보세요. 같은 문의에 대한 두 응대를 들려주고 "어느 쪽이 더 나은가"만 고르게 합니다. 모범 답을 처음부터 쓰는 것보다 쉽고, 미묘한 차이까지 잡아낼 수 있습니다. 정렬은 이런 선택을 모아 모델을 사람이 바라는 쪽으로 다듬는 단계입니다.
왼쪽 청록 카드가 사람이 고른 답, 오른쪽 마젠타 카드가 고르지 않은 답입니다. 정렬은 같은 질문에 대해 고른 답이 나올 확률은 높이고, 고르지 않은 답이 나올 확률은 낮추도록 학습합니다. 여기서 상담 품질 평가의 선택이 선호 데이터입니다.
정렬이 바라는 세 가지
| 성질 | 뜻 | 고르지 않을 답의 예 |
|---|---|---|
| 도움 됨 | 질문에 맞게, 쓸모 있게 답한다 | 질문을 되풀이하거나 딴소리를 한다 |
| 정직함 | 모르면 모른다고 하고 지어내지 않는다 | 3장 프로젝트의 "고객센터 24시간" |
| 해롭지 않음 | 위험하거나 차별적인 내용을 내놓지 않는다 | 개인정보를 알려 준다 |
정렬의 방법
| 방법 | 하는 일 | 특징 |
|---|---|---|
| RLHF | 사람의 선택으로 "보상 모델"을 먼저 학습하고, 그 점수가 높아지도록 강화학습 | 효과가 크지만 단계가 많고 까다롭다 |
| DPO | 고른 답과 고르지 않은 답의 쌍으로 바로 학습 | 단순하고 작은 GPU 로도 된다. 5장 |
# 선호 데이터 한 줄의 생김새(5차시 DPO 에서 쓰는 꼴)
pair = {
"prompt": "환불은 며칠 걸려요?",
"chosen": "반품 상품이 도착한 뒤 3영업일 안에 돌려드립니다.",
"rejected": "환불은 상황에 따라 달라서 잘 모르겠어요.",
}
for key, value in pair.items():
print(f"{key:>8}: {value}")한 줄이 질문(prompt), 고른 답(chosen), 고르지 않은 답(rejected)으로 이루어집니다. 5장에서 이런 쌍으로 모델의 답 성향을 직접 바꿔 봅니다.
코드에 나오는 함수
| 코드 | 쉬운 뜻 |
|---|---|
pair = {"prompt": ..., "chosen": ..., "rejected": ...} | 이름표(키)와 값을 짝지어 담는 사전이다. 선호 데이터 한 줄을 이렇게 담는다 |
pair.items() | 사전의 (키, 값) 짝을 차례로 꺼낸다 |
f"{key:>8}" | 키를 여덟 칸 너비에 오른쪽으로 붙여 찍는다. 콜론 위치를 가지런히 맞추려는 것이다 |
이 코드가 뜻하는 것
상담 품질 평가표 한 장을 떠올려 보세요. 맨 위에 고객의 문의가 있고, 아래에 두 응대가 있으며, 평가자가 한쪽에 동그라미를 칩니다. 이 사전 하나가 그 평가표 한 장입니다.
| 키 | 담긴 것 | 평가표로 치면 |
|---|---|---|
prompt | 질문 "환불은 며칠 걸려요?" | 고객의 문의 |
chosen | 날짜를 분명히 알려 주는 답 | 동그라미 친 응대 |
rejected | "잘 모르겠어요"로 끝나는 답 | 동그라미 치지 않은 응대 |
코드는 이 세 칸을 한 줄씩 찍어 보여 주기만 하고 학습은 하지 않습니다. 정렬 학습에서는 이런 평가표를 수천 장 모아, 같은 질문에서 chosen 쪽이 나올 확률은 높이고 rejected 쪽은 낮춥니다. 키 이름 prompt, chosen(고른), rejected(물리친)는 5장의 DPO 도구가 그대로 찾는 이름이라 바꾸지 않습니다.
주의할 점
- 정렬은 새 지식을 가르치는 단계가 아닙니다. 모델이 이미 할 수 있는 답 가운데 어느 쪽을 더 자주 내놓을지를 바꿉니다.
- 정렬을 너무 세게 하면 무엇이든 "답할 수 없습니다"라고 피하는 모델이 되기도 합니다. 3장 실습 6의 Qwen 이 "저는 인공지능으로서…"라고 한 것도 정렬의 흔적입니다.