지도 파인튜닝

지도 파인튜닝 (Supervised fine-tuning)

지도 파인튜닝(supervised fine-tuning, SFT)은 여러분의 특정 사용 사례에 맞는 예시로 OpenAI 모델을 훈련시켜 주는 방법이에요. 결과는 원하는 스타일과 콘텐츠를 더 안정적으로 생산하는 맞춤형 모델이에요.

출처: 문서

본문

OpenAI는 파인튜닝 플랫폼을 정리 중이에요. 플랫폼은 더 이상 새 사용자에게 접근을 허용하지 않지만, 기존 사용자는 앞으로 몇 달간 훈련 작업을 만들 수 있어요. 모든 파인튜닝 모델은 베이스 모델이 폐기될 때까지 추론에 사용할 수 있어요.

동작 방식 가장 적합한 경우 함께 쓰는 것
프롬프트에 대한 올바른 응답 예시를 제공해 모델의 동작을 안내해요. 보통 인간이 만든 "ground truth" 응답으로 모델이 어떻게 응답해야 하는지 보여줘요. - 분류 - 미묘한 번역 - 특정 형식의 콘텐츠 생성 - 지시 따르기 실패 교정 gpt-4.1-2025-04-14, gpt-4.1-mini-2025-04-14, gpt-4.1-nano-2025-04-14

개요

지도 파인튜닝은 네 가지 주요 부분으로 이뤄져요.

  1. "좋은" 것이 무엇인지 정하는 훈련 데이터셋을 만든다.
  2. 예시 프롬프트와 원하는 모델 출력을 담은 훈련 데이터셋을 업로드한다.
  3. 훈련 데이터로 베이스 모델의 파인튜닝 작업을 만든다.
  4. 파인튜닝된 모델로 결과를 평가한다.

좋은 evals부터! evals를 설정한 뒤에만 파인튜닝에 투자하세요. 파인튜닝된 모델이 베이스 모델보다 더 잘 수행하는지 판단할 신뢰할 만한 방법이 필요해요. Evals 설정하기 →

데이터셋 만들기

파인튜닝 모델에서 유용한 결과를 얻으려면 견고하고 대표성 있는 데이터셋을 만드세요. 다음 기법과 고려사항을 사용해요.

적절한 예시 수

  • 파인튜닝에 제공할 수 있는 최소 예시 수는 10개예요.
  • 50~100개 예시에서 파인튜닝의 개선 효과를 봐요. 하지만 정확한 적정 수는 사용 사례에 따라 크게 달라져요.
  • 잘 다듬은 50개 데모로 시작해 결과를 평가하는 걸 권장해요.

50개 좋은 예시로 성능이 개선된다면 예시를 추가해 더 나은 결과를 보세요. 50개 예시가 효과가 없다면 훈련 데이터를 추가하기 전에 과업이나 프롬프트를 다시 생각해 보세요.

좋은 예시란

  • 앱에서 기대하는 프롬프트·출력을 최대한 현실적으로.
  • 구체적이고 명확한 질문과 답변.
  • 과거 데이터, 전문가 데이터, 기록된 데이터, 다른 유형의 수집 데이터를 사용.

데이터 서식

  • JSONL 형식을 사용하고, 훈련 데이터 파일의 각 줄에 완전한 JSON 구조 하나를 넣어요.
  • chat completions 형식을 사용해요.
  • 파일은 최소 10줄이어야 해요.

모델이 get_weather 함수를 호출하는 JSONL 훈련 데이터 예시. 각 줄은 사용자 프롬프트와 모델의 올바른 응답(assistant 메시지)을 포함한 JSON 구조예요.

{
  "messages": [
    { "role": "user", "content": "What is the weather in San Francisco?" },
    {
      "role": "assistant",
      "tool_calls": [
        {
          "id": "call_id",
          "type": "function",
          "function": {
            "name": "get_current_weather",
            "arguments": "{\"location\": \"San Francisco, USA\", \"format\": \"celsius\"}"
          }
        }
      ]
    }
  ],
  "parallel_tool_calls": false,
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_current_weather",
        "description": "Get the current weather",
        "parameters": {
          "type": "object",
          "properties": {
            "location": {
              "type": "string",
              "description": "The city and country, eg. San Francisco, USA"
            },
            "format": { "type": "string", "enum": ["celsius", "fahrenheit"] }
          },
          "required": ["location", "format"]
        }
      }
    }
  ]
}

큰 모델에서 증류하기

