TimeSorter β€” ν•œκ΅­μ–΄ ν•  일 μš°μ„ μˆœμœ„ μ •λ ¬ λΉ„μ„œ

Qwen3.5-4B 기반 LoRA μ–΄λŒ‘ν„° λͺ¨μŒ. μ‚¬μš©μžκ°€ μ œμΆœν•œ ν•  일 λͺ©λ‘μ„ κΈ΄κΈ‰λ„Β·μ€‘μš”λ„Β·μ˜μ‘΄μ„±Β·μ‹œκ°„ μ œμ•½ 4μΆ•μœΌλ‘œ 채점해 μš°μ„ μˆœμœ„λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

GitHub wandb


λͺ¨λΈ μ„€λͺ…

슀마트폰·PCμ—μ„œ "였늘 ν•  일"을 μž…λ ₯ν•˜λ©΄ AIκ°€ λ§₯락을 이해해 μ‹€ν–‰ μˆœμ„œλ₯Ό μ œμ•ˆν•˜λŠ” 개인 λΉ„μ„œ μ½”μ–΄ λͺ¨λΈμž…λ‹ˆλ‹€.

λ‹¨μˆœ ν‚€μ›Œλ“œ 정렬이 μ•„λ‹Œ, 페λ₯΄μ†Œλ‚˜(직μž₯인·학생·뢀λͺ¨ λ“±)와 4κ°€μ§€ 좕을 기반으둜 각 νƒœμŠ€ν¬λ₯Ό 1–5점으둜 μ±„μ ν•˜κ³  κ·Έ κ·Όκ±°λ₯Ό ν•¨κ»˜ μ œμ‹œν•©λ‹ˆλ‹€.

μž…λ ₯: "μž„μ› λ³΄κ³ μ„œ 마감(내일), νŒ€ 회의(μ˜€ν›„ 2μ‹œ), 점심 약속, 메일 λ‹΅μž₯ 3건"

좜λ ₯:
1) μž„μ› λ³΄κ³ μ„œ 마감  [κΈ΄κΈ‰5Β·μ€‘μš”5·의쑴4Β·μ‹œκ°„2] β€” 내일 마감, 핡심 업무
2) νŒ€ 회의(μ˜€ν›„ 2μ‹œ) [κΈ΄κΈ‰4Β·μ€‘μš”4·의쑴3Β·μ‹œκ°„4] β€” κ³ μ • μ‹œκ°, 후속 λΈ”λ‘œν‚Ή
3) 메일 λ‹΅μž₯ 3건     [κΈ΄κΈ‰4Β·μ€‘μš”3·의쑴2Β·μ‹œκ°„1] β€” κΈ΄κΈ‰ν•˜λ‚˜ κ³ μ • μ‹œκ° μ—†μŒ
4) 점심 약속         [κΈ΄κΈ‰2Β·μ€‘μš”2·의쑴1Β·μ‹œκ°„3] β€” μœ μ—° μ‘°μ • κ°€λŠ₯

μ–΄λŒ‘ν„° λͺ©λ‘

폴더 μŠ€ν‚€λ§ˆ ν•™μŠ΅ ν™˜κ²½ train_loss acc@ep5 JSON 좜λ ₯
sft_mac_v1/ v1 자유 ν…μŠ€νŠΈ Mac MPS 1.295 76.5% β€”
sft_mac_v2/ v2 4μΆ• JSON Mac MPS 0.641 90.0% βœ“
sft_rtx12g_4b_v1/ v1 자유 ν…μŠ€νŠΈ RTX 12GB β€” β€” β€”
sft_rtx12g_4b_v2/ v2 4μΆ• JSON RTX 12GB β€” β€” βœ“
sft_rtx12g_4b_v2_mlx/ v2 4μΆ• JSON RTX β†’ MLX λ³€ν™˜ β€” β€” βœ“
dpo_rtx12g_4b/ v2 4μΆ• JSON RTX 12GB DPO β€” β€” βœ“

ꢌμž₯: sft_mac_v2/ (Mac μž¬ν˜„ κ°€λŠ₯) λ˜λŠ” sft_rtx12g_4b_v2/ (RTX 졜고 μ„±λŠ₯)


좜λ ₯ ν˜•μ‹ (v2 JSON)

{
  "tasks": [
    {"id": 1, "text": "μž„μ› λ³΄κ³ μ„œ 마감"},
    {"id": 2, "text": "νŒ€ 회의(μ˜€ν›„ 2μ‹œ)"}
  ],
  "priority_order": [1, 2],
  "scores": [
    {
      "task_id": 1,
      "urgency": 5,
      "importance": 5,
      "dependency": 4,
      "time_constraint": 2,
      "reason": "내일 마감, 고객사 핡심 업무"
    },
    {
      "task_id": 2,
      "urgency": 4,
      "importance": 4,
      "dependency": 3,
      "time_constraint": 4,
      "reason": "μ˜€ν›„ κ³ μ • μ‹œκ°, 후속 μž‘μ—… μž…λ ₯"
    }
  ]
}

μ‚¬μš©λ²•

from peft import PeftModel
from transformers import AutoTokenizer, AutoModelForCausalLM

