Some checks failed
Windows / verify (push) Has been cancelled
모델이 티어에 따라 2~17GB 를 차지하는데 %APPDATA% 에 박혀 있어서 C 드라이브가 좁은 사람은 손쓸 방법이 없었다. 처음 켤 때 한 번 묻고, 그 선택을 기억하고, 설정에서 바꿀 수 있게 한다. 닭과 달걀 문제가 하나 있다 — "어디에 둘지" 는 사용자가 정하는데 그 선택 자체는 고정된 곳에 적어둬야 다음 실행에 찾을 수 있다. 그래서 OS 표준 폴더에는 위치를 가리키는 쪽지(location.json) 한 장만 두고, 내용물은 전부 고른 폴더에 둔다. - storage.py 신설: 쪽지 읽기/쓰기, 경로 검증, 여유 공간, 데이터 이동 - config.py 의 CONFIG_PATH 를 config_path() 로 바꾼다. import 시점 상수라 위치를 바꿔도 옛 경로를 계속 가리켰다 - 위치가 정해지기 전에는 파일 로그를 열지 않는다. 열면 고르지도 않은 기본 폴더가 만들어지고 거기에 로그가 남는다 - 이전 버전 사용자에게는 묻지 않는다. 기본 위치에 쓰던 흔적이 있으면 그대로 쓴다 — 같은 자리를 다시 고르는 헛수고를 시킬 이유가 없다 - 고른 디스크가 빠져도 죽지 않고 기본 위치로 물러난다 - 위치를 바꿀 때 받아둔 모델을 옮길지 물어본다. 수 GB 라 창이 얼어붙지 않도록 별도 스레드에서 옮긴다 - windows_smoke 에 이 화면 렌더링 점검을 추가하고, 스크린샷을 호스트로 회수한다. 경로 표기와 디스크 조회는 OS 마다 다르게 도는 부분이다
143 lines
6.4 KiB
Markdown
143 lines
6.4 KiB
Markdown
# 게임·방송 용어 추가학습
|
|
|
|
## 결론부터
|
|
|
|
**가능합니다.** 다만 대부분의 경우 **추가학습보다 용어집이 먼저입니다.**
|
|
|
|
| 방법 | 준비 | 효과가 나타나는 시점 | 무엇에 좋은가 |
|
|
|---|---|---|---|
|
|
| **1. 용어집** (구현 완료) | 단어 목록만 | **즉시** | 고유명사, 스킬명, 아이템명, 캐릭터명 |
|
|
| **2. LoRA 추가학습** | 문장 쌍 1,000~3,000개 | 30분~3시간 학습 | 말투, 문장 구조, 도메인 어조 |
|
|
| **3. 풀 파인튜닝** | 문장 쌍 10,000개 이상 | 수 시간~하루 | 번역 스타일 전면 교체 |
|
|
|
|
용어집과 추가학습은 **경쟁 관계가 아니라 보완 관계**입니다. 둘 다 켜는 게 가장 좋습니다.
|
|
|
|
---
|
|
|
|
## 1. 용어집 — 먼저 이것부터
|
|
|
|
`용어집` 화면에서 "원문 → 각 언어 역어"를 등록하면 끝입니다. 학습 없이 바로 적용됩니다.
|
|
|
|
동작 방식은 번역 모델에 따라 다릅니다.
|
|
|
|
- **1~4티어 (NLLB, Seed-X)** — 등록 단어를 `⟦0⟧` 같은 토큰으로 바꿔치기해 모델이 아예
|
|
건드리지 못하게 한 뒤, 번역이 끝나면 지정한 역어로 되돌립니다.
|
|
- **5티어 (Qwen3)** — 그 문장에 실제로 나온 용어만 골라 프롬프트에
|
|
"이 용어는 이렇게 옮겨라"로 넣어줍니다. 조사·어미까지 문맥에 맞게 붙어 더 자연스럽습니다.
|
|
|
|
4티어 Seed-X가 LLM인데도 프롬프트 방식을 못 쓰는 이유는, 이 모델이 chat template 없는
|
|
**번역 전용 completion 모델**이기 때문입니다. 지시문을 이해하지 못할뿐더러 모델 카드가
|
|
정한 고정 프롬프트 형식(끝의 `<ko>` 같은 언어 태그 포함)을 벗어나면 품질이 무너집니다.
|
|
용어집을 문맥까지 자연스럽게 반영하고 싶다면 5티어를 쓰세요.
|
|
|
|
CSV로 한 번에 가져올 수 있습니다.
|
|
|
|
```csv
|
|
원문 용어,한국어 역어,English 역어,日本語 역어,中文 역어,메모
|
|
Nexus,넥서스,Nexus,ネクサス,基地,LoL
|
|
baron,바론,Baron,バロン,男爵,LoL
|
|
ult,궁,ultimate,アルティメット,大招,궁극기
|
|
gg,잘 싸웠다,gg,gg,打得好,
|
|
```
|
|
|
|
**게임 하나당 200~500개만 등록해도 체감 품질이 크게 올라갑니다.** 추가학습으로
|
|
같은 효과를 내려면 훨씬 많은 데이터가 필요합니다. 용어집을 먼저 채우세요.
|
|
|
|
---
|
|
|
|
## 2. LoRA 추가학습 — 용어집으로 안 되는 것
|
|
|
|
용어집은 "이 단어를 저 단어로"만 고칩니다. 아래는 못 잡습니다.
|
|
|
|
- 말투 — "You're getting rolled" → "탈탈 털리고 있네" (직역 아닌 게임 말투)
|
|
- 생략된 주어·목적어 복원 — 게임 음성에는 생략이 많습니다
|
|
- 방송 특유의 감탄·리액션 어조
|
|
|
|
이건 문장 쌍으로 학습시켜야 합니다.
|
|
|
|
### 필요한 데이터 양
|
|
|
|
공개 연구 기준으로,
|
|
|
|
- 언어쌍당 **약 650~1,000 문장**만으로도 LoRA 도메인 적응이 동작합니다.
|
|
- 언어쌍당 **2,000 문장 / 15~20 epoch** 수준에서 chrF++ 평균 **+6.1점** 개선이 보고됩니다.
|
|
|
|
즉 **언어쌍당 1,000~3,000 문장이 현실적인 목표**입니다. 4개 언어 전부가 아니라,
|
|
실제로 많이 쓰는 방향(예: 영어→한국어) 하나만 먼저 하는 게 효율적입니다.
|
|
|
|
### 데이터 만드는 법
|
|
|
|
1. **게임 공식 현지화 자산** — 한국어판이 있는 게임의 자막/UI 텍스트. 품질이 가장 좋습니다.
|
|
2. **자막 파일 쌍** — 같은 영상의 영어 자막 + 한국어 자막(.srt)을 시간축으로 정렬.
|
|
3. **이 프로그램의 기록** — `설정 > 번역 기록을 파일로 남기기`를 켜두면
|
|
저장 위치 폴더의 `transcripts/` 에 "원문 / 번역" 쌍이 쌓입니다.
|
|
**틀린 번역만 손으로 고쳐서** 학습 데이터로 쓰는 게 가장 현실적인 경로입니다.
|
|
4. 위키·커뮤니티 용어 사전 — 용어집으로 쓰는 게 더 낫습니다. 문장이 아니므로.
|
|
|
|
형식은 JSONL 한 줄에 한 쌍입니다.
|
|
|
|
```jsonl
|
|
{"source": "Enemy missing from mid", "target": "미드 실종", "source_lang": "en", "target_lang": "ko"}
|
|
{"source": "I'll take baron", "target": "바론 내가 먹을게", "source_lang": "en", "target_lang": "ko"}
|
|
```
|
|
|
|
### 학습 실행
|
|
|
|
```bash
|
|
pip install -e ".[finetune]"
|
|
|
|
python scripts/finetune_mt.py \
|
|
--data data/game_terms.jsonl \
|
|
--tier ultimate \
|
|
--output ./adapters/game-ko \
|
|
--epochs 3
|
|
```
|
|
|
|
끝나면 `모델` 화면의 **추가학습 어댑터** 칸에 `./adapters/game-ko` 를 넣으면 적용됩니다.
|
|
|
|
### 티어별 난이도
|
|
|
|
| 티어 | 번역 모델 | 방식 | 학습에 필요한 VRAM | 난이도 |
|
|
|---|---|---|---|---|
|
|
| 1~2 | NLLB-600M | 풀 파인튜닝 가능 | ~8GB | ★ 쉬움 |
|
|
| 3 | NLLB-1.3B | LoRA | ~10GB | ★★ |
|
|
| 4 | Seed-X-PPO-7B | LoRA (권장 안 함) | ~16GB | ★★★ 까다로움 |
|
|
| 5 | **Qwen3-8B** | **LoRA** | **~16GB** | **★ 쉬움 (권장)** |
|
|
|
|
**4티어 Seed-X는 추가학습 대상으로 권하지 않습니다.** 이미 PPO(강화학습)까지 마친
|
|
모델이라 그 위에 SFT를 얹으면 기존 번역 품질이 무너지기 쉽습니다 (catastrophic forgetting).
|
|
Int4 양자화 가중치라 학습 자체도 번거롭습니다.
|
|
|
|
**추가학습을 할 거라면 5티어(Qwen3-8B)**, **VRAM이 부족하면 1~2티어(NLLB-600M 풀 파인튜닝)**
|
|
로 가는 게 맞습니다.
|
|
|
|
### 권장 하이퍼파라미터
|
|
|
|
연구에서 널리 쓰이는 설정입니다. `scripts/finetune_mt.py` 의 기본값이기도 합니다.
|
|
|
|
```
|
|
LoRA rank r = 16, alpha = 32, dropout = 0.05
|
|
대상 모듈: attention 의 q_proj, v_proj
|
|
learning rate = 2e-4 (LoRA) / 5e-5 (풀 파인튜닝)
|
|
epochs = 3 (데이터 2,000개 이상) / 10~20 (수백 개)
|
|
```
|
|
|
|
---
|
|
|
|
## 3. 어느 것부터 할지
|
|
|
|
```
|
|
1주차 용어집 300개 등록 → 이것만으로 충분한지 확인
|
|
2주차 번역 기록 켜고 실사용, 틀린 문장 수집
|
|
3주차 고친 문장 1,000개 모이면 LoRA 학습
|
|
```
|
|
|
|
**용어집만으로 만족스러우면 추가학습은 안 해도 됩니다.** 실제로 고유명사 오역이
|
|
체감 불만의 대부분입니다.
|
|
|
|
## 참고
|
|
|
|
- [Fine-Tuning NLLB-200 with LoRA on a 650-Sentence Corpus](https://medium.com/@meinnps/fine-tuning-nllb-200-with-lora-on-a-650-sentence-turkmen-english-corpus-082f68bdec71)
|
|
- [SemiAdapt / SemiLoRA: Efficient Domain Adaptation for Low-Resource MT (arXiv)](https://arxiv.org/pdf/2510.18725)
|
|
- [How to fine-tune a NLLB-200 model](https://cointegrated.medium.com/how-to-fine-tune-a-nllb-200-model-for-translating-a-new-language-a37fc706b865)
|