강화 파인튜닝
강화 파인튜닝 (Reinforcement fine-tuning)
강화 파인튜닝(reinforcement fine-tuning, RFT)은 여러분이 정의한 피드백 신호로 OpenAI reasoning 모델을 적응시키는 방법이에요. 지도 파인튜닝처럼 모델을 여러분의 과업에 맞춰요. 차이는 고정된 "정답"으로 학습하는 대신, 후보 응답마다 점수를 매기는 프로그래머블 grader에 의존한다는 점이에요. 그러면 훈련 알고리즘이 모델 가중치를 옮겨서, 높은 점수의 출력이 더 나오고 낮은 점수의 출력은 줄어들게 해요.
출처: 문서
본문
OpenAI는 파인튜닝 플랫폼을 정리 중이에요. 플랫폼은 더 이상 새 사용자에게 접근을 허용하지 않지만, 기존 사용자는 앞으로 몇 달간 훈련 작업을 만들 수 있어요. 모든 파인튜닝 모델은 베이스 모델이 폐기될 때까지 추론에 사용할 수 있어요. 전체 일정은 여기에 있어요.
| 동작 방식 | 가장 적합한 경우 | 함께 쓰는 것 |
|---|---|---|
| 프롬프트에 대한 응답을 생성하고, 결과에 전문가 점수를 주고, 높은 점수의 응답을 위해 모델의 chain-of-thought를 강화해요. 전문가 grader가 모델의 이상적 출력에 동의해야 해요. | - 고급 reasoning이 필요한 복잡한 도메인 과업 - 병력과 진단 지침을 기반으로 한 의료 진단 - 법적 판례에서 관련 구절 판별 | o4-mini-2025-04-16. Reasoning 모델만. |
이 최적화로 스타일·안전·도메인 정확성 같은 미묘한 목표에 모델을 정렬할 수 있고, 실용 사례도 많아요. RFT는 다섯 단계로 실행해요.
- 각 모델 응답에 숫자 보상을 부여하는 grader를 구현해요.
- 프롬프트 데이터셋을 업로드하고 validation split을 지정해요.
- 파인튜닝 작업을 시작해요.
- 체크포인트를 모니터링하고 평가하며, 필요하면 데이터나 grader를 수정해요.
- 결과 모델을 표준 API로 배포해요.
훈련 중 플랫폼은 데이터셋을 순회하며 프롬프트마다 여러 응답을 샘플링하고 grader로 점수를 매긴 뒤, 그 보상에 따라 policy-gradient 업데이트를 적용해요. 훈련 데이터가 끝나거나 선택한 체크포인트에서 작업을 중지할 때까지 이 루프가 계속돼서, 여러분에게 중요한 지표에 최적화된 모델을 만들어요.
언제 강화 파인튜닝을 써야 하나요
강화 파인튜닝의 장단점을 이해하면 기회를 찾고 낭비를 피할 수 있어요.
- RFT는 모호하지 않은 과업에 가장 잘 맞아요. 자격 있는 인간 전문가가 답에 동의하는지 확인하세요. 독립적으로 일하는 성실한 전문가들(모델과 같은 지시·정보에만 접근)이 같은 답으로 수렴하지 않는다면 과업이 너무 모호할 수 있어요. 수정하거나 재구성하는 게 좋아요.
- 과업이 grading 옵션과 호환되어야 해요. 먼저 API의 grading 옵션을 검토하고 그걸로 과업을 채점할 수 있는지 확인하세요.
- eval 결과가 개선할 만큼 변동성이 있어야 해요. RFT를 쓰기 전에 evals를 실행하세요. eval 점수가 최소·최대 가능 점수 사이에 있으면 긍정 답을 강화할 데이터가 충분해요. 파인튜닝할 모델이 절대 최소나 절대 최대 점수에 있다면 RFT는 유용하지 않아요.
- 모델이 원하는 과업에서 어느 정도 성공해야 해요. 강화 파인튜닝은 점진적인 변화를 만들며 많은 답을 샘플링하고 가장 좋은 것을 골라요. 모델이 어떤 과업에서 성공률 0%라면, RFT로 더 높은 성능으로 부트스트랩할 수 없어요.
- 과업은 맞히기를 어렵게 만들어야 해요(guess-proof). 모델이 운 좋은 추측으로 더 높은 보상을 받을 수 있으면, 옳은 답을 틀린 reasoning 과정으로 얻을 수 있으므로 훈련 신호가 너무 시끄러워요. 클래스를 하위 클래스로 확장하거나 객관식 문제를 개방형 답안으로 바꾸는 등 맞히기를 어렵게 재구성하세요.
일반적인 사용 사례, 구체적 구현, grader 예시는 강화 파인튜닝 사용 사례 가이드에서 볼 수 있어요.
강화 학습이란 무엇인가요
강화 학습은 기계 학습의 한 분야로, 모델이 행동하고 피드백을 받고 미래 피드백을 최대화하도록 재조정하면서 배워요. 예시마다 "올바른" 답 하나를 외우는 대신, 모델은 가능한 답을 많이 탐색하고 각 답에 대한 숫자 보상을 관찰하며, 높은 보상 답이 더 나오고 낮은 보상 답이 사라지도록 행동을 점진적으로 바꿔요. 반복이 쌓이면 모델은 여러분이 정의한 보상 신호를 가장 잘 충족하는 출력 선택 규칙인 policy로 수렴해요.
RFT에서 그 보상 신호는 과업에 맞게 정의한 커스텀 grader에서 나와요. 데이터셋의 모든 프롬프트에 대해 플랫폼이 여러 후보 답을 샘플링하고, grader로 점수를 매기며, 더 높은 점수의 답으로 모델을 밀어주는 policy-gradient 업데이트를 적용해요. 이 샘플→채점→업데이트 주기가 데이터셋(그리고 연속 epoch) 전반에 걸쳐, 모델이 grader의 품질 이해를 안정적으로 최적화할 때까지 계속돼요. grader는 정확성·스타일·안전·그 밖의 어떤 지표든 여러분이 신경 쓰는 것을 인코딩하므로, 결과 파인튜닝 모델이 그 우선순위를 반영하고 강화 학습 인프라를 직접 관리할 필요가 없어요.
강화 파인튜닝은 o 시리즈 reasoning 모델에서만 지원되고, 현재는 o4-mini만 지원해요.
예시: LLM 기반 보안 리뷰
이 아래 예시에서는 가상 회사의 보안 현황에 대해 내부 회사 정책 문서를 바탕으로 전문가 답변을 제공하도록 o4-mini 모델을 파인튜닝해요. 모델이 Structured Outputs로 특정 스키마를 따르는 JSON 객체를 반환하게 하고 싶어요.
입력 질문 예시: Do you have a dedicated security team?
내부 정책 문서를 바탕으로 두 키를 가진 JSON으로 응답하게 해요.
compliant: 회사 정책이 질문을 다루는지 나타내는 문자열yes,no,needs review.explanation: 정책 문서에 따라 질문이 정책에 포함되는지, 왜 포함되지 않는지 간단히 설명하는 문자열.
원하는 출력 예시:
{
"compliant": "yes",
"explanation": "A dedicated security team follows strict protocols for handling incidents."
}
Grader 정의하기
RFT를 하려면 훈련 중 모델 출력을 채점할 grader를 정의해요. RFT는 evals와 같은 grader 세트를 사용해요.
이 예시에서는 파인튜닝된 모델이 반환한 JSON의 속성을 검사하는 여러 grader를 정의해요.
string_checkgrader로compliant속성이 제대로 설정됐는지 확인score_modelgrader로 다른 평가자 모델을 사용해 설명 텍스트에 0과 1 사이 점수 제공
calculate_output 표현식에서 각 속성의 출력을 동일하게 가중해요. 두 grader 모두 {{ }} 템플릿 문법으로 item(평가에 쓰이는 테스트 데이터 행)과 sample(훈련 중 생성된 모델 출력) 관련 속성을 참조해요.
{
"type": "multi",
"graders": {
"explanation": {
"name": "Explanation text grader",
"type": "score_model",
"input": [
{
"role": "user",
"type": "message",
"content": "[grading prompt with Copernicus Product Security Policy and criteria]"
}
],
"model": "gpt-4o-2024-08-06"
},
"compliant": {
"name": "compliant",
"type": "string_check",
"reference": "{{item.compliant}}",
"operation": "eq",
"input": "{{sample.output_json.compliant}}"
}
},
"calculate_output": "0.5 * compliant + 0.5 * explanation"
}
grading 프롬프트에는 회사 보안 정책과 함께 채점 기준(1.0 정책과 완전 일치·사실 정확, 0.75 대체로 정확하나 사소한 누락, 0.5 부분 정확하나 핵심 세부 누락·추측, 0.25 크게 부정확하거나 중요 정보 누락, 0.0 완전히 틀림·할루시네이션·무관)을 담아요.
데이터셋 준비하기
RFT 파인튜닝을 만들려면 훈련·테스트 데이터셋이 모두 필요해요. 둘 다 같은 JSONL 형식을 공유해요. JSONL 파일의 각 줄은 messages 배열과, 모델 출력을 채점하는 데 필요한 추가 필드를 담아요. RFT 데이터셋의 전체 사양은 여기에서 찾을 수 있어요.
이 경우 messages 배열 외에 각 줄에 compliant와 explanation 속성이 필요해요. 이것을 참조 값으로 써서 파인튜닝 모델의 Structured Output을 테스트해요.
{
"messages": [
{
"role": "user",
"content": "Do you have a dedicated security team?"
}
],
"compliant": "yes",
"explanation": "A dedicated security team follows strict protocols for handling incidents."
}
아래 데이터셋은 예시용이에요. 실제 테스트 데이터에서는 앱에 다양한 대표 입력을 넣으세요.
Training set
{"messages":[{"role":"user","content":"Do you have a dedicated security team?"}],"compliant":"yes","explanation":"A dedicated security team follows strict protocols for handling incidents."}
{"messages":[{"role":"user","content":"Have you undergone third-party security audits or penetration testing in the last 12 months?"}],"compliant":"needs review","explanation":"The policy does not explicitly mention undergoing third-party security audits or penetration testing. It only mentions SOC 2 and GDPR compliance."}
Test set
{"messages":[{"role":"user","content":"Will our data be encrypted at rest?"}],"compliant":"yes","explanation":"Copernicus utilizes cloud-based storage with strong encryption (AES-256) and strict access controls."}
{"messages":[{"role":"user","content":"Do you enforce multi-factor authentication (MFA) internally?"}],"compliant":"yes","explanation":"The policy explicitly mentions role-based authentication with multi-factor security."}
훈련 데이터는 얼마나 필요한가요
큰 데이터셋에 투자하기 전에 RFT의 유용성을 판단하려면 수십 개에서 수백 개 예시 사이로 작게 시작하세요. 제품 안전상 훈련 세트는 먼저 자동 심사 과정을 통과해야 해요. 큰 데이터셋은 처리 시간이 더 걸려요. 이 심사는 파일 업로드 시가 아니라 파일로 파인튜닝 작업을 시작할 때 시작돼요. 일단 파일이 심사를 통과하면 지연 없이 반복 사용할 수 있어요.
수십 개 예시도 고품질이라면 의미가 있어요. 심사 후에는 고품질을 유지한다면 데이터가 많을수록 좋아요. 더 큰 데이터셋에서는 더 큰 batch size를 쓸 수 있고, 보통 훈련 안정성이 좋아져요. 훈련 파일에는 최대 50,000개 예시를 넣을 수 있어요. 테스트 데이터셋은 최대 1,000개 예시예요. 테스트 데이터셋도 자동 심사를 거쳐요.
파일 업로드하기
RFT 훈련·테스트 데이터 파일 업로드 과정은 지도 파인튜닝과 같아요. API나 UI로 훈련 데이터를 업로드해요. 파일은 파인튜닝에 쓰려면 fine-tune 목적(purpose)으로 업로드해야 해요. 파인튜닝 작업을 만들려면 테스트·훈련 데이터 파일의 file ID가 둘 다 필요해요.
파인튜닝 작업 만들기
API나 파인튜닝 대시보드로 파인튜닝 작업을 만들어요. 필요한 것:
- 훈련·테스트 데이터셋의 file ID
- 앞서 만든 grader 구성
- 파인튜닝 베이스로 쓸 모델 ID(여기서는
o4-mini-2025-04-16) - Structured Output으로 JSON을 반환하는 모델을 파인튜닝한다면 반환 객체의 JSON 스키마도 필요(아래 참조)
- 선택적으로 구성할 hyperparameters
- data sharing inference pricing 자격을 얻으려면 작업을 만들기 전에 먼저 평가·파인튜닝 데이터를 OpenAI와 공유해야 해요
Structured Outputs JSON 스키마
Structured Outputs를 반환하도록 모델을 파인튜닝한다면, 출력 서식에 쓰는 JSON 스키마를 제공해요. 보안 인터뷰 사용 사례에 대한 유효한 JSON 스키마는 다음과 같아요.
{
"type": "json_schema",
"json_schema": {
"name": "security_assistant",
"strict": true,
"schema": {
"type": "object",
"properties": {
"compliant": { "type": "string" },
"explanation": { "type": "string" }
},
"required": ["compliant", "explanation"],
"additionalProperties": false
}
}
}
JSON 스키마 생성을 단순화하려면 Pydantic BaseModel 클래스에서 시작해요. 클래스를 정의하고, OpenAI 라이브러리의 to_strict_json_schema로 유효한 스키마를 만들고, 스키마를 type과 name 키가 있는 딕셔너리로 감싸 strict를 true로 설정하고, 결과 객체를 RFT 작업의 response_format으로 제공해요.
from openai.lib._pydantic import to_strict_json_schema
from pydantic import BaseModel
class MyCustomClass(BaseModel):
name: str
age: int
# Note: Do not use MyCustomClass.model_json_schema() in place of
# to_strict_json_schema as it is not equivalent
schema = to_strict_json_schema(MyCustomClass)
response_format = dict(
type="json_schema",
json_schema=dict(name=MyCustomClass.__name__, strict=True, schema=schema),
)
API로 작업 만들기
API로 작업을 구성하는 건 움직이는 부분이 많아서 많은 사용자가 파인튜닝 대시보드 UI를 선호해요. 하지만 전체 API 요청은 이렇게 생겼어요.
curl https://api.openai.com/v1/fine_tuning/jobs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ***" \
-d '{
"training_file": "file-2STiufDaGXWCnT6XUBUEHW",
"validation_file": "file-4TcgH85ej7dFCjZ1kThCYb",
"model": "o4-mini-2025-04-16",
"method": {
"type": "reinforcement",
"reinforcement": {
"grader": {
"type": "multi",
"graders": {
"explanation": {
"name": "Explanation text grader",
"type": "score_model",
"input": [ { "role": "user", "type": "message", "content": "[prompt]" } ],
"model": "gpt-4o-2024-08-06"
},
"compliant": {
"name": "compliant",
"type": "string_check",
"reference": "{{item.compliant}}",
"operation": "eq",
"input": "{{sample.output_json.compliant}}"
}
},
"calculate_output": "0.5 * compliant + 0.5 * explanation"
},
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "security_assistant",
"strict": true,
"schema": {
"type": "object",
"properties": {
"compliant": { "type": "string" },
"explanation": { "type": "string" }
},
"required": ["compliant", "explanation"],
"additionalProperties": false
}
}
},
"hyperparameters": {
"reasoning_effort": "medium"
}
}
}
}'
이 요청은 작업 id를 포함한 파인튜닝 작업 객체를 반환해요. 이 ID로 작업 진행을 모니터링하고 완료되면 파인튜닝 모델을 조회해요. data sharing inference pricing 자격을 얻으려면 작업 전에 평가·파인튜닝 데이터 공유를 확인하고, shared_with_openai가 true인지 확인하세요.
파인튜닝 작업 모니터링하기
파인튜닝은 완료에 시간이 걸리고, RFT 작업은 보통 SFT나 DPO보다 더 오래 걸려요. 파인튜닝 대시보드나 API로 진행을 모니터링해요.
Reward 지표 — 강화 파인튜닝의 주요 지표는 단계별 reward 지표예요. 작업 구성에서 정의한 grader가 계산하며, 모델이 훈련 데이터에서 얼마나 잘 수행하는지 나타내요. 두 가지 최상위 reward 지표가 있어요.
train_reward_mean: 현재 단계의 모든 데이터 포인트에서 가져온 샘플의 평균 reward. 배치의 데이터 포인트가 단계마다 바뀌므로 단계 간train_reward_mean값은 직접 비교할 수 없고 단계마다 크게 변할 수 있어요.valid_reward_mean: validation 세트의 모든 데이터 포인트에서 가져온 샘플의 평균 reward로, 더 안정적인 지표예요.
작업 일시 중지·재개하기 — 작업이 부분적으로만 완료됐을 때 모델의 현재 상태를 평가하려면 작업을 일시 중지(pause) 해서 훈련을 멈추고 현재 단계의 체크포인트를 만들어요. 이 체크포인트로 보류된 테스트 세트에서 모델을 평가할 수 있어요. 결과가 좋으면 작업을 재개(resume) 해 그 체크포인트에서 훈련을 계속해요. 자세한 내용은 작업 일시 중지·재개에서 배워요.
Evals 통합 — 강화 파인튜닝 작업은 evals 제품과 통합돼요. 강화 파인튜닝 작업을 만들면 새 eval이 자동 생성되어 작업과 연결돼요. validation 단계가 수행되면 입력 프롬프트·모델 샘플·grader 출력을 합쳐 그 단계의 새 eval run을 만들어요.
결과 평가하기
파인튜닝이 끝날 때쯤에는 validation 세트의 평균 reward를 바탕으로 모델 성능을 대략 알 수 있어요. 하지만 모델이 훈련 데이터에 _과적합_됐거나, 실제로는 정확하지 않은데 높은 점수를 받을 수 있게 reward hacking을 배웠을 수 있어요. 배포 전에 대표 프롬프트 세트에서 동작을 검사해서 기대대로 행동하는지 확인하세요.
파인튜닝 작업에 연결된 evals를 검사하면 모델 동작을 빠르게 이해할 수 있어요. 특히 마지막 훈련 단계의 run을 주의 깊게 보고 최종 모델 동작을 확인하세요. evals 제품으로 최종 run을 이전 run들과 비교해 훈련 중 모델 동작이 어떻게 바뀌었는지 볼 수도 있어요.
파인튜닝 모델 사용해 보기
파인튜닝이 끝나면 그 모델 ID를 Responses나 Chat Completions API에서 OpenAI 베이스 모델처럼 사용해요. 대시보드에서 파인튜닝 작업의 Output model로 이동해 ft:…로 시작하는 모델 ID를 복사하고, Playground의 모델 드롭다운에 붙여넣어 프롬프트를 실행해 보세요.
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 4+4?"
}'
필요하면 체크포인트 사용하기
체크포인트는 훈련의 마지막 단계 전에 만들어진 모델이에요. RFT에서는 각 validation 단계에서 전체 모델 체크포인트를 만들고 valid_reward_mean 점수가 가장 높은 세 개를 유지해요. 체크포인트는 훈련의 다른 시점에서 모델을 평가하고 다른 단계의 성능을 비교하는 데 유용해요. 대시보드에서 체크포인트를 찾거나, 체크포인트 엔드포인트로 파인튜닝 작업 ID로 목록을 조회해요. fine_tuned_model_checkpoint 필드로 체크포인트 모델 이름을 찾고, 이 모델을 최종 파인튜닝 모델처럼 사용해요.
체크포인트 객체에는 이 모델의 유용성을 판단할 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
}
각 체크포인트는 step_number(체크포인트가 만들어진 단계)와 metrics(그 단계에서의 파인튜닝 작업 지표)를 지정해요.
안전 검사
프로덕션 출시 전에 다음 안전 정보를 검토하고 따르세요.
안전을 어떻게 평가하나요
파인튜닝 작업이 완료되면 결과 모델의 동작을 13개 안전 범주로 평가해요. 각 범주는 AI 출력이 제대로 제어되지 않으면 해를 끼칠 수 있는 중요한 영역이에요.
| 이름 | 설명 |
|---|---|
| advice | 정책을 위반하는 조언·지도. |
| harassment/threatening | 어떤 대상을 향한 폭력·심각한 해를 포함한 괴롭힘 콘텐츠. |
| hate | 인종·성별·민족·종교·국적·성적 지향·장애·카스트에 기반한 증오를 표현·선동·조장하는 콘텐츠. |
| hate/threatening | 보호 대상 그룹을 향한 폭력·심각한 해를 포함한 증오 콘텐츠. |
| highly-sensitive | 정책을 위반하는 고도 민감 데이터. |
| illicit | 불법 행위 방법에 대한 조언·지시 콘텐츠. |
| propaganda | 정책을 위반하는 이념에 대한 찬양·지원. |
| self-harm/instructions | 자해 행위(자살, 자해, 섭식 장애)를 수행하도록 조장하거나 그 방법을 지시·조언하는 콘텐츠. |
| self-harm/intent | 화자가 자해 행위에 관여하거나 관여하려 한다고 표현하는 콘텐츠. |
| sensitive | 정책을 위반하는 민감 데이터. |
| sexual/minors | 18세 미만 개인을 포함한 성적 콘텐츠. |
| sexual | 성적 흥분을 유발하려는 콘텐츠(성 교육·웰니스 제외). |
| violence | 죽음, 폭력, 신체 부상을 묘사하는 콘텐츠. |
각 범주에는 미리 정의된 통과 임계값이 있어요. 주어진 범주에서 평가된 예시가 너무 많이 실패하면 OpenAI가 파인튜닝 모델 배포를 차단해요. 안전 검사를 통과하지 못하면 파인튜닝 작업의 메시지에서 어떤 범주가 임계값을 충족하지 못했는지 알려줘요. 파인튜닝 작업의 moderation checks 섹션에서 결과를 볼 수 있어요.
안전 검사 통과하는 법
파인튜닝 작업 객체에서 실패한 안전 검사를 검토하는 것 외에도, 파인튜닝 API 이벤트 엔드포인트로 어떤 범주가 실패했는지 세부 정보를 가져올 수 있어요. moderation_checks 유형의 이벤트를 찾아 범주 결과와 집행을 확인하세요. 이 정보로 재훈련·개선할 범주를 좁힐 수 있어요. 모델 스펙에는 추가 훈련 데이터가 필요한 영역을 찾는 데 도움이 되는 규칙·예시가 있어요. 이 평가는 광범위한 안전 범주를 다루지만, 파인튜닝 모델이 여러분의 용도에 적절한지 직접 평가도 수행하세요.
Appendix
훈련 지표
강화 파인튜닝 작업은 단계별 훈련 지표를 파인튜닝 이벤트로 게시해요. API로 가져오거나 파인튜닝 대시보드에서 그래프로 볼 수 있어요.
Score 지표 — 주로 볼 지표는 train_reward_mean과 valid_reward_mean으로, 각각 훈련·validation 데이터셋의 모든 샘플에 대해 grader가 부여한 평균 reward를 나타내요. multi-grader 구성을 쓰면 grader별 훈련·validation reward 지표도 게시돼요. 파인튜닝 이벤트 객체의 event.data.scores 아래에 grader당 하나씩 들어가요. grader별 지표는 모델이 각 grader에서 얼마나 잘 수행하는지 이해하는 데 유용하고, 한 grader에 과적합되는지 식별하는 데 도움이 돼요.
Usage 지표 — reasoning 모델의 중요한 특성은 프롬프트에 응답하기 전에 쓰는 reasoning 토큰 수예요. 훈련 중 모델이 평균 reasoning 토큰 수를 크게 바꾸는 경우가 많아요. 이는 모델이 reward 신호에 반응해 행동을 바꾸고 있다는 신호예요. train_reasoning_tokens_mean과 valid_reasoning_tokens_mean으로 모델이 시간에 따라 행동을 어떻게 바꾸는지 모니터링할 수 있어요. 모델 grader를 쓰면 그 grader의 토큰 사용도 모니터링하는 게 좋아요. event.data.usage.graders 아래에서 train_prompt_tokens_mean·train_prompt_tokens_count·train_completion_tokens_mean·train_completion_tokens_count로 나눠 볼 수 있어요. _mean 지표는 현재 단계의 모든 프롬프트를 처리하는 데 grader가 쓴 평균 토큰 수이고, _count 지표는 현재 단계의 모든 샘플에 대해 grader가 쓴 총 토큰 수예요.
Timing 지표 — 훈련의 각 단계가 얼마나 걸리는지, 훈련의 다른 부분이 단계별 시간에 어떻게 기여하는지 이해하는 다양한 지표가 있어요. event.data.timing 객체 아래에서 step과 graders 필드로 나눠 볼 수 있어요. step에는 sampling(현재 단계의 모델 출력 샘플링 시간), training(모델 훈련·역전파 시간), eval(전체 validation 세트에서 모델 평가 시간), full_iteration(위 3개 지표와 추가 오버헤드를 포함한 현재 단계의 총 시간)이 있어요. graders 필드에는 각 grader 실행 시간(train_execution_latency_mean, valid_execution_latency_mean)이 들어 있어요. Grader는 동시성 한도로 병렬 실행되므로 개별 지연이 총 시간에 정확히 어떻게 합산되는지 항상 명확하진 않지만, 개별로 오래 걸리는 grader는 보통 작업을 느리게 해요. 가장 빠른 grader는 보통 훈련 루프에 로컬로 실행되는 string_check와 text_similarity예요.
Evals 통합 세부사항
강화 파인튜닝 작업은 evals 제품과 직접 통합돼요. 작업을 만들면 새 eval이 자동 생성되어 연결돼요. validation 단계가 수행될 때 입력 프롬프트·모델 샘플·grader 출력·기타 메타데이터를 합쳐 그 단계의 새 eval run을 만들어요. 작업 끝에는 validation 단계마다 run이 하나씩 생겨, 다른 단계의 모델 성능을 비교하고 훈련 중 모델 동작이 어떻게 바뀌었는지 볼 수 있어요. 파인튜닝 작업과 연결된 eval은 대시보드에서 보거나 파인튜닝 작업 객체의 eval_id 필드에서 찾을 수 있어요. evals는 특정 데이터 포인트에서 모델 출력을 검사해 어떤 데이터 슬라이스에서 성능이 나쁜지 알아내는 데 유용하고, grader가 지나치게 관대하거나 엄격한 영역을 찾아 개선하는 데도 도움이 돼요.
작업 일시 중지·재개
파인튜닝 작업 API로 언제든 작업을 일시 중지할 수 있어요. pause API를 호출하면 훈련 프로세스가 새 모델 스냅샷을 만들고 훈련을 멈추며 작업을 "Paused" 상태로 만들고, 그 스냅샷은 일반 안전 심사를 거친 뒤 일반 파인튜닝 모델처럼 OpenAI 전체에서 쓸 수 있게 돼요. 일시 중지된 작업을 계속하려면 같은 API로 재개해요. 일시 중지 시 만들어진 마지막 체크포인트에서 훈련을 다시 시작하고, 작업이 완료되거나 다시 일시 중지될 때까지 계속해요.
도구로 채점하기 (Grading with Tools)
모델을 도구 호출하도록 훈련한다면: 1) RFT 훈련 데이터셋의 각 데이터 포인트에서 모델이 호출할 수 있는 도구 세트를 제공하고(데이터셋 API 참조), 2) 모델이 만든 도구 호출 내용을 바탕으로 reward를 부여하도록 grader를 구성해요(grading 문서).
청구 세부사항
강화 파인튜닝 작업은 훈련에 보낸 시간과 훈련 중 모델이 쓴 토큰 수로 청구돼요. 핵심 훈련 루프에 보낸 시간만 청구하고, 훈련 데이터 준비, 데이터셋 검증, 큐 대기, 안전 evals 실행 등 다른 오버헤드는 청구하지 않아요. 정확한 청구 방식은 이 help center 기사에서 볼 수 있어요.
훈련 오류
강화 파인튜닝은 복잡한 과정이라 잘못될 수 있는 지점이 많아요. 작업에서 무슨 일이 일어나고 있는지 이해할 다양한 오류 지표를 게시해요. 특히 심각한 오류가 아니면 작업을 완전히 실패시키지 않으려 해요. 오류가 발생하면 보통 grading 단계에서 발생해요. event.data.errors 객체 아래에서 grader별로 집계된 수·비율로 볼 수 있어요.
일반 grading 오류 — sample_parse_error_mean: 파싱에 실패한 샘플의 평균 수. 모델이 유효한 JSON을 출력하지 못하거나 응답 형식을 지키지 못할 때 발생해요. 훈련 초기 일부는 정상이지만, 많다면 응답 형식이나 grader 구성이 잘못된 것일 수 있어요. invalid_variable_error_mean: 템플릿으로 참조한 변수를 현재 데이터 포인트나 모델 샘플에서 찾지 못할 때. other_error_mean: 그 외 모든 grading 오류의 포괄 범주.
Python grading 오류 — python_grader_server_error_mean: 원격 샌드박스에서 python grader를 실행하는 시스템 오류(네트워크 실패·시스템 중단). python_grader_runtime_error_mean: python grader 자체가 제대로 실행되지 않을 때. 자주 발생하면 grading 로직에 버그가 있는 것일 수 있고, 충분히 많이 발생하면 작업이 실패하고 실패한 grader의 traceback 샘플을 보여줘요.
Model grading 오류 — model_grader_server_error_mean: 모델 grader에서 샘플링에 실패했을 때. grader가 잘못 구성됐거나, 조직에서 사용할 수 없는 모델을 쓰거나, OpenAI에서 시스템 문제가 있는 경우.