파인튜닝


**파인튜닝**이란 기존 모델을 가져와 여러분이 준비한 예시로 계속 학습시켜서, 모델의 기본 동작이 여러분이 원하는 방향으로 바뀌도록 만드는 것을 말합니다. 이 장에서는 파인튜닝이 실제로 무엇을 바꾸는지, 어디에 유용한지, 그리고 프롬프트나 검색 대신 언제 파인튜닝을 선택해야 하는지 실질적으로 짚어봅니다.
학습이 실제로 하는 일
파인튜닝이 무엇을 바꾸는지 이해하려면, 모델이 어디서부터 시작되는지 알아두면 도움이 됩니다. 모델은 크게 두 단계를 거쳐 만들어집니다.
첫 번째는 **사전학습(pretraining)**입니다. 모델은 엄청난 양의 텍스트를 읽으며 다음 토큰을 예측하는 작업을 끊임없이 반복하고, 그 과정에서 문법, 사실, 추론 패턴이 부수적으로 모델 안에 자리 잡습니다. 이렇게 만들어진 결과물이 베이스 모델로, 유창하지만 방향성이 없습니다. 여러분의 글을 이어서 써주기는 하지만, 질문에 답하는 유용한 어시스턴트가 되도록 훈련받은 것은 아닙니다.
두 번째 단계는 **포스트트레이닝(post-training)**입니다. 베이스 모델은 잘 정제된 좋은 응답 예시들과, 어떤 답변이 더 나은지에 대한 인간 피드백을 바탕으로 추가 학습을 거칩니다. 바로 이 단계가 단순한 텍스트 예측기를 지시를 따르는 어시스턴트로 바꿔주는 과정입니다. 여러분이 API로 호출하는 모델은 이미 이 두 단계를 모두 거친 상태입니다.
두 단계 모두 같은 방식으로 작동합니다. 모델에게 예시를 보여주고 내부 수치, 즉 파라미터 또는 가중치를 조금씩 조정해서 예측값이 그 예시에 더 가까워지도록 만드는 것입니다. 학습이란 예측 연습을 반복하면서 모델을 영구적으로 바꾸는 과정입니다.
파인튜닝이란 무엇인가
파인튜닝은 앞서 말한 두 번째 단계를 여러분이 직접, 작고 목표가 분명하게 실행하는 것입니다. 이미 학습이 끝난 모델을 가져와, 여러분만의 예시 집합으로 계속 학습시킵니다. 각 예시는 입력과, 모델이 그 입력에 대해 냈으면 하는 출력의 짝으로 이루어져 있습니다. 충분한 예시를 거치면 모델의 가중치가 바뀌어서, 매번 프롬프트로 요청하지 않아도 이런 종류의 응답이 모델의 기본값이 됩니다.
프롬프팅이나 RAG와의 진짜 차이는 변화가 어디에 저장되는지에 있습니다. 프롬프팅과 RAG는 모델을 그대로 둔 채, 호출하는 순간 함께 제공하는 컨텍스트로 방향을 조정합니다. 반면 파인튜닝은 모델 자체를 바꾸기 때문에, 새로운 동작이 모델에 새겨져서 짧은 프롬프트로도 그대로 나타납니다. 실행 시점에 더 좋은 지시를 주는 것이 아니라, 이미 원하는 방향으로 기울어진 모델을 아예 새로 내놓는 것입니다.
실제로는 예시 대화가 담긴 파일을 제공사에 넘기면, 그쪽에서 학습 작업을 실행한 뒤 새로운 **모델 id**를 돌려줍니다. 이 id는 다른 모델과 똑같이 호출하면 되는데, 다만 그 응답이 이제 여러분이 학습시킨 내용을 반영합니다. 파인튜닝은 동작을 모델 안으로 옮기는 것이고, 프롬프팅과 RAG는 고정된 모델을 조종하는 것입니다.
무엇에 강하고, 무엇에 약한가
파인튜닝이 제 역할을 하는 지점은 프롬프트로는 붙잡기 어려운 **일관된 동작**이 필요할 때입니다. 매번 정확한 출력 형식을 지키게 하거나, 특정 어조나 사내 스타일을 유지하거나, 분류 같은 좁은 작업을 수천 번의 호출에서도 안정적으로 처리하게 만드는 경우입니다. 또한 호출을 더 저렴하고 빠르게 만들 수도 있습니다. 길게 프롬프트로 설명해야 했을 동작이 모델 안에 이미 새겨져 있어서, 프롬프트가 짧아지기 때문입니다.
파인튜닝이 약한 지점은 지식입니다. 파인튜닝은 모델에게 새로운 사실을 가르치는 데 서투르며, 시간이 지나 바뀌는 사실에는 더더욱 약합니다. 학습 예시들은 정확히 조회 가능한 항목으로 저장되는 게 아니라 일반적인 패턴으로 뒤섞여버리기 때문에, 파인튜닝된 모델도 여전히 세부 사항을 지어내고, 정보가 바뀌는 순간 곧바로 낡아버립니다. 가격이나 정책이 바뀔 때마다 재학습을 하는 건 느리고 비용도 많이 듭니다. "모델이 X를 모른다"는 문제라면, 답은 거의 항상 파인튜닝이 아니라 RAG입니다.
기억할 원칙은 이것입니다. 파인튜닝은 형태를 바꾸기 위한 것이지, 사실을 추가하기 위한 것이 아닙니다. 모델에게는 어떻게 답할지를 가르치고, 무엇으로 답할지는 검색이 맡도록 하세요.
프롬프트, RAG, 아니면 파인튜닝?
대부분의 경우 여기서부터 시작하지 않습니다. 이 세 가지 기법은 **사다리**를 이루며, 바꾸기 가장 쉽고 빠른 것부터 순서대로 놓입니다.
- 프롬프팅. 항상 이것부터 시도하세요. 즉시 반복해볼 수 있고 추가 비용이 들지 않으며, 명확한 프롬프트에 예시 몇 개만 더해도 사람들이 생각하는 것보다 훨씬 많은 문제가 풀립니다. 프롬프트를 제대로 작동시키지 못했다면, 아직 파인튜닝을 할 준비가 되지 않은 것입니다.
- RAG. 문제가 지식일 때, 즉 모델이 가지고 있지 않거나 시간에 따라 바뀌는 사실이 필요할 때 이것을 선택하세요. RAG는 모델을 손대지 않고 질문 시점에 그 사실을 제공합니다.
- 파인튜닝. 문제가 지식이 아니라 동작이고 프롬프팅으로는 충분히 일관되게 만들 수 없을 때, 또는 프롬프트가 너무 길어져서 규모가 커졌을 때 지시를 모델 안에 새겨 넣는 것이 더 저렴하고 빠를 때 이것을 선택하세요.
이 세 가지는 서로 배타적이지 않으며, 가장 강력한 시스템은 이들을 결합합니다. 형식과 어조에 맞춰 모델을 파인튜닝한 뒤, 실행 시점에 최신 사실을 공급하기 위해 RAG를 사용하는 방식입니다. 동작은 학습에서, 지식은 검색에서 얻는 것입니다.
그러니 파인튜닝을 하기 전에 간단한 테스트를 해보세요. 더 나은 프롬프트로 도달할 수 있나요? 그렇다면 그렇게 하세요. 문제가 지식 부족인가요? 그렇다면 RAG입니다.
사다리를 올라가세요. 파인튜닝은 마지막 단이지, 첫 번째 단이 아닙니다. 프롬프트가 이미 제대로 되어 있고, 사실도 이미 마련되어 있는데도 모델이 여전히 충분히 일관되게 동작하지 않을 때에야, 파인튜닝이 딱 맞는 도구가 됩니다.
실제로 해보기
파인튜닝 데이터는 특별한 것이 아닙니다. 각 예시는 실행 시점에 보내는 것과 정확히 같은 형태의 짧은 대화이며, 모델이 냈으면 하는 답으로 끝맺습니다.
# 여기서는 몇 개만 보여드리지만, 실제 데이터셋은 실행 시점에 예상되는
# 입력 범위를 폭넓게 다루는 수백~수천 개의 예시로 이루어집니다.
training_examples = [
{"messages": [
{"role": "system", "content": "티켓의 긴급도를 low, medium, high 중 하나로 분류하세요."},
{"role": "user", "content": "이번 주에 두 번 결제됐는데 오늘 안에 해결해주세요."},
{"role": "assistant", "content": "high"},
]},
{"messages": [
{"role": "system", "content": "티켓의 긴급도를 low, medium, high 중 하나로 분류하세요."},
{"role": "user", "content": "다크 모드 설정이 어디 있나요?"},
{"role": "assistant", "content": "low"},
]},
# ...
]이것을 파일로 저장해서 제공사에 학습 작업을 요청하고, 끝날 때까지 기다립니다. 돌아오는 것은 새로운 모델 id이며, 이제 다른 모델과 똑같이 호출하면 됩니다.
# 파인튜닝된 모델도 또 다른 id일 뿐, 나머지는 그대로입니다.
response = client.chat.completions.create(
model="your-org/urgency-classifier-v1",
messages=[
{"role": "system", "content": "티켓의 긴급도를 low, medium, high 중 하나로 분류하세요."},
{"role": "user", "content": "내보내기 버튼을 눌러도 아무 반응이 없어요."},
],
)
# response.choices[0].message.content -> "low" (레이블만 반환, 학습으로 새겨넣은 동작)얻는 것은 동작이 이제 모델 안에 자리 잡았다는 점입니다. 지시는 더 짧아지고, 형식은 수천 번의 호출에서도 유지되며, 그러기 위해 프롬프트를 늘릴 필요도 없습니다. 반대로 감당해야 할 것은 그 주변의 모든 것입니다. 좋은 품질의 **데이터셋**이 필요하고, 학습 작업을 돌려야 하며, 학습된 내용을 바꾸고 싶을 때마다 새로운 작업이 필요합니다. 바로 이것이 파인튜닝이 사다리의 맨 아래에 놓이는 이유입니다. 예시를 업로드하고, 모델 id를 받고, 다른 모델처럼 호출하세요.
이것으로 모델이 무엇을 알고 어떻게 답하는지를 형성하는 방법들을 모두 살펴봤습니다. 이 모든 방법은 여러분이 마련해둔 무대 위에서 모델이 텍스트를 예측하도록 만드는 것이었습니다. 다음 장들에서는 모델에게 실제로 행동하는 능력을 부여합니다. 도구 사용에서는 모델이 여러분의 함수를 호출하는 법을 다루고, 이어서 이를 루프 안에서 실행하는 에이전트로 나아갑니다.

