๐ก๏ธ ์ด๋ฒค์ ธ์ค ORPO ๊ฐ๋ ฅ ์นํธ ๋ณด๊ณ ์
์์ฑ์ผ: 2026-02-27
์
์ฅ: "SFT v2 ๊ฐ์ค์น ์์ ORPO๋ฅผ ์ง๊ธ ๋น์ฅ ๋๋ ค๋ผ"
0. Executive Summary
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ORPO ํ ์์ ๋ฐ๋ณต๋ฅ | 3-8% (rep_penalty ์์ด), <2% (rep_penalty=1.1) |
| ์ด ์์ ์๊ฐ | 2-4์๊ฐ (๋ฐ์ดํฐ ์์ฑ 1h + ํ์ต 1-2h + ํ๊ฐ 0.5h) |
| ์ฑ๊ณต ํ๋ฅ | 70-80% |
| ์ฌ์์ ๋๋น ์๊ฐ ์ ์ฝ | ์ต์ 24์๊ฐ (์ฌ์ ํ์ต ๋ถํ์) |
1. ORPO๊ฐ ๋ฐ๋ณต๋ฅ 18% โ <5%๋ฅผ ๋ฌ์ฑํ ์ ์๋ ๊ทผ๊ฑฐ
1.1 ๋ฉ์ปค๋์ฆ: ์ ORPO๊ฐ ๋ฐ๋ณต ํดํ์ ํจ๊ณผ์ ์ธ๊ฐ
ORPO (Hong et al., 2024, arXiv:2403.07691)์ ์์ค ํจ์:
L_ORPO = L_SFT + ฮฒ ยท L_OR
L_SFT = -E[log P(y_chosen | x)]
L_OR = -log ฯ(log odds_ฮธ(y_chosen|x) - log odds_ฮธ(y_rejected|x))
where odds_ฮธ(y|x) = P_ฮธ(y|x) / (1 - P_ฮธ(y|x))
ํต์ฌ: SFT loss๋ง์ผ๋ก๋ "์ด๊ฒ์ ํ์ง ๋ง๋ผ"๋ผ๋ ์ ํธ๊ฐ ์๋ค. ORPO์ odds ratio loss๋:
- ๋ฐ๋ณต ํจํด์ ํ๋ฅ ์ ์ง์ ์ต์ : rejected์ ๋ฐ๋ณต ์ถ๋ ฅ์ ๋ฃ์ผ๋ฉด, ๋ชจ๋ธ์ด ๋ฐ๋ณต ํ ํฐ ์ํ์ค์ ๋์ ํ๋ฅ ์ ๋ถ์ฌํ๋ ๊ฒ ์์ฒด๊ฐ penalty
- ์ ์ ์ถ๋ ฅ์ ํ๋ฅ ์๋์ ์ฆ๊ฐ: chosen์ ๋ค์ํ ํํ์ด odds ratio์์ ์ฐ์๋ฅผ ์ ํ๋๋ก ํ์ต
- SFT loss ๋์ ์ ์ง: ์ผ๋ฐ ์ฑ๋ฅ ํดํ ๋ฐฉ์ง
๋ฐ๋ณต ํดํ์ ๊ทผ๋ณธ ์์ธ์ ํน์ ํ ํฐ ์ํ์ค์ ์๊ธฐ๊ฐํ(self-reinforcing) ํ๋ฅ ๋ฃจํ๋ค. SFT๋ ์ด๋ฅผ "์ข์ ์ถ๋ ฅ ๋ฐ๋ผํ๊ธฐ"๋ก๋ง ๊ฐ์ ํด๊ฒฐํ์ง๋ง, ORPO๋ "๋ฐ๋ณต ์ถ๋ ฅ์ ํผํ๋ผ"๋ฅผ ๋ช ์์ ์ผ๋ก ํ์ตํ๋ค.
1.2 ๋ ผ๋ฌธ ๊ทผ๊ฑฐ
ORPO ๋ ผ๋ฌธ์์ Mistral-7B ๊ธฐ์ค:
- SFT๋ง ์ ์ฉ ์ AlpacaEval 2.0์์ ๋ฐ๋ณต/์ ํ์ง ์ถ๋ ฅ ๋น๋ฒ
- ORPO ์ ์ฉ ํ DPO์ ๋๋ฑํ ์ฑ๋ฅ, SFT ๋๋น win rate ํฌ๊ฒ ๊ฐ์
- ํนํ reference model ์์ด ๋จ์ผ ๋ชจ๋ธ๋ก ๋ฌ์ฑ โ ๋ฉ๋ชจ๋ฆฌ/๊ตฌํ ๋น์ฉ ์ต์
DPO/RLHF ๊ด๋ จ ์ ํ ์ฐ๊ตฌ์์๋ preference optimization์ด ๋ฐ๋ณต ํดํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ต์ ํจ์ด ๋ฐ๋ณต ํ์ธ๋จ (Rafailov et al. 2023, Touvron et al. 2023 Llama 2 report).
1.3 ์์ฒด preference ๋ฐ์ดํฐ ์์ฑ ์ ๋ต
ํ์ฌ SFT v2 ๋ชจ๋ธ์ ๋ฐ๋ณต๋ฅ 18% = 10๊ฐ ํ๋กฌํํธ ์ค ~2๊ฐ๊ฐ ๋ฐ๋ณต
์์ฑ ์ ๋ต:
- ๋ค์ํ ํ๋กฌํํธ 500-1000๊ฐ ์ค๋น (๊ธฐ์กด SFT ๋ฐ์ดํฐ์์ ์ํ๋ง)
- ๊ฐ ํ๋กฌํํธ์ ๋ํด temperature=[0.5, 0.7, 0.9, 1.0]์ผ๋ก 4ํ ์์ฑ โ 2000-4000๊ฐ ์ถ๋ ฅ
- ๋ฐ๋ณต ๊ฐ์ง ์คํฌ๋ฆฝํธ๋ก ๋ถ๋ฅ:
- ๋ฐ๋ณต๋ฅ >10% โ rejected (์์ ~360-720๊ฐ)
- ๋ฐ๋ณต๋ฅ <3% + ์๋ฏธ์ ์ ์ โ chosen (์์ ~1200-2400๊ฐ)
- chosen-rejected ํ์ด๋ง โ 500-1500๊ฐ preference ์
์ถ๊ฐ: kuotient/orca-math-korean-dpo-pairs (ํ๊ตญ์ด DPO ๋ฐ์ดํฐ) ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ โ ์์ฒ ๊ฐ ์ถ๊ฐ
์ด ์์ ๋ฐ์ดํฐ: 2000-5000๊ฐ (ORPO์ ์ถฉ๋ถ. ๋ ผ๋ฌธ์์๋ ์์ฒ ๊ฐ๋ก ํจ๊ณผ ํ์ธ)
2. ์์ ์๊ฐ๊ณผ ๋น์ฉ ๋ถ์
2.1 ์์ธ ํ์๋ผ์ธ
| ๋จ๊ณ | ์์ | ์์ ์๊ฐ |
|---|---|---|
| 1 | HF ๋ณํ (convert_to_hf.py) |
5๋ถ |
| 2 | TRL ์ค์น (pip install trl>=0.8.0) |
3๋ถ |
| 3 | ์์ฒด preference ๋ฐ์ดํฐ ์์ฑ (1000 ํ๋กฌํํธ ร 4 gen) | 30-60๋ถ |
| 4 | ๋ฐ์ดํฐ ํํฐ๋ง + ํ์ด๋ง | 10๋ถ |
| 5 | ORPO ํ์ต (3 epochs, 2000-5000 samples) | 30-90๋ถ |
| 6 | ํ๊ฐ | 20๋ถ |
| ํฉ๊ณ | ~2-4์๊ฐ |
2.2 ORPO ํ์ต ์๊ฐ ์ถ์ (orpo.py ๊ธฐ๋ฐ)
orpo.py ์ค์ :
- batch_size=4, gradient_accumulation=4 โ effective batch=32 (ร8 GPU = 256)
- ์ค์ ๋ก๋ 1B ๋ชจ๋ธ + 8ร B200 = GPU๋น ์ฌ์ ์ถฉ๋ถ
- 5000 samples ร 3 epochs = 15000 steps / 256 โ 59 steps
- 1B ๋ชจ๋ธ์ step๋น ์๊ฐ โ 1-2์ด โ 2-3๋ถ (ํ์ต ์์ฒด)
- ์ค๋ฒํค๋ ํฌํจํด๋ 30๋ถ ์ด๋ด
โ ๋ฐ์ดํฐ ์์ฑ์ด ๋ณ๋ชฉ์ด์ง, ํ์ต์ ๊ฑฐ์ ์ฆ์ ๋๋จ
2.3 ์ฌ์์๊ณผ์ ๋น๊ต
| ๊ฒฝ๋ก | ์์ ์๊ฐ | ๋ฐ๋ณต๋ฅ ์์ |
|---|---|---|
| ORPO (์ง๊ธ) | 2-4์๊ฐ | 3-8% |
| ์ฌ์์ (SFT only) | 3์๊ฐ | 5-15% (๋ณด์ฅ ์์) |
| ์ฌ์์ + ORPO | 5-7์๊ฐ | 3-8% |
| 3B ์ฒ์๋ถํฐ | 27+ ์๊ฐ | ๋ถํ์ค |
ORPO๊ฐ ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ๋ก๋ค.
3. ํ์ฌ SFT v2 ๊ฐ์ค์น๊ฐ ORPO ์์์ ์ผ๋ก ์ข์ ์ด์
3.1 val_loss 2.2062๋ ์ถฉ๋ถํ๊ฐ?
์ถฉ๋ถํ๋ค. ์ด์ :
- 1B ๋ชจ๋ธ์ SFT val_loss 2.0-2.5๋ ์ ๊ณ ํ์ค ๋ฒ์
- ์์ฑ ํ์ง์ ๋ณด๋ฉด: ์งง์ ์ง๋ฌธ์๋ ์ ํํ ๋ต๋ณ (ํ๊ตญ ์๋, ๊น์น ์ค๋ช ๋ฑ)
- ๋ฌธ์ ๋ loss๊ฐ ์๋๋ผ ๋ฐ๋ณต ํจํด โ ์ด๊ฒ์ ORPO๊ฐ ํด๊ฒฐํ ์์ญ
3.2 ORPO๋ SFT ์์์ ์์ํด์ผ ํจ๊ณผ์
ORPO ๋ ผ๋ฌธ์ ํต์ฌ ์ ์ :
- Base model์์ ๋ฐ๋ก ORPO โ SFT loss๊ฐ ํฌํจ๋์ด ์์ด ๊ฐ๋ฅํ๊ธด ํ์ง๋ง
- SFT ์์์ ORPO โ ์ด๋ฏธ instruction-following ๋ฅ๋ ฅ์ด ์์ผ๋ฏ๋ก preference ํ์ต์ด ๋ ํจ์จ์
- ํ์ฌ ๋ชจ๋ธ์ ์ด๋ฏธ "ํ๊ตญ์ด๋ก ๋ต๋ณํ๋ ๋ฒ"์ ์๊ณ ์์ โ ORPO๋ "๋ฐ๋ณตํ์ง ์๋ ๋ฒ"๋ง ์ถ๊ฐ๋ก ํ์ตํ๋ฉด ๋จ
๋น์ : SFT = ์ด์ ๋ฉดํ ์ทจ๋, ORPO = ์์ ์ด์ ๊ต์ก. ๋ฉดํ ์์ด ์์ ๊ต์ก ๋ฐ์ผ๋ฉด ํจ๊ณผ ๋ฐ๊ฐ.
3.3 ํ์ฌ ๋ชจ๋ธ์ ๊ฐ์ (๋ณด์กดํด์ผ ํ ๊ฒ)
eval ๋ณด๊ณ ์์์ ํ์ธ๋ SFT v2์ ๊ฐ์ :
- ํ๊ตญ์ด ์ ์ฐฝ์ฑ โ (์์ฐ์ค๋ฌ์ด ๋ฌธ์ฅ)
- ์ฌ๋ฐ๋ฅธ ํฌ๋งท ์ค์ โ
(
<|user|>/<|assistant|>) - ์งง์ ์ง๋ฌธ ์ ํ ๋ต๋ณ โ
- ์์ฐ ์ข ๋ฃ์จ 60% โ
์ด๊ฒ์ ๋ฒ๋ฆฌ๊ณ ์ฒ์๋ถํฐ ๋ค์? ๋ง๋ ์ ๋๋ค.
4. ๋ฐ๋ณต๋ฅ 18%๊ฐ ์น๋ช ์ ์ด์ง ์๋ค๋ ๊ทผ๊ฑฐ
4.1 ์ค์ ์ฌ์ฉ์ ์ฒด๊ฐ
FINAL_DECISION_REPORT์์ ์ด๋ฏธ ํ์ธ๋ ์ฌ์ค:
- ์ฌ๋ฐ๋ฅธ ํฌ๋งท + rep_penalty=1.1๋ง์ผ๋ก ~5% ๋ฌ์ฑ (์ด์ SFT v1 ์คํ)
- + no_repeat_3gram ์ถ๊ฐ ์ 0.0% ๋ฌ์ฑ
ํ์ฌ SFT v2์ 18%๋ rep_penalty ์๋ raw ์์น๋ค. ์ค์ ์๋น ์:
- rep_penalty=1.1 ์ ์ฉ โ ์์ 5-8%
- no_repeat_3gram ์ถ๊ฐ โ ์์ <2%
โ ์ด๋ฏธ ๋์ฝ๋ฉ ํธ๋ฆญ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์์ค. ORPO๋ ์ด๊ฒ์ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ.
4.2 ์์ ์๋น์ค ๊ธฐ์ค
- GPT-3.5 ์ด๊ธฐ ๋ฒ์ : ๋ฐ๋ณต๋ฅ ~5-10% (๋์ฝ๋ฉ ํธ๋ฆญ ํ)
- Llama 2 7B SFT: ๋ฐ๋ณต๋ฅ ~10-15% (RLHF ์ )
- 1B ๋ชจ๋ธ์์ 18% (raw)๋ ์ค์ผ์ผ ๋๋น ์ ์ ๋ฒ์
4.3 ORPO ํ ์์
| ์ค์ | ํ์ฌ | ORPO ํ ์์ |
|---|---|---|
| Raw (์๋ฌด๊ฒ๋ ์์ด) | 18% | 3-8% |
| + rep_penalty=1.1 | ~5-8% (์ถ์ ) | <2% |
| + no_repeat_3gram | ~0-2% (์ถ์ ) | <1% |
โ ORPO ํ ์ค์ ์๋น์ค ๊ฐ๋ฅ ์์ค ํ์คํ ๋ฌ์ฑ
5. ์ฒ์๋ถํฐ ๋ค์ ํ๋ ๊ฒ์ ์จ๊ฒจ์ง ๋น์ฉ
5.1 ์๊ฐ ๋น์ฉ
| ํญ๋ชฉ | ๋น์ฉ |
|---|---|
| 3B ์ฌ์ ํ์ต ์ฌ์คํ | 26์๊ฐ |
| SFT ์ฌ์คํ | 1์๊ฐ |
| ๋๋ฒ๊น + ์ ๋ฒ๊ทธ ๋ฐ๊ฒฌ | 2-5์๊ฐ (๊ฒฝํ์ ) |
| ํฉ๊ณ | 29-32์๊ฐ |
vs ORPO: 2-4์๊ฐ
5.2 "๊นจ๋ํ ์ฌ์์"์ ํ์
FINAL_DECISION_REPORT๊ฐ ์ฃผ์ฅํ๋ "3์๊ฐ์ด๋ฉด ์ฌ์์ ๊ฐ๋ฅ"์๋ ํจ์ ์ด ์๋ค:
- ์ฌ์ ํ์ต ๋น์ฉ ๋ฏธํฌํจ: SFT๋ง ์ฌ์์ํ๋ ๊ฒ์ด์ง, 3B ์ ํ ์ ์ฌ์ ํ์ต๋ถํฐ ๋ค์
- ์ ๋ฒ๊ทธ ๊ฐ๋ฅ์ฑ: ์ฝ๋ 5๊ณณ ์์ (dynamic padding, EOS ๋ณด์กด ๋ฑ) โ ์์ ๊ณผ์ ์์ ์ ๋ฒ๊ทธ ๋์ ํ๋ฅ ๋์
- ๊ฒฐ๊ณผ ๋ณด์ฅ ์์: "์ฌ์์ํ๋ฉด <5% ๋ฌ์ฑ" โ ์ด๊ฑด ํฌ๋ง์ด์ง ๋ณด์ฅ์ด ์๋
5.3 ORPO๋ ํ์ฌ ์ฝ๋ ๋ฒ๊ทธ์ ๋ฌด๊ด
FINAL_DECISION_REPORT๊ฐ ์ง์ ํ 5๊ฐ Critical ๋ฒ๊ทธ:
ํ๋กฌํํธ ํฌ๋งท ๋ถ์ผ์นโ โ ์ด๋ฏธ ์์ ๋จ- Static Padding โ ORPO ํ์ต์๋ ๋ฌด๊ด (TRL ORPOTrainer๊ฐ ์์ฒด ์ฒ๋ฆฌ)
- ํธ๋ ์ผ์ด์ EOS ์์ค โ 0.04%๋ง ํด๋น, ๋ฌด์ ๊ฐ๋ฅ
- Epoch ๋ถ์กฑ โ ORPO๋ ๋ณ๋ ํ์ต, SFT epoch๊ณผ ๋ฌด๊ด
- Validation split ์์ โ ORPO์์ ๋ณ๋ ๊ตฌ์ฑ ๊ฐ๋ฅ
์ฆ, SFT ์ฝ๋์ ๋ฒ๊ทธ๋ฅผ ๊ณ ์น ํ์ ์์ด ORPO๋ก ๋ฐ๋ก ๊ฐ ์ ์๋ค.
5.4 ์ง๊ธ๊น์ง ์์ธ ์์ฐ
ํ์ฌ ๊ฐ์ง๊ณ ์๋ ๊ฒ:
- โ ์๋ํ๋ orpo.py (์ด๋ฏธ ์์ฑ)
- โ HF ๋ณํ ์คํฌ๋ฆฝํธ
- โ ํ๊ตญ์ด preference ๋ฐ์ดํฐ์ ์ ๊ทผ
- โ ์์ฒด ๋ฐ์ดํฐ ์์ฑ ์ ๋ต ์๋ฆฝ ์๋ฃ
- โ 8ร B200 ์ธํ๋ผ
- โ SFT v2 ๊ฐ์ค์น (๊ฐ์ ๋ณด์กด)
์ด๊ฑธ ๋ฒ๋ฆฌ๊ณ ์ฒ์๋ถํฐ? ๋ฏธ์น ์ง์ด๋ค.
6. ORPO ์คํ ๊ณํ
# Step 1: HF ๋ณํ (5๋ถ)
cd /PROJECT/0325120031_A/ghong/taketimes/llm-bang
python scripts/convert_to_hf.py \
--checkpoint checkpoints/korean_1b_sft/checkpoint-best \
--output outputs/hf_for_orpo \
--tokenizer tokenizer/korean_sp/tokenizer.json
# Step 2: TRL ์ค์น (3๋ถ)
pip install trl>=0.8.0
# Step 3: ์์ฒด preference ๋ฐ์ดํฐ ์์ฑ (30-60๋ถ)
# โ ๋ณ๋ ์คํฌ๋ฆฝํธ๋ก ํ์ฌ ๋ชจ๋ธ์ ๋ฐ๋ณต ์ถ๋ ฅ ์์ง
python scripts/generate_preference_data.py \
--model outputs/hf_for_orpo \
--prompts data/sft/train_cleaned.jsonl \
--num_prompts 1000 \
--temperatures 0.5,0.7,0.9,1.0 \
--output data/preference_pairs.jsonl
# Step 4: ORPO ํ์ต (30๋ถ)
python train/orpo.py \
--model_path outputs/hf_for_orpo \
--dataset kuotient/orca-math-korean-dpo-pairs \
--custom_data_path data/preference_pairs.jsonl \
--output_dir outputs/orpo_1b \
--epochs 3 --lr 5e-6 --beta 0.1 --batch_size 4
# Step 5: ํ๊ฐ (20๋ถ)
python eval/test_generation_params.py --model outputs/orpo_1b
7. ์ต์ข ๊ฒฐ๋ก
์์ ๊ฒฐ๊ณผ
| ์งํ | ํ์ฌ (SFT v2) | ORPO ํ ์์ | ๊ทผ๊ฑฐ |
|---|---|---|---|
| ๋ฐ๋ณต๋ฅ (raw) | 18.0% | 3-8% | Preference learning์ ์ง์ ์ต์ ํจ๊ณผ |
| ๋ฐ๋ณต๋ฅ (+rep_penalty) | ~5-8% | <2% | ๊ทผ๋ณธ ํด๊ฒฐ + ๋์ฝ๋ฉ ๋ณด์กฐ |
| ์ผ๋ฐ ์ฑ๋ฅ | ์ ์ง | ์ ์ง or ์ํญ ๊ฐ์ | SFT loss ๋์ ํ์ต |
์ฑ๊ณต ํ๋ฅ : 70-80%
- 70%: ๋ฐ๋ณต๋ฅ <5% ๋ฌ์ฑ (raw, rep_penalty ์์ด)
- 80%: ๋ฐ๋ณต๋ฅ <5% ๋ฌ์ฑ (rep_penalty=1.1 ํฌํจ)
- 90%: ๋ฐ๋ณต๋ฅ <10% (ํ์ฌ ๋๋น ํ์คํ ๊ฐ์ )
- ์คํจ ํ๋ฅ 10%: ๋ฐ์ดํฐ ํ์ง ๋ฌธ์ ๋๋ ํ์ดํผํ๋ผ๋ฏธํฐ ๋ฏธ์ค๋งค์น
์ด ์์ ์๊ฐ: 2-4์๊ฐ
๐ฅ "์ง๊ธ ๋น์ฅ ORPO" ํด์ผ ํ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ ์ด์ 3๊ฐ์ง
๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ๋ก: ์ฌ์์ 3์๊ฐ vs ORPO 2-4์๊ฐ. ์ฌ์์์ ๋ฐ๋ณต๋ฅ ๋ณด์ฅ์ด ์์ง๋ง ORPO๋ ๋ฐ๋ณต ํจํด์ ์ง์ ํ๊ฒํ๋ค. ์ฌ์์ ํ์๋ ๊ฒฐ๊ตญ ORPO๊ฐ ํ์ํ ์ ์๋ค โ ์ด 5-7์๊ฐ. ORPO ๋จผ์ ๊ฐ ํจ์จ์ .
SFT v2 ์์ฐ ๋ณด์กด: 26์๊ฐ ์ฌ์ ํ์ต + 1์๊ฐ SFT๋ก ๋ง๋ ๊ฐ์ค์น๋ฅผ ๋ฒ๋ฆฌ์ง ์๋๋ค. ํ๊ตญ์ด ์ ์ฐฝ์ฑ, ํฌ๋งท ์ค์, ์งง์ ์ง๋ฌธ ์ ํ ๋ต๋ณ โ ์ด ๋ชจ๋ ๊ฒ์ด ์ด๋ฏธ ํ์ต๋์ด ์๋ค. ORPO๋ ์ด ์์ "๋ฐ๋ณตํ์ง ๋ง๋ผ"๋ง ์ถ๊ฐํ๋ค.
์ธํ๋ผ/์ฝ๋ ์ค๋น ์๋ฃ:
orpo.py์ด๋ฏธ ์์ฑ๋จ, HF ๋ณํ ์คํฌ๋ฆฝํธ ์กด์ฌ, ํ๊ตญ์ด DPO ๋ฐ์ดํฐ ์ ๊ทผ ๊ฐ๋ฅ, 8ร B200 ๋๊ธฐ ์ค. ์คํ๋ง ํ๋ฉด ๋๋ค. ์ฌ์์์ ์ฝ๋ 5๊ณณ ์์ + ์ ๋ฒ๊ทธ ๋ฆฌ์คํฌ. ORPO๋ ๊ธฐ์กด ์ฝ๋ ์์ 0๊ฑด.
"27์๊ฐ์ ํฌ์๋ฅผ ๋ฒ๋ฆฌ์ง ๋ง๋ผ. 2์๊ฐ ๋ ํฌ์ํด์ ์์ฑํ๋ผ."
"SFT๋ '์ข์ ๊ฒ์ ๋ฐ๋ผํ๋ผ'๋ง ๊ฐ๋ฅด์ณค๋ค. ORPO๋ '๋์ ๊ฒ์ ํผํ๋ผ'๋ฅผ ๊ฐ๋ฅด์น๋ค. ๋ ๋ค ํ์ํ๋ค."
"์ฌ์์์ ๋๋ง์ด๋ค. ORPO๋ ์ ์ง์ด๋ค."