작은 모델용 훈련 데이터셋을 만드는 한 가지 방법은 큰 모델 결과를 증류(distill)해서 지도 파인튜닝 훈련 데이터를 만드는 거예요. 흐름은 이렇습니다.

  • 큰 모델(예: gpt-4.1)의 프롬프트를 eval 기준에 맞는 훌륭한 성능이 나올 때까지 튜닝한다.
  • 편한 방법으로 모델이 생성한 결과를 캡처한다. Responses API는 모델 응답을 기본 30일 저장한다.
  • 큰 모델에서 캡처한 응답 중 기준에 맞는 것으로 위 기법을 써서 데이터셋을 만든다.
  • 큰 모델로 만든 데이터셋으로 작은 모델(예: gpt-4.1-mini)을 튜닝한다.

이 기법으로 작은 모델을 특정 과업에서 더 크고 비싼 모델과 비슷하게 수행하도록 훈련할 수 있어요.

훈련 데이터 업로드하기

예시 데이터셋을 OpenAI에 업로드해요. OpenAI는 이를 모델 가중치를 갱신하고 데이터에 포함된 것 같은 출력을 만들기 위해 사용해요. 텍스트 완성 외에도 구조화된 JSON 출력이나 함수 호출을 더 효과적으로 생성하도록 모델을 훈련할 수 있어요.

대시보드 > fine-tuning > + Create > Training data에서 JSONL 파일을 업로드하거나, API로 업로드할 수 있어요. mydata.jsonl에 저장된 데이터는 purpose를 fine-tune으로 설정해 업로드해요.

curl https://api.openai.com/v1/files \
  -H "Authorization: Bearer ***" \
  -F purpose="fine-tune" \
  -F file="@mydata.jsonl"

API가 반환하는 데이터에서 파일의 id를 기록해 두세요. 이후 API 요청에 그 파일 식별자가 필요해요.

{
  "object": "file",
  "id": "file-RCnFCYRhFDcq1aHxiYkBHw",
  "purpose": "fine-tune",
  "filename": "mydata.jsonl",
  "bytes": 1058,
  "created_at": 1746484901,
  "expires_at": null,
  "status": "processed",
  "status_details": null
}

파인튜닝 작업 만들기

테스트 데이터가 업로드됐으면 파인튜닝 작업을 만들어 제공한 훈련 데이터로 베이스 모델을 커스터마이즈해요. 작업을 만들 때는 반드시 지정해야 해요.

  • 파인튜닝에 쓸 베이스 모델(model). OpenAI 모델 ID이거나 이전에 파인튜닝한 모델 ID. 어떤 모델이 파인튜닝을 지원하는지 모델 문서에서 확인.
  • 훈련 파일(training_file) ID. 이전 단계에서 업로드한 파일.
  • 파인튜닝 방법(method). 모델을 커스터마이즈하는 데 쓸 방법을 지정. 지도 파인튜닝이 기본.
curl https://api.openai.com/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ***" \
  -d '{
    "training_file": "file-RCnFCYRhFDcq1aHxiYkBHw",
    "model": "gpt-4.1-nano-2025-04-14"
  }'

API는 진행 중인 파인튜닝 작업 정보로 응답해요. 훈련 데이터 크기에 따라 훈련에 몇 분에서 몇 시간 걸릴 수 있어요. API를 폴링해 특정 작업의 갱신 상태를 확인할 수 있어요. 작업이 끝나면 fine_tuned_model 속성에 새 모델 ID(ft:... 형태)가 있어요. 이것을 Responses나 Chat Completions에서 파인튜닝 모델로 API 요청을 만들 때 사용해요.

curl https://api.openai.com/v1/responses \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ***" \
  -d '{
    "model": "ft:gpt-4.1-nano-2025-04-14:openai::BTz2REMH",
    "input": "What is the weather like in Boston today?",
    "tools": [
      {
        "name": "get_current_weather",
        "description": "Get the current weather",
        "parameters": {
          "type": "object",
          "properties": {
            "location": {
                "type": "string",
                "description": "The city and country, eg. San Francisco, USA"
            },
            "format": { "type": "string", "enum": ["celsius", "fahrenheit"] }
          },
          "required": ["location", "format"]
        }
      }
    ],
    "tool_choice": "auto"
  }'

결과 평가하기

아래 방법으로 파인튜닝 모델의 성능을 확인해요. 원하는 결과가 나올 때까지 프롬프트·데이터·파인튜닝 작업을 조정해요. 파인튜닝의 가장 좋은 방법은 계속 반복하는 거예요.

evals와 비교하기

