モデル別実行レシピ

韓国語LoRA SFT入門:データ・学習・評価

入力は韓国語のprompt/completion JSONLで、出力は保存済みadapterです。学習から除外した同じ質問でbaseと比較します。

QwenのモデルカードではQwen2.5-0.5B-Instructは0.49Bパラメーター、韓国語を含む29以上の言語に対応、Apache-2.0と記載され、Transformersの利用例もあります。この手順ではTRL SFTTrainerとPEFT LoraConfigを使い、q_proj、k_proj、v_proj、o_projを対象にします。サンプル行は形式例なので実務データに置き換え、文書単位でtrain/held-outを分けます。

問い合わせを毎回同じ形式で「返品・返金」などに分類したい場合があります。LoRA1ファインチューニングは入力例と望む回答から、その処理方法を学習させます。韓国語例をファイルにし、小型モデルを学習してadapterを保存し、同じ質問の学習前後を比べます。

実行条件と要点
  • LoRAはadapterパラメーターを学習し、QLoRAは量子化baseとadapter学習を組み合わせます。
  • モデル別のtarget modules、精度、chat templateをモデルカードと現行TRL/PEFT APIで確認します。
  • 同じheld-out質問で学習前後を比べ、RAG baselineも残します。

学習より検索が適する課題か先に決める

変化する文書や事実を検索して答える必要がある場合はRAG2が適します。同じ形式の回答を繰り返す、特定の韓国語タスクを一貫して分類する場合はファインチューニングが候補です。迷う場合は同じ質問で検索baselineと学習候補を評価します。

異なる絵柄のカード、チェック印のトークン、カード整理箱
学習前に検索とadapterのどちらを試すか基準を決めます。

Qwenモデルと学習データを準備する

実務で使う多様な韓国語例を集めますが、個人情報や機密文書は匿名化または除去します。重複・定型文を整理し、各例に入力、期待出力、失敗基準を記録します。同じ原文やテンプレートが学習と評価に混ざらないよう、ユーザーまたは文書単位で分割します。

学習データの1行
{"prompt":"<|im_start|>user\n문의 유형을 분류해 주세요: 주문한 상품을 반품하고 싶어요.<|im_end|>\n<|im_start|>assistant\n","completion":"환불·반품<|im_end|>"}
{"prompt":"<|im_start|>user\n다음 문장에서 날짜와 할 일을 JSON으로 정리해 주세요: 10월 20일까지 견적서를 보내 주세요.<|im_end|>\n<|im_start|>assistant\n","completion":"{\"date\":\"10월 20일\",\"task\":\"견적서 보내기\"}<|im_end|>"}
2行を`train.jsonl`に保存します。形式を学ぶための実習データです。

実習には小型Qwen2.5-0.5B-Instructを使います。0.49B、韓国語を含む29以上の言語、Apache-2.0、Transformers対応で、データとadapter保存の準備例に使えます。実用モデルは最新カードの言語・ライセンス・PEFT target moduleを確認します。Qwen3.5-0.8Bは多言語のハイブリッド画像言語モデルなので、このテキストLoRA設定を移す前に対応する学習方法を確認します。

学習環境とライブラリをインストール
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U 'trl[peft]' datasets accelerate
初回実行ではライブラリとモデル重みを取得します。Windowsでは仮想環境の有効化コマンドを変更してください。
机上のレポートを虫眼鏡で確認しながらメモを取る人
原文の重複が評価セットに混ざらないよう分けます。

TRL設定を小さく始めて結果を評価する

train_lora.pyは、まず学習ファイルに含まれないheld-out質問へのbase応答を出力し、同じtokenizer chat templateでTRL学習を始めます。SFTConfigは出力先、最大長512、batch 1、gradient accumulation 8、2 epochs、LoRA学習率2e-4を指定します。

学習が終わると、adapterとtokenizerはoutput/adapterに保存されます。held-out質問に再度回答させて結果を比較し、学習ログのlossと実際のメモリ使用量も記録して、held-out回答の品質を確認します。

train_lora.py: baseline、LoRA SFT、保存、adapter比較
from datasets import load_dataset
from peft import LoraConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import SFTConfig, SFTTrainer

MODEL = "Qwen/Qwen2.5-0.5B-Instruct"
QUESTION = "문의 유형을 분류해 주세요: 결제한 물건을 돌려보내고 결제 취소를 요청하고 싶습니다."  # held-out wording; expected label: 환불·반품
tokenizer = AutoTokenizer.from_pretrained(MODEL)

