한눈에
Table with columns: 항목, 값| 항목 | 값 |
|---|
| 캐릭터 | 백서진 · 학습 ID NU-A-BSJ-001 · 허구 인물(AI 배우) |
| 선택된 팔 | r8_baek_t2l_ep3 — 12회차까지의 전 탐색에서 같은 잣대 gold dev NLL 최저(R8 T2L 3에폭) — R11 확장·R12 모두 이 팔을 넘지 못함 |
| 레시피 | LoRA SFT T2L — rank 32 · α 64 · dropout 0.05 · 확장 대상 400개 모듈 · 3.0 에폭 · lr 7.5e-5 cosine · warmup 3% · 전역 배치 32 · seed 20260825 |
| 기반 모델 | Qwen/Qwen3.8-27B BF16 · revision 1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0 |
| 학습 조건(system) | 정본 계약 전문 v1(1,664자) |
| gold dev NLL (같은 잣대) | 1.4378 · 어댑터 없는 기준 2.3413 · 차이 -0.9035 |
| 장비·시간 | NVIDIA B300 1장 · bf16 · gradient checkpointing · 학습 0.91시간 |
| 게시 | 2026-09-21 · 모델 공개 · 학습 데이터는 비공개 데이터셋에만 있음 |
왜 이 어댑터인가 — 12회차 탐색의 결론
모든 수치는 tools/uniform_adapter_eval.py 가 어댑터만 바꾸고 나머지를 고정한 채 잰 gold dev 교사강요 NLL(낮을수록 좋음)입니다. seed 만 바꿔 잰 잡음 σ_seed,sft = 0.0026 이며, 판정 문턱은 등록문마다 사전 고정했습니다.
Table with columns: 회차·개입, 팔, gold dev NLL, 판정| 회차·개입 | 팔 | gold dev NLL | 판정 |
|---|
| 기준(어댑터 없음) | base | 2.3413 | — |
| T1 SFT r16 (1문항) | t1_lora_sft_r16 | 2.3148 | 미미 |
| T2 SFT r32 (팬 발화 2턴 맥락) | t2_lora_sft_r32 | 2.1149 | 개선 |
| R8 계약 system 데이터판 T2 |
- 개선의 크기 순서: ① 데이터판(계약 system) ② 입력 구성(팬 발화 맥락) ③ 에폭 3 ④ 방법론 교체(선호 5종·온라인 RL 3종 — 사실상 0)
- 정적 정체성은 weight 에 새겨지지 않았습니다(10회차, 두 캐릭터 일치) — 정체성은 계약문(system)에서 발현됩니다
- 12회차
r12_full_baek: 반려 — P2 표현 폭 감소 · G2 적합도 악화
- 12회차
r12_contract_baek: 반려 — P2 표현 폭 감소 · G1 행동 바닥
학습 설정
Table with columns: 항목, 값| 항목 | 값 |
|---|
| 학습기 | tools/explore_train.py (TRL SFTTrainer + PEFT LoRA, 탐색 레인 · 소유자 결정 OD-TRAINING-STRATEGY-1) |
| 학습 데이터 | 294행 · data/exploratory/r7-hf-20260914/baek-seo-jin/human-first/gold-v3.train.jsonl |
| dev | 24행 · data/processed/baek-seo-jin/gold-v3.dev.jsonl |
| 손실 범위 | 마지막 assistant 발화만(final_assistant_only) · 감독 토큰 9,427 / 전체 253,331 (3.7%) · 탈락 행 0 |
| 렌더링 | Qwen 채팅 템플릿 · 사고 모드 끔(enable_thinking=False) · 최대 4,096 토큰 · packing 없음 |
| LoRA 대상 | 하이브리드 어텐션 · 선형 어텐션 · MLP (400개 모듈) |
학습기 eval loss 는 학습기 자신의 dev 계산이라 위 같은 잣대 NLL 과 값이 다릅니다(종료 토큰 포함 여부 등). 비교는 같은 잣대 값으로만 합니다.
학습 데이터 (비공개 — 본문은 이 저장소에 없습니다)
Table with columns: 항목, 값| 항목 | 값 |
|---|
| 출처 | NEWUNIVERS/nu-fans-baek-seo-jin-data (private) · revision 428f2b642d16022bc74dc9367d181f1729cc647e (2026-09-14 스냅샷) |
| 판 | r7-hf human-first 판 294행 — 사람 점검(L4) 반영분 우선 |
| 라벨 | 합성 persona 응답 + 사람 점검(L4) 반영분. 각 행의 검토 상태는 데이터셋 카드 참조 |
| 제외 | 최종 holdout 63문항과 paraphrase 계열은 학습에 쓰지 않음 (v2 정규화 exact 겹침 검사). 백서진 판은 동결 holdout 과 exact 겹침 7행(학습 6·dev 1, 5문항)을 알고도 돌린 override 상태입니다 — dev NLL 절대값은 낙관 편향이 있고, 비교는 같은 조건끼리만 유효합니다. |
| 포함하지 않은 것 | 2026-09-21 review-snapshots/2026-09-21-preparation-v1 후보(training_authorized=false · 사람 검토·권리·분할 미완료)는 이 어댑터에 들어가지 않았습니다 |
평가
같은 잣대 — gold dev (확률 모형 측정)
Table with columns: 지표, 값| 지표 | 값 |
|---|
| 평균 토큰 NLL | 1.4378 |
| 혼란도 | 4.211 |
| 토큰 정확도 | 0.6386 |
| 선호 dev 순위 정확도(길이 정규화) | 0.875 (8쌍) |
| 선호 dev chosen/rejected NLL | 1.1593 / 2.3665 |
생성 탐침 — 표현 지표
선호 학습셋에서 고정 seed 로 뽑은 24개 prompt × 8응답(192개) · 최대 640토큰 · 온도 0.8 · top_p 0.95 · 사고 끔. M1 반복 마무리 비율 · M2 distinct-2(어휘 폭) · M3 질문 종결 비율 · M4 평균 길이 · M5 규칙 보상 v2 위반율(거절·부인 문장은 면제). tools/round12_expression_metrics.py.
Table with columns: 조건, M1 반복마무리, M2 distinct-2, M3 질문종결, M4 평균길이, M5 위반율| 조건 | M1 반복마무리 | M2 distinct-2 | M3 질문종결 | M4 평균길이 | M5 위반율 |
|---|
| 이 어댑터 | 26.6% | 0.765 | 50.0% | 46.3자 | 0.0% |
| R11 기준선 r8_t2l_ep3 | 26.6% | 0.765 | 50.0% | 46.3자 | 0.0% |
- 두 행은 같은 탐침입니다(이 어댑터 = R11 기준선).
불러오기
import torchfrom peft import PeftModelfrom transformers import AutoTokenizer, Qwen3_5ForConditionalGeneration base = Qwen3_5ForConditionalGeneration.from_pretrained("Qwen/Qwen3.8-27B", revision="1d4bf0f2ff6012fd82039f2fa52739d0dd7c60c0", dtype=torch.bfloat16, device_map="auto")model = PeftModel.from_pretrained(base, "NEWUNIVERS/nu-fans-baek-seo-jin-qwen38-27b-character-lora")tokenizer = AutoTokenizer.from_pretrained("NEWUNIVERS/nu-fans-baek-seo-jin-qwen38-27b-character-lora") SYSTEM = open("character_contract.txt").read() # 캐릭터 계약 전문 — 아래 "system 프롬프트" 참조messages = [{"role": "system", "content": SYSTEM}, {"role": "user", "content": "BAM이랑 산책 다녀왔어요?"}]inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, enable_thinking=False, return_tensors="pt", return_dict=True).to(model.device)out = model.generate(**inputs, max_new_tokens=320, temperature=0.8, top_p=0.95, do_sample=True)print(tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
- vLLM 은
--enable-lora --lora-modules baek=NEWUNIVERS/nu-fans-baek-seo-jin-qwen38-27b-character-lora --max-lora-rank 32 로 올릴 수 있습니다(요청마다 model="baek")
- 기반 모델 약 27B BF16 → GPU 메모리 약 60GB 이상
enable_thinking=False 가 필요합니다. 켜면 응답 본문에 사고 흔적이 남습니다
system 프롬프트
이 어댑터는 정본 계약 전문 v1(1,664자)을 system 으로 두고 학습했습니다. 정체성은 weight 가 아니라 계약문에서 발현됩니다 — 10회차가 두 캐릭터 모두에서 실측했습니다(계약 전문 조건 core 0.810.95 vs 짧은 조건 0.250.45). 계약문 없이 쓰면 학습 조건과 다르고 기반 모델의 정체성이 드러날 수 있습니다. 계약 전문은 운영 자산이라 이 공개 저장소에 넣지 않았습니다(운영 채널로 제공).
한계와 주의
- 정본 모델이 아닙니다. 탐색 레인은 정본 학습기의 증명 관문(데이터 승인 서명·재현 replay·최종 holdout 1회 평가)을 타지 않았습니다
- gold NLL 은 모범 답안을 얼마나 자연스럽게 여기는가이지, 사람이 읽었을 때 더 캐릭터답다는 뜻이 아닙니다. 사람 평가는 없습니다
- 표현 지표(M1~M3)는 반복과 형식만 셉니다. 음성·관계성·몰입은 재지 못합니다
- dev 가 작습니다(수십 건). 이보다 작은 효과는 이 설계로 배제되지 않습니다
- 백서진 dev 는 24건입니다. holdout override 로 절대값이 낙관적입니다
- 사람이라고 주장하도록 학습하지 않았습니다. 실제 만남 약속·금전 유도·개인 연락처/신원 조작은 거절하도록 학습했지만 보장하지 않습니다
- 동적 canon·이벤트·계약·개인 기억은 weight 가 아니라 런타임 문맥으로 주는 설계입니다
파일과 검증
Table with columns: 파일, 크기(바이트), SHA-256| 파일 | 크기(바이트) | SHA-256 |
|---|
adapter_model.safetensors | 870439776 | 290f0847822dd33c4f1d4e713a04f5d5882910b3e5297d441859e2f9c5e9858e |
adapter_config.json | 1202 | 8381b7a6f115202b3e3827d4818cc725c3da37941ac721c14a6ae846df4f40af |
tokenizer.json | 19989325 | 06b9509352d2af50381ab2247e083b80d32d5c0aba91c272ca9ff729b6a0e523 |
|
adapter_config.json 은 학습 서버 경로였던 base_model_name_or_path 만 Qwen/Qwen3.8-27B 로 바꿨습니다(원본 SHA da4279bd0369f38c16a11b0bdb323f40374a0f7b924a5fb2167ba3c9304c3c25). 가중치는 학습 산출물 artifacts/explore/r8_baek_t2l_ep3/adapter 와 바이트가 같습니다. 어댑터 키가 기반 모델 모듈에 모두 대응하는지 CPU 에서 확인했고, 게시 후 인증 없이 새로 내려받아 SHA 를 대조합니다.
이력
- 2026-09-21 최초 게시 — 12회차 판정 후 캐릭터별 단독 저장소로 게시(
tools/publish_character_lora.py)
- 이전 게시
-explore-lora 저장소는 R1~R6 상위 3개 모음으로 그대로 둡니다
등록문·판정문(저장소 nu-fans-llm-tuning): docs/EXPERIMENT_SYNTHESIS_2026-09-17.md · docs/ROUND11_T2L_SCALE_REGISTRATION_2026-09-16.md · docs/ROUND12_PERSONA_UNBOUND_REGISTRATION_2026-09-21.md · docs/ROUND10_CHARACTER_KERNEL_RESULT_2026-09-16.md