

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 개방형 모델을 위한 데이터 준비
<a name="rft-prepare-data-open-weight"></a>

OpenAI 호환 APIs를 사용하여 강화 미세 조정으로 개방형 가중치 모델을 미세 조정하는 경우 용도와 함께 자체 프롬프트를 JSONL 형식으로 가져와서 훈련 데이터를 제공합니다`fine-tune`.

## 훈련 데이터 형식 및 요구 사항
<a name="rft-data-format-open-weight"></a>

훈련 데이터는 100-20K 예제와 함께 OpenAI 채팅 완료 형식을 따라야 합니다. 각 훈련 예제에는 다음이 포함됩니다.
+ `messages`:이 필드에 모델에 제공된 입력 프롬프트가 포함된 사용자, 시스템 또는 어시스턴트 역할을 포함합니다.
+ `reference_answer`:이 필드에는 보상 함수가 모델의 응답을 채점하는 데 사용하는 예상 출력 또는 평가 기준이 포함되어야 합니다. 이는 구조화된 출력으로 제한되지 않으며 보상 함수가 품질을 평가하는 데 도움이 되는 모든 형식을 포함할 수 있습니다.
+ [선택 사항] 그레이더 Lambda가 그레이딩에 사용하는 필드를 추가할 수 있습니다.

**요구 사항:**
+ OpenAI 채팅 완료 형식의 프롬프트가 있는 JSONL 형식(줄당 프롬프트 1개)
+ 목적은 로 설정해야 합니다. `fine-tune` 
+ 훈련 데이터 세트의 레코드 최소 100개
+ Amazon Bedrock은 훈련 데이터 세트 형식을 자동으로 검증합니다.

------
#### [ Example: General question-answering ]

```
{
            "messages": [
                {
                    "role": "system", 
                    "content": "You are a helpful assistant"
                },
                {
                    role": "user", 
                    "content": "What is machine learning?"}
            ],
            "reference_answer": "Machine learning is a subset of artificial intelligence that enables computers to learn and make decisions from data without being explicitly programmed."
            }
```

------
#### [ Example: Math problem ]

```
{
  "id": "sample-001",
  "messages": [
    {
      "role": "system",
      "content": "You are a math tutor"
    },
    {
      "role": "user",
      "content": "Solve: 2x + 5 = 13"
    }
  ],
  "reference_answer": {
    "solution": "x = 4",
    "steps": ["2x = 13 - 5", "2x = 8", "x = 4"]
  }
}
```

------

## 파일 API
<a name="fine-tuning-openai-files-api"></a>