def answer(model, question):
    messages = [{"role": "user", "content": question}]
    inputs = tokenizer.apply_chat_template(
        messages, add_generation_prompt=True, tokenize=True,
        return_dict=True, return_tensors="pt"
    ).to(model.device)
    output = model.generate(**inputs, max_new_tokens=80, do_sample=False)
    return tokenizer.decode(output[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True)

base = AutoModelForCausalLM.from_pretrained(MODEL, device_map="auto", torch_dtype="auto")
print("base:", answer(base, QUESTION))
del base

dataset = load_dataset("json", data_files="train.jsonl", split="train")
trainer = SFTTrainer(
    model=MODEL,
    args=SFTConfig(
        output_dir="output/checkpoints",
        max_length=512,
        num_train_epochs=2,
        per_device_train_batch_size=1,
        gradient_accumulation_steps=8,
        learning_rate=2e-4,
        logging_steps=1,
        save_strategy="epoch",
        report_to="none",
        eos_token=tokenizer.eos_token,
    ),
    train_dataset=dataset,
    processing_class=tokenizer,
    peft_config=LoraConfig(
        r=8, lora_alpha=16, lora_dropout=0.05, bias="none",
        task_type="CAUSAL_LM",
        target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    ),
)
trainer.train()
trainer.save_model("output/adapter")
tokenizer.save_pretrained("output/adapter")
print("adapter:", answer(trainer.model, QUESTION))
`train_lora.py`に保存し、次のコマンドを実行します。実際の学習では多様な例を集め、学習用と評価用に分けてください。
両方のファイルを保存して学習を開始
python train_lora.py

consoleにはbase:とadapter:に続いて生成結果が表示されます。正常終了するとoutput/adapter/adapter_config.jsonとadapter重みファイルができます。

CUDA3メモリ不足ならbatch 1のままmax_lengthを短くするか、より大きいGPU4を使います。モデルを読み込めない場合はTransformersを確認します。Qwen2.5のカードによると4.37.0未満ではKeyError: 'qwen2'が発生します。

held-out質問の正確さ、形式、韓国語の自然さを採点表で確認し、変化する事実にはRAGと比較します。

書類の束の横で2台の小型装置がページを出力し、印刷物が並ぶ様子
held-out品質とVRAM・遅延を一緒に記録します。

用語の注釈

  1. LoRA — 基本モデルの動作を調整する小さな追加の重みを学習・適用する方法です。基本モデルとアダプターを組み合わせ、画風の調整や少ないステップでの生成などに使います。

    本文に戻る
  2. 検索拡張生成 — 質問に関連する資料を検索してモデル入力に加え、その文脈をもとに回答を生成する方式です。

    本文に戻る
  3. CUDA — NVIDIA GPUで汎用計算を行うソフトウェア基盤です。

    本文に戻る
  4. GPU — 多くの計算を並列に処理するプロセッサーです。AIモデルの実行ではモデル計算を担います。

    本文に戻る

よくある質問

この記事で最初に確認すべきことは何ですか?
QwenのモデルカードではQwen2.5-0.5B-Instructは0.49Bパラメーター、韓国語を含む29以上の言語に対応、Apache-2.0と記載され、Transformersの利用例もあります。この手順ではTRL `SFTTrainer`とPEFT `LoraConfig`を使い、`q_proj`、`k_proj`、`v_proj`、`o_proj`を対象にします。サンプル行は形式例なので実務データに置き換え、文書単位でtrain/held-outを分けます。
必要なメモリはどのくらいですか?
学習が終わると、adapterとtokenizerは`output/adapter`に保存されます。held-out質問に再度回答させて結果を比較し、学習ログのlossと実際のメモリ使用量も記録して、held-out回答の品質を確認します。
条件と出典はどこで確認できますか?
実習には小型Qwen2.5-0.5B-Instructを使います。0.49B、韓国語を含む29以上の言語、Apache-2.0、Transformers対応で、データとadapter保存の準備例に使えます。実用モデルは最新カードの言語・ライセンス・PEFT target moduleを確認します。Qwen3.5-0.8Bは多言語のハイブリッド画像言語モデルなので、このテキストLoRA設定を移す前に対応する学習方法を確認します。