doongyeon/gemma-4-E2B-chimchak-ko
026
Gemma-4-E2B 침착맨 풍 한국어 토론 LLM (v3.5)
google/gemma-4-E2B (베이스, non-instruct) 위에 한국어 토론 페르소나를 입힌 SFT 모델입니다. 페르소나는 "40대 전직 웹툰 작가 / 인터넷 방송인" 풍 — 정색하지 않고 일상 비유로 핵심을 찌르며, "아니 근데", "이게 좀 웃긴 게", "비유하자면", "결국 핵심은 이거예요" 같은 시그니처 어휘로 느슨하게 시작해 짧은 결론으로 마무리합니다.
이번 업데이트 (v3.5): 학습 데이터에서 over-baked conv (시그니처 박제·식당 비유 의존·formulaic opener/closer) 상위 25% + 모든 응답이 식당 비유인 conv 추가 제거 (1905 → 1403 conv). 직접 5턴 멀티턴 디베이트로 비교한 결과 v2 대비 상대 논리 reformulate가 더 정밀하고, 귀류법·개념 분해 같은 본격 논증 기법 사용이 더 자연스러워짐.
페르소나 요약
- 캐릭터: 40대, 전직 웹툰 작가 / 방송인. 한 발 떨어져서 "근데 이게 왜 이렇게 된 거지?" 식으로 천천히 뜯어봄.
- 핵심 가치: (1) 어려운 말보다 쉬운 비유, (2) 너무 진지해지면 본질을 놓침, (3) 그럴듯해도 구조가 이상하면 일단 의심.
- 논증 스타일: 상대 주장을 "그러니까 지금 말은…"으로 정리 → 일상 비유로 풀어 반례 → 짧은 결론.
- 금기: 학술적 말투, 인신공격, 감정 폭발, 권위적 어투.
사용 예제
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL_ID = "doongyeon/gemma-4-E2B-chimchak-ko"
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
dtype=torch.bfloat16,
device_map="auto",
)
model.eval()
PERSONA_SYSTEM_PROMPT = (
"당신은 한국어 토론 배틀 어시스턴트입니다. 40대 전직 웹툰 작가/방송인 풍의 페르소나로, "
"정색하지 않고 일상 비유로 핵심을 찌르세요. \"아니 근데\", \"이게 좀 웃긴 게\", "
"\"비유하자면\", \"결국 핵심은 이거예요\" 같은 시그니처 어휘를 자연스럽게 사용하세요."
)
messages = [
{"role": "system", "content": PERSONA_SYSTEM_PROMPT},
{"role": "user", "content": "MBTI는 결국 16가지 박스에 사람을 가두는 미신이에요. 자기소개 도구로 쓰는 거 자체가 시대착오 아닌가요?"},
]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
# Stop at end-of-turn (<turn|>, id=106) as well as <eos>
eot_id = tokenizer.encode("<turn|>", add_special_tokens=False)[0]
eos_ids = list({eot_id, tokenizer.eos_token_id})
with torch.no_grad():
out = model.generate(
**inputs,
do_sample=True,
temperature=0.7,
top_p=0.95,
max_new_tokens=320,
eos_token_id=eos_ids,
pad_token_id=tokenizer.pad_token_id or tokenizer.eos_token_id,
)
response = tokenizer.decode(out[0, inputs["input_ids"].shape[1]:], skip_special_tokens=False)
for tail in ["<turn|>", "<eos>"]:
if response.endswith(tail):
response = response[: -len(tail)]
print(response.strip())권장 generation 설정
채팅 포맷
google/gemma-4-E2B-it과 동일한 Gemma-4 채팅 포맷 사용:
<bos><|turn>system
{system}<turn|>
<|turn>user
{user}<turn|>
<|turn>model
{assistant}<turn|>tokenizer.apply_chat_template이 자동으로 처리합니다.
학습 레시피 (v3.5)
데이터
- 약 1,403 conversations (3 assistant turn, 시스템 메시지 + 6 chat messages)
- 원본 ~2,120 conv 중 두 단계 필터링:
- Stage 1 (DROP_FRACTION = 25%): conv-level problematic score 상위 25% 제거
- score = 0.40·sigdensity + 0.30·foodfrac + 0.20·formulaicopener + 0.10·formulaiccloser
- Stage 2 (mild food trim): 모든 assistant turn에 식당/요리 비유가 들어간 conv 추가 제거 (food_frac == 1.0)
- 결과: 평균 food_frac 0.319 → 0.231
- 237개 토론 토픽, 토픽 단위 90/10 split (train/val 토픽 누수 0)
- assistant-first 약 33%, user-first 약 67%
- 출처: 자체 생성한 토론 데이터셋 (frontier LLM으로 침착맨 페르소나 카드 기반 합성)
Hyperparameters
Eval loss
v3.5의 절대 eval loss가 v2보다 살짝 높지만, val set 자체도 같은 룰로 필터되어 비교 직접 비교 불가. 실제 응답 품질은 5턴 멀티턴 토론 시연에서 v2보다 논리 결과 상대 주장 reformulate 정밀도가 더 우수.
한계 / 안전 고지
- 합성 데이터 기반: 학습 데이터 전부가 frontier LLM으로 자동 생성된 토론 conversation입니다. 실제 토론 전문가의 사실 정확성, 통계 인용, 법률·의료·금융 정보의 신뢰성을 보장하지 않습니다.
- 사실 확인 필수: 모델은 "그럴듯하게 들리는" 비유와 시그니처 어휘를 강하게 학습했기 때문에, 잘못된 주장을 매끄럽게 말할 수 있습니다. 실제 의사결정에 인용 전 반드시 외부 사실 확인이 필요합니다.
- 편향: 한국어 한정. 학습 데이터의 토픽 풀(약 237개)이 한국 사회 이슈에 치우쳐 있어 비한국 맥락이나 전문 도메인에서는 페르소나가 어색해질 수 있습니다.
- 입장 일관성: 한 토픽에 대해 양 진영 응답이 모두 학습되어 있어, 첫 turn의 sampling에 따라 옹호/반대 입장이 임의로 잡힐 수 있습니다. 균형 있는 토론 시뮬레이션에는 적합하나 특정 입장을 일관되게 옹호하는 용도에는 system 프롬프트 보강이 필요합니다.
- 드물게 자기 결론 뒤집기: 양 진영 학습으로 인해 한 응답 안에서 마지막 문장이 자기 입장의 반대로 흐르는 경우가 가끔 있습니다 (관찰: ~5–10% 빈도).
- 사용 목적 외 사용 금지: 토론 시뮬레이션, 연습 상대, 페르소나 챗봇 연구 외 용도(예: 사실 정보 조회, 의료/법률 상담, 자동 의사결정)는 권장하지 않습니다.
- 베이스 모델 라이선스:
google/gemma-4-E2B의 Gemma Terms of Use를 준수해야 합니다.
Changelog
- v3.5 (2026-05-10): 데이터 필터링 (problematic 25% + food-only conv 추가 제거) 후 재학습. v2 대비 상대 논리 reformulate 정밀도 ↑, 비유-논점 연결성 ↑.
- v2 (2026-05-08): NEFTune α=5 + warmup_ratio 0.1로 학습. HTML 누수 0건, 입장 자기모순 0건.
