스마트폰·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)
json
1{2"tasks":[3{"id":1,"text":"임원 보고서 마감"},4{"id":2,"text":"팀 회의(오후 2시)"}5],6"priority_order":[1,2],7"scores":[8{9"task_id":1,10"urgency":5,11"importance":5,12"dependency":4,13"time_constraint":2,14"reason":"내일 마감, 고객사 핵심 업무"15},16{17"task_id":2,18"urgency":4,19"importance":4,20"dependency":3,21"time_constraint":4,22"reason":"오후 고정 시각, 후속 작업 입력"23}24]25}
사용법
python
1from peft import PeftModel
2from transformers import AutoTokenizer, AutoModelForCausalLM
34base_model ="Qwen/Qwen3.5-4B"5adapter_path ="pieroot/TimeSorter-qwen3-lora/sft_mac_v2"# 또는 원하는 어댑터67tokenizer = AutoTokenizer.from_pretrained(base_model)8model = AutoModelForCausalLM.from_pretrained(base_model, torch_dtype="auto")9model = PeftModel.from_pretrained(model, adapter_path)1011system_prompt ="""당신은 한국어 일정 관리 전문 AI입니다.
12사용자가 제공한 할 일 목록을 분석하여 다음 4가지 축으로 각 태스크를 1-5점으로 평가하고,
13우선순위를 JSON 형식으로 출력하세요.
1415평가 축:
16- urgency (긴급도): 즉각적인 처리 필요성
17- importance (중요도): 목표 달성에 대한 기여도
18- dependency (의존성): 다른 태스크 차단 여부
19- time_constraint (시간 제약): 특정 시각/마감 고정 여부"""2021user_input ="보고서 마감(내일), 팀 회의(오후 2시), 메일 답장 3건, 점심 약속"2223messages =[24{"role":"system","content": system_prompt},25{"role":"user","content":f"페르소나: 직장인\n\n할 일 목록:\n{user_input}"}26]2728text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)29inputs = tokenizer(text, return_tensors="pt")30outputs = model.generate(**inputs, max_new_tokens=512, temperature=0.1)31print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))