--- license: apache-2.0 language: - ko base_model: Qwen/Qwen2.5-7B-Instruct datasets: - nvidia/Nemotron-Personas-Korea pipeline_tag: text-generation tags: - korean - persona - role-play - survey-simulation - distillation - qlora --- # kor-persona-survey-7b **Built with Qwen.** *[한국어 요약이 아래에 있습니다 / Korean summary below]* A 7B model distilled to answer survey and preference questions **as a specific Korean persona**, given a structured persona profile. Fine-tuned from Qwen2.5-7B-Instruct via QLoRA on synthetic (persona, question, response) triplets labeled by a Qwen2.5-72B-Instruct teacher, using persona profiles from [nvidia/Nemotron-Personas-Korea](https://huggingface.co/datasets/nvidia/Nemotron-Personas-Korea). **Research question**: *How much of a 72B teacher's persona-conditioned survey-response capability can be transferred to a 7B student through synthetic-triplet distillation alone?* ## What it does Input: a Korean persona profile (demographics + narrative fields) and a survey/balance-game question. Output: a structured JSON response **in character**: ```json {"choice": "짬뽕", "confidence": 0.8, "reason": "얼큰한 국물 없이는 식사가 허전해서"} ``` Intended for: persona-conditioned response simulation research, synthetic survey data generation, Korean role-play agent studies. ## How to use ```python from transformers import AutoModelForCausalLM, AutoTokenizer model_id = "dobstudio/kor-persona-survey-7b" tok = AutoTokenizer.from_pretrained(model_id) model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto") persona = """- 성별/나이: 여성, 58세 - 지역: 부산광역시 - 직업: 식당 운영 - 음식 성향: 매운 음식을 즐기며 직접 담근 김치에 자부심이 있음""" question = "짜장면 vs 짬뽕, 하나만 고른다면?" messages = [ {"role": "system", "content": f"당신은 아래 인물입니다. 이 인물의 입장에서 설문에 답하세요.\n{persona}\n\n반드시 JSON으로만 답하세요: {{\"choice\": ..., \"confidence\": 0.0~1.0, \"reason\": \"한 줄 이유\"}}"}, {"role": "user", "content": question}, ] inputs = tok.apply_chat_template( messages, add_generation_prompt=True, return_tensors="pt", return_dict=True ).to(model.device) out = model.generate(**inputs, max_new_tokens=128) print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)) ``` With vLLM (recommended for batch simulation): ```python from vllm import LLM, SamplingParams llm = LLM(model="dobstudio/kor-persona-survey-7b", max_model_len=2048) outputs = llm.chat([messages], SamplingParams(temperature=0.7, max_tokens=128)) print(outputs[0].outputs[0].text) ``` ## Training | | | |---|---| | Base model | Qwen/Qwen2.5-7B-Instruct (Apache-2.0) | | Method | QLoRA SFT (4-bit NF4, LoRA r=16 / α=32, all linear layers, loss on response only), 2 epochs, effective batch 48, cosine lr 1e-4 | | Teacher | Qwen/Qwen2.5-72B-Instruct-AWQ — generated response labels; disclosed for transparency | | Training data | 27,999 synthetic triplets (28,571 after quality filtering, 95.2% pass rate from 30,000 raw): (persona from Nemotron-Personas-Korea, question from a curated 515-question bank, teacher-labeled response). Question topics: food, lifestyle, consumption, travel, leisure, work, values, digital — **politically/socially sensitive topics excluded** | | Data release | An 800-triplet sample (16 questions × 50 distinct personas each): https://huggingface.co/datasets/dobstudio/kor-persona-survey-sample. The full triplet set, question bank, and the population-aggregation pipeline are not released | | Hardware | 4× RTX 3090 (24GB); training took ~4 h | ## Evaluation All Model-level metrics are measured on **held-out questions never seen in training**, and are reproducible with the released model and the prompt format above. Protocol: 51 held-out questions × 20 evaluation personas (disjoint from training personas), temperature 0.7 with fixed per-request seeds. ### Model-level — standalone model metrics (reproducible) | Metric | Base Qwen2.5-7B | **This model** | Teacher 72B | |---|---|---|---| | Format compliance (valid JSON + exact option match) | 95.5% | **98.5%** | 97.0% | | Teacher agreement (held-out) | 72.3% | **79.4%** | 96.1%¹ | | Response consistency (5-run majority reproducibility) | 98.7% | 97.6% | — | | Persona sensitivity (TV distance vs. no-persona baseline) | 0.356 | **0.356** | — | | Position bias (first-option preference)² | — | **+1.7%** | — | | Age-conditioning sensitivity (contrastive pairs)³ | — | **+20.8%p** | — | ¹ Teacher *self*-agreement across two independent samplings — the effective ceiling for teacher agreement under temperature 0.7. The distilled model reaches **82.6% of that ceiling** (79.4 / 96.1), up from 75.2% before distillation. ² Estimated as `(first-option share, normal order + first-option share, flipped order − 1) / 2` over held-out questions; 0 = unbiased. Choice consistency under option-order flip is 90.7%, statistically at the sampling-noise floor (91.4%). ³ Flipping only the age field (27↔67) in demographics-only profiles changes the chosen option on 29.4% of questions vs. an 8.6% same-profile resampling noise floor — net +20.8%p of genuine age conditioning. ### Scaling ablation We verified that the released configuration saturates this method: doubling the training data (56k triplets from 6,000 personas) left held-out teacher agreement unchanged (79.3%) despite improving validation loss (0.391 → 0.357), and a third epoch moved it only within sampling error (80.1%, n≈980). Closing the remaining gap to the teacher self-agreement ceiling likely requires methodological changes (multi-sample distribution distillation, preference optimization) rather than more of the same data. ### System-level accuracy — not measured Population-level accuracy (e.g., MAE of predicted answer distributions against real Korean survey results) is **not measured in this release**. All reported metrics quantify fidelity to the teacher and standalone model behavior only; no claim is made about agreement with actual public opinion. ## Limitations and ethical considerations - **Synthetic personas are not real people.** Outputs simulate what a fictional profile *might* answer based on LLM priors — they are not measurements of actual Korean public opinion and must not be presented as such. - **Joint-distribution distortion in the source data.** Nemotron-Personas-Korea matches real Korean marginal distributions (age, sex, occupation) but its joint distributions (e.g., age×occupation×region) deviate from reality (see arXiv:2606.12433). Segment-level conclusions drawn from raw persona samples are unreliable without statistical correction. - **Stereotype risk.** The teacher may role-play personas stereotypically, and distillation inherits this. Persona-sensitivity metrics partially quantify conditioning, not fairness. - **Domain bound.** Trained on non-sensitive preference/lifestyle questions. Behavior on political, medical, or otherwise sensitive questions is untested and out of scope. - Outputs are in Korean; other languages are untested. ## Attribution & license - Model weights: **Apache-2.0**. **Built with Qwen.** - Persona profiles: [nvidia/Nemotron-Personas-Korea](https://huggingface.co/datasets/nvidia/Nemotron-Personas-Korea), **CC BY 4.0** — © NVIDIA, used with attribution as required. - Base model: Qwen/Qwen2.5-7B-Instruct (**Apache-2.0**), Alibaba Cloud. - Teacher model: Qwen/Qwen2.5-72B-Instruct-AWQ (**Qwen LICENSE**), Alibaba Cloud — its outputs were used to train this model, with the "Built with Qwen" notice displayed per that license. --- ## 한국어 요약 한국인 가상 인물 프로필을 주면 **그 인물의 입장에서** 설문/밸런스게임 문항에 구조화된 JSON으로 답하는 7B 모델입니다. Qwen2.5-72B 교사 모델이 생성한 (페르소나, 문항, 응답) 합성 데이터로 Qwen2.5-7B를 QLoRA 증류했습니다. - **연구 질문**: 72B의 페르소나 조건부 응답 능력이 증류만으로 7B에 얼마나 이식되는가 - **평가**: 학습에 쓰지 않은 문항(held-out)에서 포맷 준수율, 교사 일치율, 응답 일관성, 페르소나 감수성을 측정 — 공개된 모델만으로 재현 가능 - **한계**: 가상 인물의 응답은 실제 여론이 아닌 추정이며, 원본 데이터의 결합분포 왜곡으로 세부 집단 분석에는 통계 보정이 필요합니다. 민감 주제는 학습에서 제외했습니다. - 모집단 집계 파이프라인(층화 표본추출·사후층화 가중)은 비공개이며, 본 공개물은 개인 페르소나 역할극 기능만 제공합니다. ---