파인튜닝 모범 사례
파인튜닝 모범 사례
파인튜닝된 모델로 강한 결과를 얻지 못하고 있다면, 다음 프로세스 반복을 고려해 보세요.
OpenAI는 파인튜닝 플랫폼을 정리하고 있습니다. 이제 새 사용자는 플랫폼에 접근할 수 없지만, 기존 파인튜닝 플랫폼 사용자는 향후 몇 달 동안 학습 작업을 만들 수 있습니다.
모든 파인튜닝 모델은 기본 모델이 폐지될 때까지 추론에 계속 사용할 수 있습니다. 전체 일정은 여기에서 확인할 수 있습니다.
출처: 문서
본문
데이터 품질에 대한 반복
학습 데이터 세트의 품질을 개선하는 방법 몇 가지는 다음과 같습니다:
- 남은 문제를 대상으로 하는 예시를 수집하세요.
- 모델이 특정 측면에 아직 능숙하지 않다면, 그 측면을 올바르게 수행하는 방법을 모델에 직접 보여주는 학습 예시를 추가하세요.
- 기존 예시의 문제점을 꼼꼼히 검토하세요.
- 모델에 문법·논리·스타일 문제가 있다면 데이터에도 같은 문제가 없는지 확인하세요. 예를 들어 모델이 (그렇게 해서는 안 될 때) "I will schedule this meeting for you"라고 말한다면, 기존 예시가 모델에게 할 수 없는 새 일을 할 수 있다고 가르치고 있는지 확인하세요.
- 데이터의 균형과 다양성을 고려하세요.
- 데이터에서 assistant 응답의 60%가 "I cannot answer this"라면, 추론 시에는 응답의 5%만 그렇게 말해야 한다면 거절이 과도하게 많아질 가능성이 높습니다.
- 학습 예시에 응답에 필요한 모든 정보가 포함되어 있는지 확인하세요.
- 모델이 사용자의 개인적 특성에 기반해 칭찬하길 원하고, 학습 예시에 앞선 대화에 없는 특성에 대한 assistant 칭찬이 포함되어 있다면 모델이 정보를 환각(hallucinate)할 수 있습니다.
- 학습 예시의 일치도와 일관성을 살펴보세요.
- 여러 사람이 학습 데이터를 만들었다면 모델 성능은 사람들 간의 일치도와 일관성 수준에 의해 제한될 가능성이 높습니다. 예를 들어 텍스트 추출 작업에서 사람들이 추출된 스니펫의 70%에만 동의했다면, 모델도 그보다 더 잘할 수 없을 가능성이 높습니다.
- 모든 학습 예시가 추론 시 기대하는 것과 같은 형식인지 확인하세요.
데이터 수량에 대한 반복
예시의 품질과 분포에 만족하면 학습 예시 수를 늘리는 것을 고려할 수 있습니다. 이는 특히 "엣지 케이스"에서 모델이 작업을 더 잘 학습하는 데 도움이 되는 경향이 있습니다. 학습 예시 수를 두 배로 늘릴 때마다 비슷한 정도의 개선을 기대합니다. 학습 데이터 크기를 늘려 기대되는 품질 향상을 대략적으로 추정하려면:
- 현재 데이터셋으로 파인튜닝하기
- 현재 데이터셋의 절반으로 파인튜닝하기
- 두 결과 사이의 품질 차이 관찰하기
일반적으로 절충을 해야 한다면, 많은 양의 저품질 데이터보다 적은 양의 고품질 데이터가 더 효과적입니다.
하이퍼파라미터에 대한 반복
하이퍼파라미터는 학습 과정에서 모델의 가중치가 어떻게 업데이트되는지 제어합니다. 몇 가지 일반적인 옵션은:
- Epochs: epoch는 모델 학습 중 학습 데이터셋 전체를 한 번 완전히 통과하는 것입니다. 모델이 가중치를 반복적으로 정제할 수 있도록 일반적으로 여러 epoch를 실행합니다.
- Learning rate multiplier: 모델의 학습된 매개변수에 적용되는 변경 크기를 조정합니다. 더 큰 값은 학습을 빠르게 할 수 있고, 더 작은 값은 느리지만 더 안정적인 학습으로 이어질 수 있습니다.
- Batch size: 모델이 가중치를 업데이트하기 전에 한 번의 순전파(forward)와 역전파(backward)에서 처리하는 예시 수입니다. 더 큰 배치는 학습을 느리게 하지만 더 안정적인 결과를 낼 수 있습니다.
처음에는 이들 중 아무것도 지정하지 않고 학습해 데이터셋 크기에 따라 기본값을 선택하게 한 뒤, 다음을 관찰하면 조정하는 것을 권장합니다:
- 모델이 학습 데이터를 기대만큼 따르지 않으면 epoch 수를 1~2 늘리세요.
- 이는 이상적인 완성이 하나(또는 유사한 이상적 완성의 작은 집합)만 있는 작업에서 더 흔합니다. 분류, 엔티티 추출, 구조적 파싱 같은 예가 있습니다. 이는 종종 참조 답변에 대해 최종 정확도 지표를 계산할 수 있는 작업입니다.
- 모델이 예상보다 다양성이 떨어지면 epoch 수를 1~2 줄이세요.
- 이는 가능한 좋은 완성의 범위가 넓은 작업에서 더 흔합니다.
- 모델이 수렴하는 것처럼 보이지 않으면 learning rate multiplier를 늘리세요.
하이퍼파라미터는 아래와 같이 설정할 수 있습니다:
하이퍼파라미터 설정
const fineTune = await openai.fineTuning.jobs.create({
training_file: "file-abc123",
model: "gpt-4o-mini-2024-07-18",
method: {
type: "supervised",
supervised: {
hyperparameters: { n_epochs: 2 },
},
},
});
from openai import OpenAI
client = OpenAI()
client.fine_tuning.jobs.create(
training_file="file-abc123",
model="gpt-4o-mini-2024-07-18",
method={
"type": "supervised",
"supervised": {
"hyperparameters": {"n_epochs": 2},
},
},
)
package main
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
)
func main() {
client := openai.NewClient()
job, err := client.FineTuning.Jobs.New(context.Background(), openai.FineTuningJobNewParams{
TrainingFile: "file-abc123",
Model: "gpt-4o-mini-2024-07-18",
Method: openai.FineTuningJobNewParamsMethod{
Type: "supervised",
Supervised: openai.SupervisedMethodParam{Hyperparameters: openai.SupervisedHyperparameters{
NEpochs: openai.SupervisedHyperparametersNEpochsUnion{OfInt: openai.Int(2)},
}},
},
})
if err != nil {
panic(err)
}
fmt.Println(job.ID)
}
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.finetuning.jobs.JobCreateParams;
import com.openai.models.finetuning.methods.SupervisedHyperparameters;
import com.openai.models.finetuning.methods.SupervisedMethod;
String fileId = "file-abc123";
var job =
client
.fineTuning()
.jobs()
.create(
JobCreateParams.builder()
.model("gpt-4.1-mini-2025-04-14")
.trainingFile(fileId)
.method(
JobCreateParams.Method.builder()
.type(JobCreateParams.Method.Type.SUPERVISED)
.supervised(
SupervisedMethod.builder()
.hyperparameters(
SupervisedHyperparameters.builder().nEpochs(2).build())
.build())
.build())
.build());
System.out.println(job.id());
require "openai"
client = OpenAI::Client.new
job = client.fine_tuning.jobs.create(
model: "gpt-4.1-mini-2025-04-14",
training_file: "file-abc123",
method_: {
type: :supervised,
supervised: { hyperparameters: { n_epochs: 2 } }
}
)
puts(job.id)
데이터셋 조정하기
강한 파인튜닝 결과가 보이지 않을 때 선택할 수 있는 또 다른 옵션은 돌아가서 학습 데이터를 수정하는 것입니다. 데이터셋에 사용할 예시를 수집할 때 따를 만한 모범 사례 몇 가지는 다음과 같습니다.
학습 데이터셋과 테스트 데이터셋
예시를 수집한 뒤 데이터셋을 학습(train)과 테스트(test) 부분으로 나누세요. 학습 세트는 파인튜닝 작업용이고, 테스트 세트는 evals용입니다.
학습 파일과 테스트 파일을 모두 포함해 파인튜닝 작업을 제출하면 학습 과정에서 둘 다에 대한 통계를 제공합니다. 이 통계는 모델이 얼마나 개선되고 있는지에 대한 신호를 줍니다. 초기에 테스트 세트를 구성하면 학습 후 테스트 세트 벤치마크와 비교해 모델을 평가하는 데 도움이 됩니다.
학습 데이터용 프롬프트 제작
파인튜닝 전에 모델에 가장 잘 작동했던 지침과 프롬프트 세트를 가져와 모든 학습 예시에 포함하세요. 특히 학습 예시가 상대적으로 적으면(100개 미만) 가장 좋고 가장 일반적인 결과에 도달할 수 있습니다.
비용을 아끼기 위해 모든 예시에 반복되는 지침이나 프롬프트를 줄이고 싶을 수 있습니다. 지침을 반복하지 않으면 모델이 전적으로 시연을 통해 학습해야 하므로 좋은 결과에 도달하는 데 더 많은 학습 예시가 필요할 수 있습니다.
학습 데이터의 다중 턴 채팅
다중 턴 대화에 대해 모델을 학습시키려면 학습 데이터의 각 줄에 대해 messages 배열에 여러 user와 assistant 메시지를 포함하세요.
선택적 weight 키(값을 0 또는 1로 설정)를 사용해 특정 assistant 메시지에 대한 파인튜닝을 비활성화하세요. 채팅 형식에서 weight를 제어하는 몇 가지 예시는 다음과 같습니다:
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}
토큰 제한
토큰 제한은 모델에 따라 다릅니다. 허용되는 최대 컨텍스트 길이의 개요는 다음과 같습니다:
| Model | Inference context length | Examples context length |
|---|---|---|
gpt-4.1-2025-04-14 |
128,000 tokens | 65,536 tokens |
gpt-4.1-mini-2025-04-14 |
128,000 tokens | 65,536 tokens |
gpt-4.1-nano-2025-04-14 |
128,000 tokens | 65,536 tokens |
gpt-4o-2024-08-06 |
128,000 tokens | 65,536 tokens |
gpt-4o-mini-2024-07-18 |
128,000 tokens | 65,536 tokens |
기본값보다 긴 예시는 최대 컨텍스트 길이로 잘리며, 이는 학습 예시 끝에서 토큰을 제거합니다. 전체 학습 예시가 컨텍스트에 들어가도록 메시지 내용의 총 토큰 수를 제한 아래로 유지하세요.
토크나이저 도구를 사용하거나 이 cookbook 예시처럼 코드를 사용해 토큰 수를 계산하세요.
데이터를 업로드하기 전에 형식과 잠재적 토큰 비용을 확인하는 것이 좋습니다. 이를 수행하는 예시는 cookbook에서 찾을 수 있습니다.
- 파인튜닝 데이터 형식 검증 — 파인튜닝 데이터 포맷에 대해 알아보세요.