파인튜닝 모델이 원래 베이스 모델보다 잘 수행하는지 보려면 evals를 사용해요. 파인튜닝 작업을 실행하기 전에 1단계에서 만든 훈련 데이터셋에서 데이터 일부를 따로 떼어 내세요. 이 보류(holdout) 데이터는 evals에 쓸 때 대조군 역할을 해요. 훈련 데이터와 보류 데이터가 비슷한 다양성의 사용자 입력 유형·모델 응답을 갖도록 하세요. Evals 실행에 대해 배우기.

상태 모니터링하기

대시보드나 API에서 작업 ID를 폴링해 파인튜닝 작업 상태를 확인해요. 대시보드의 fine-tuning에서 작업을 선택해 상태·체크포인트·메시지·지표를 검토하거나, 이 curl 명령으로 정보를 가져와요.

curl https://api.openai.com/v1/fine_tuning/jobs/ftjob-uL1VKpwx7maorHNbOiDwFIn6 \
  -H "Authorization: Bearer ***"

작업 객체에는 새 파인튜닝 모델의 고유 ID인 fine_tuned_model 속성이 있어요.

파인튜닝 모델 사용해 보기

파인튜닝이 끝나면 그 모델 ID를 Responses나 Chat Completions에서 OpenAI 베이스 모델처럼 사용해요. 대시보드의 파인튜닝 작업에서 Output model로 이동해 ft:…로 시작하는 모델 ID를 복사하고, Playground의 모델 드롭다운에 붙여넣어 프롬프트를 실행해 보세요.

필요하면 체크포인트 사용하기

체크포인트는 사용할 수 있는 모델이에요. 훈련 epoch마다 전체 모델 체크포인트를 만들어 줘요. 파인튜닝 모델이 초기에 개선되다가 일반화 가능한 지식을 배우는 대신 데이터셋을 외워버리는 경우(과적합)에 유용해요. 체크포인트는 과정의 여러 시점에서 만든 맞춤형 모델 버전을 제공해요.

대시보드에서 체크포인트를 찾거나, 체크포인트 엔드포인트로 파인튜닝 작업 ID로 목록을 조회해요. fine_tuned_model_checkpoint 필드로 모델 이름을 찾고 최종 파인튜닝 모델처럼 사용해요. 현재는 작업의 마지막 세 epoch의 체크포인트만 저장·사용할 수 있어요.

체크포인트 객체에는 step_number(체크포인트가 만들어진 단계, 각 epoch는 훈련 세트의 단계 수를 batch size로 나눈 값)와 metrics가 있어요.

{
  "object": "fine_tuning.job.checkpoint",
  "id": "ftckpt_zc4Q7MP6XxulcVzj4MZdwsAB",
  "created_at": 1519129973,
  "fine_tuned_model_checkpoint": "ft:gpt-3.5-turbo-0125:my-org:custom-suffix:96olL566:ckpt-step-2000",
  "metrics": {
    "full_valid_loss": 0.134,
    "full_valid_mean_token_accuracy": 0.874
  },
  "fine_tuning_job_id": "ftjob-abc123",
  "step_number": 2000
}

안전 검사

프로덕션 출시 전에 다음 안전 정보를 검토하고 따르세요.

안전을 어떻게 평가하나요

파인튜닝 작업이 완료되면 결과 모델의 동작을 13개 안전 범주로 평가해요. 각 범주는 AI 출력이 제대로 제어되지 않으면 해를 끼칠 수 있는 중요한 영역이에요. advice, harassment/threatening, hate, hate/threatening, highly-sensitive, illicit, propaganda, self-harm/instructions, self-harm/intent, sensitive, sexual/minors, sexual, violence 범주가 있어요. 각 범주에는 미리 정의된 통과 임계값이 있고, 주어진 범주에서 평가된 예시가 너무 많이 실패하면 OpenAI가 파인튜닝 모델 배포를 차단해요. 통과하지 못하면 작업 메시지에서 어떤 범주가 임계값을 충족하지 못했는지 알려주고, moderation checks 섹션에서 결과를 볼 수 있어요.

안전 검사 통과하는 법

실패한 안전 검사를 검토하는 것 외에도, 파인튜닝 API 이벤트 엔드포인트로 어떤 범주가 실패했는지 세부 정보를 가져올 수 있어요. moderation_checks 유형 이벤트에서 범주 결과와 집행을 확인하세요. 이 정보로 재훈련·개선할 범주를 좁힐 수 있고, 모델 스펙에 추가 훈련 데이터가 필요한 영역을 찾는 데 도움이 되는 규칙·예시가 있어요. 이 평가는 광범위한 안전 범주를 다루지만, 파인튜닝 모델이 여러분의 용도에 적절한지 직접 평가도 수행하세요.

더 알아보기 (Learn more)