base_model = "Qwen/Qwen3.5-4B"
adapter_path = "pieroot/TimeSorter-qwen3-lora/sft_mac_v2"  # λ˜λŠ” μ›ν•˜λŠ” μ–΄λŒ‘ν„°

tokenizer = AutoTokenizer.from_pretrained(base_model)
model = AutoModelForCausalLM.from_pretrained(base_model, torch_dtype="auto")
model = PeftModel.from_pretrained(model, adapter_path)

system_prompt = """당신은 ν•œκ΅­μ–΄ 일정 관리 μ „λ¬Έ AIμž…λ‹ˆλ‹€.
μ‚¬μš©μžκ°€ μ œκ³΅ν•œ ν•  일 λͺ©λ‘μ„ λΆ„μ„ν•˜μ—¬ λ‹€μŒ 4κ°€μ§€ μΆ•μœΌλ‘œ 각 νƒœμŠ€ν¬λ₯Ό 1-5점으둜 ν‰κ°€ν•˜κ³ ,
μš°μ„ μˆœμœ„λ₯Ό JSON ν˜•μ‹μœΌλ‘œ 좜λ ₯ν•˜μ„Έμš”.

평가 μΆ•:
- urgency (긴급도): 즉각적인 처리 ν•„μš”μ„±
- importance (μ€‘μš”λ„): λͺ©ν‘œ 달성에 λŒ€ν•œ 기여도
- dependency (μ˜μ‘΄μ„±): λ‹€λ₯Έ νƒœμŠ€ν¬ 차단 μ—¬λΆ€
- time_constraint (μ‹œκ°„ μ œμ•½): νŠΉμ • μ‹œκ°/마감 κ³ μ • μ—¬λΆ€"""

user_input = "λ³΄κ³ μ„œ 마감(내일), νŒ€ 회의(μ˜€ν›„ 2μ‹œ), 메일 λ‹΅μž₯ 3건, 점심 약속"

messages = [
    {"role": "system", "content": system_prompt},
    {"role": "user", "content": f"페λ₯΄μ†Œλ‚˜: 직μž₯인\n\nν•  일 λͺ©λ‘:\n{user_input}"}
]

text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=512, temperature=0.1)
print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))

λ˜λŠ” CLI둜:

git clone https://github.com/jung-geun/TimeSorter
cd TimeSorter
make setup-mac  # λ˜λŠ” setup-dgx

uv run python -m timesorter.infer \
  --adapter pieroot/TimeSorter-qwen3-lora/sft_mac_v2 \
  --schema-version v2 \
  --persona "직μž₯인" \
  --prompt "λ³΄κ³ μ„œ 마감(내일), νŒ€ 회의(μ˜€ν›„ 2μ‹œ), 메일 λ‹΅μž₯ 3건"

ν•™μŠ΅ μ„€μ •

ν•­λͺ© κ°’
베이슀 λͺ¨λΈ Qwen/Qwen3.5-4B
μ–΄λŒ‘ν„° LoRA (r=8, alpha=16, dropout=0.05)
ν•™μŠ΅ 방식 SFT (TRL SFTTrainer) β†’ DPO
데이터셋 scheduler_v2_combined (10,958μƒ˜ν”Œ 쀑 300 μƒ˜ν”Œ)
에폭 5
ν•™μŠ΅λ₯  2e-5, cosine decay
배치 (eff) 8 (bs=1 Γ— grad_accum=8)
max_seq_length 1024

v2 ν•™μŠ΅ 컀브 (Mac MPS, sft_mac_v2)

epoch loss token_accuracy
0.13 1.541 66.5%
1.00 0.993 77.6%
1.59 0.585 87.0%
2.00 0.534 88.1%
3.00 0.427 89.7%
5.00 0.415 90.0%

데이터셋

  • scheduler_v2_combined (10,958ν–‰): GPT-4o둜 μƒμ„±ν•œ ν•œκ΅­μ–΄ 일정 + 4μΆ• JSON 응닡
  • nvidia/Nemotron-Personas-Korea: μ§μ—…Β·μ—°λ ΉΒ·λΌμ΄ν”„μŠ€νƒ€μΌλ³„ 페λ₯΄μ†Œλ‚˜ λ‹€μ–‘ν™”
  • dpo_pairs_v2: μ„ ν˜Έ/λΉ„μ„ ν˜Έ 응닡 쌍 (DPO ν•™μŠ΅μš©)

λΌμ΄μ„ μŠ€

Apache 2.0 (베이슀 λͺ¨λΈ Qwen3.5-4B λΌμ΄μ„ μŠ€ μ€€μˆ˜)


인용

@misc{timesorter2025,
  author    = {jung-geun},
  title     = {TimeSorter: Korean Task Priority Sorting via Qwen3.5-4B LoRA},
  year      = {2025},
  publisher = {Hugging Face},
  url       = {https://huggingface.co/pieroot/TimeSorter-qwen3-lora}
}
Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for pieroot/TimeSorter-qwen3-lora

Finetuned
Qwen/Qwen3.5-4B
Finetuned
(280)
this model

Dataset used to train pieroot/TimeSorter-qwen3-lora

Evaluation results