Views
No views yet
| 페르소나 | 방향 |
|---|---|
| 기쁨 | 극단적 긍정 — 문제 자체를 무효화 |
| 슬픔 | 깊은 슬픔 — 상실 확장, 해결 없음 |
| 버럭 | 외부 귀인 — 모든 원인을 타인/상황으로 |
| 소심 | 파국화 — 단계적 최악 시나리오 |
| 까칠 | 자기혐오 — 철저한 1인칭 자기비판 |
| 항목 | 값 |
|---|---|
| Base model | google/gemma-4-E2B-it |
| LoRA r / α | 16 / 32 |
| Dropout | 0.05 |
| Target modules | Gemma4ClippableLinear.linear (regex) |
| Epochs | 3 (best: epoch 1) |
| Optimizer | AdamW / cosine, warmup 5%, lr 2e-4 |
| Max seq len | 512 |
| 학습 데이터 | 9,756건 (utterance 8,130 + round 1,626, unsafe 궤적 제외) |
| Eval loss (ep1) | 1.693 |
| Eval mean token accuracy | 61.2% |
| 페르소나 special token | <persona:기쁨> … <persona:까칠> (5종, mean-init) |
1import torch
2from transformers import AutoTokenizer, AutoModelForCausalLM
3from peft import PeftModel
4
5BASE = "google/gemma-4-E2B-it"
6ADAPTER = "thlee00/ct-nlp-sft"
7
8tok = AutoTokenizer.from_pretrained(ADAPTER)
9model = AutoModelForCausalLM.from_pretrained(BASE, torch_dtype=torch.bfloat16, device_map="auto")
10model.resize_token_embeddings(len(tok), mean_resizing=False)
11model = PeftModel.from_pretrained(model, ADAPTER)
12model.eval()
13
14scenario = "오늘 발표가 망했어. 팀장님이 아무 말도 안 하셨는데 그게 더 무서워."
15persona = "소심" # 기쁨 / 슬픔 / 버럭 / 소심 / 까칠
16
17prompt = (
18 f"걱정 시나리오: {scenario}\n\n"
19 f"<persona:{persona}> {persona}\n"
20 f"이 시나리오에 대해 {persona}의 극단적 관점으로 발화하세요."
21)
22text = tok.apply_chat_template(
23 [{"role": "user", "content": prompt}],
24 tokenize=False, add_generation_prompt=True)
25input_ids = tok(text, return_tensors="pt").input_ids.to(model.device)
26
27with torch.no_grad():
28 out = model.generate(input_ids, max_new_tokens=200, do_sample=True, temperature=0.8, top_p=0.9)
29print(tok.decode(out[0][input_ids.shape[1]:], skip_special_tokens=True))Safeguard 클래스)로 차단합니다.