OpenAI 호환 파일 API를 사용하여 미세 조정 작업을 위한 훈련 데이터를 업로드할 수 있습니다. 파일은 Amazon Bedrock에 안전하게 저장되며 미세 조정 작업을 생성할 때 사용됩니다. 전체 API 세부 정보는 [OpenAI 파일 설명서를](https://platform.openai.com/docs/api-reference/files) 참조하세요.

### 훈련 파일 업로드
<a name="fine-tuning-openai-upload-file"></a>

훈련 파일을 업로드하려면 원하는 방법의 탭을 선택한 다음 다음 단계를 따릅니다.

------
#### [ OpenAI SDK (Python) ]

```
# Requires OPENAI_API_KEY and OPENAI_BASE_URL environment variables
from openai import OpenAI
client = OpenAI()

# Upload training file
with open(TRAINING_FILE_PATH, 'rb') as f:
    file_response = client.files.create(
        file=f,
        purpose='fine-tune'
    )

# Store file ID for next steps
training_file_id = file_response.id
print(f"✅ Training file uploaded successfully: {training_file_id}")
```

------
#### [ HTTP request ]

에 POST 요청`/v1/files`:

```
curl https://bedrock-mantle.us-west-2.api.aws/v1/files \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -F purpose="fine-tune" \
  -F file="@training_data.jsonl"
```

------

### 파일 세부 정보 검색
<a name="fine-tuning-openai-retrieve-file"></a>

특정 파일에 대한 세부 정보를 검색하려면 원하는 방법의 탭을 선택한 다음 다음 단계를 따릅니다.

------
#### [ OpenAI SDK (Python) ]

```
# Requires OPENAI_API_KEY and OPENAI_BASE_URL environment variables
from openai import OpenAI
client = OpenAI()

# Retrieve file details
file_details = client.files.retrieve(training_file_id)

# Print raw response
print(json.dumps(file_details.model_dump(), indent=2))
```

------
#### [ HTTP request ]

에 GET 요청을 합니다`/v1/files/{file_id}`.

```
curl https://bedrock-mantle.us-west-2.api.aws/v1/files/file-abc123 \
  -H "Authorization: Bearer $OPENAI_API_KEY"
```

------

### 파일 나열
<a name="fine-tuning-openai-list-files"></a>

업로드된 파일을 나열하려면 원하는 방법의 탭을 선택한 다음 다음 단계를 따릅니다.

------
#### [ OpenAI SDK (Python) ]

```
# Requires OPENAI_API_KEY and OPENAI_BASE_URL environment variables
from openai import OpenAI
client = OpenAI()

# List files
files_response = client.files.list(purpose='fine-tune')

# Print raw response
print(json.dumps(files_response.model_dump(), indent=2))
```

------
#### [ HTTP request ]

에 GET 요청을 합니다`/v1/files`.

```
curl https://bedrock-mantle.us-west-2.api.aws/v1/files?purpose=fine-tune \
  -H "Authorization: Bearer $OPENAI_API_KEY"
```

------

### 파일 삭제
<a name="fine-tuning-openai-delete-file"></a>

파일을 삭제하려면 원하는 방법의 탭을 선택한 다음 다음 단계를 따릅니다.

------
#### [ OpenAI SDK (Python) ]

```
# Requires OPENAI_API_KEY and OPENAI_BASE_URL environment variables
from openai import OpenAI
client = OpenAI()

# Delete file
delete_response = client.files.delete(training_file_id)
```

------
#### [ HTTP request ]

에 대한 DELETE 요청`/v1/files/{file_id}`:

```
curl -X DELETE https://bedrock-mantle.us-west-2.api.aws/v1/files/file-abc123 \
  -H "Authorization: Bearer $OPENAI_API_KEY"
```

------

## 효과적인 훈련 데이터의 특성
<a name="rft-data-characteristics-open-weight"></a>

효과적인 RFT 훈련 데이터에는 세 가지 주요 특성이 필요합니다.
+ **명확성 및 일관성** - 일관된 형식 지정으로 명확하고 모호하지 않은 프롬프트를 사용합니다. 모순된 레이블, 모호한 지침 또는 훈련을 오도하는 참조 답변 충돌을 방지합니다.
+ **다양성** - 다양한 사용자 유형 및 시나리오의 프로덕션 사용 패턴을 반영하는 다양한 입력 형식, 엣지 케이스 및 난이도를 포함합니다.
+ **효율적인 보상 함수** - 빠르게 실행되고(초, 분 아님),와 병렬화되고 AWS Lambda, 비용 효율적인 훈련을 위한 일관된 점수를 반환하는 함수를 설계합니다.

## 추가 속성
<a name="rft-additional-properties-open-weight"></a>

RFT 데이터 형식은 핵심 스키마 요구 사항(`messages` 및 ) 이외의 사용자 지정 필드를 지원합니다`reference_answer`. 이러한 유연성을 통해 보상 함수가 적절한 평가에 필요한 데이터를 추가할 수 있습니다.

**참고**  
레시피에서 이를 구성할 필요가 없습니다. 데이터 형식은 기본적으로 추가 필드를 지원합니다. 훈련 데이터 JSON에 포함하면 `metadata` 필드의 보상 함수로 전달됩니다.

**일반적인 추가 속성**
+ `task_id` - 추적을 위한 고유 식별자
+ `difficulty_level` - 문제 복잡성 지표
+ `domain` - 주제 영역 또는 범주
+ `expected_reasoning_steps` - 솔루션의 단계 수

이러한 추가 필드는 평가 중에 보상 함수에 전달되므로 특정 사용 사례에 맞게 조정된 정교한 점수 평가 로직이 가능합니다.

**추가 속성이 있는 예제**

------
#### [ Chemistry problem ]

```
{
  "id": "chem-001",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful chemistry assistant"
    },
    {
      "role": "user",
      "content": "Predict hydrogen bond donors and acceptors for this SMILES: CCN(CC)CCC(=O)c1sc(N)nc1C"
    }
  ],
  "reference_answer": {
    "donor_bond_counts": 2,
    "acceptor_bond_counts": 4
  }
}
```

`reference_answer` 필드에는 보상 함수가 모델의 응답을 채점하는 데 사용하는 예상 출력 또는 평가 기준이 포함되어 있습니다. 구조화된 출력에만 국한되지 않습니다. 보상 함수가 품질을 평가하는 데 도움이 되는 모든 형식을 포함할 수 있습니다.

------
#### [ Math problem with metadata ]

```
{
  "messages": [
    {
      "role": "system",
      "content": "You are a math tutor"
    },
    {
      "role": "user",
      "content": "Solve: 2x + 5 = 13"
    }
  ],
  "reference_answer": {
    "solution": "x = 4",
    "steps": ["2x = 13 - 5", "2x = 8", "x = 4"]
  },
  "task_id": "algebra_001",
  "difficulty_level": "easy",
  "domain": "algebra",
  "expected_reasoning_steps": 3
}
```

------