LLM 소설의 캐릭터 이름 쏠림: 측정과 반복 완화 (Speculative Naming)
Character-Name Concentration in LLM Fiction: Measuring Displacement and Mitigating Repetition
TL;DR Highlight
이름 후보를 여러 개 뽑아 빈도로 걸러내자 Elara류 이름 쏠림이 95% 줄었다
Who Should Read
LLM으로 소설·스토리를 대량 생성하는데 매번 Elara, Elias만 나와 고민인 백엔드 개발자
Core Mechanics
- 금지어 목록은 풍선 효과만 낳는다
- 상위 20개 이름을 금지하면 기존 이름 쏠림(known SR)은 0.0703에서 0.0021로 줄었다.
- 대신 새 이름 쏠림(emergent)이 0.0142로 전략 중 최고였다.
- Gemma에서는 Hemlock이 44번 나왔다.
- "클리셰 이름 피해줘" 프롬프트는 효과가 없다
- 이 프롬프트는 SR을 오히려 +0.011 올렸고 20개 모델 중 13개에서 악화됐다.
- 구체적인 금지 목록(ban top 20)은 SR을 유의하게 낮췄다(−0.051).
- 플레이스홀더 + 후보 5세트로 대부분 해결
- 이야기를 [CHAR_1] 같은 빈칸으로 먼저 쓰고, 이름은 나중에 별도 호출로 채운다.
- 이름 후보 세트 5개를 확률과 함께 말하게 시키면(verbalized sampling) 페널티 없이도 SR이 89% 줄었다.
- 실행 중 빈도 카운터가 마지막 구멍을 막는다
- 모델의 기본 출력 빈도(fingerprint)와 현재 실행의 이름 카운터 중 큰 값으로 후보에 점수를 매긴다.
- 점수가 높은 후보 세트는 제외하거나 가중치를 깎는다.
- 선택된 이름은 카운터에 추가해 다음 스토리에 반영한다.
- HARD 모드는 이름이 자연스러움도 유지했다
- 점수가 0.02 미만인 후보 세트 중 확률이 가장 높은 것을 고르고, 없으면 점수 합이 최소인 세트를 고른다.
- 실존 이름 비율은 기준선에서 0.8~11.2%p 차이로 유지됐다.
- 금지 목록은 독일어에서 42.7%를 8.7%로 떨어뜨렸다.
- 비용과 한계도 분명하다
- 토큰 비용은 기준선의 3.30배로 고정이다.
- 이름만 다뤘고 줄거리 다양성은 해결하지 못했다.
- 처음 50명이 쌓이기 전에는 런타임 카운터가 작동하지 않는다.
Evidence
- SR 95% 감소, 충돌 확률 7.3%→0.4%
- 20개 LLM, 4개 언어, 44,782편 스토리 기준이다.
- 샘플링 틀만으로는 평균 89% 감소(0.073→0.008)였다.
- HARD가 100개 비교 중 57개에서 1위
- 다음 세 전략의 승수 합은 18+15+10=43이었다.
- 20개 모델 중 15개에서 평균 순위 1위였다.
- API 모델에서도 큰 감소
- Gemini Flash Lite는 SR 0.188→0.006, GPT-5.4 Nano는 0.038→0.001로 둘 다 97% 감소했다.
- 실존 이름 비율은 금지 목록에서 크게 하락
- 영어 기준 기준선 52.2%, Ban top 20 20.2%, Speculative HARD 43.7%다.
- 스토리 내 이름 중복은 4.3%에서 0.2%로 줄었다.
How to Apply
- 이름 후보 5세트를 확률과 함께 뽑게 하기
- 스토리 생성 직후 이름만 채우는 두 번째 호출을 추가한다.
- "이름 후보 5세트와 확률 합 1"을 JSON으로 받는다.
- 오늘 프롬프트 하나로 먼저 시험해 본다.
- 생성 결과의 이름 빈도 카운터 두기
- 대량 생성 파이프라인에 이름별 등장 횟수를 Counter로 저장한다.
- 50명 이상 쌓이면 상위 이름이 든 후보 세트를 제외한다.
- 금지 목록 대신 동적 제외 쓰기
- 정적 banlist는 새 쏠림을 만든다.
- 모델별 기본 출력 상위 이름을 baseline으로 저장하고 점수가 0.02 이상이면 거절한다.
- Slop Ratio로 쏠림 측정하기
- 이름 개수 ci로 Σci(ci−1)/(N(N−1))을 계산한다.
- 금지어 적용 전후로 비교해 풍선 효과를 확인한다.
Try It
# Claude나 ChatGPT에 붙여넣기 (논문 방법의 간이 버전: 카운터 없이 후보 5세트 + 확률 단계만 흉내)
아래 줄거리를 이름 대신 [CHAR_1], [CHAR_2] 같은 플레이스홀더로 짧은 소설로 써줘.
줄거리: {{줄거리}}
그다음 플레이스홀더에 들어갈 이름 후보 세트를 5개 제안해줘. 각 세트에 확률을 붙이고 합이 1이 되게 해줘. 흔한 AI 이름은 피해줘. JSON으로 출력해줘.
이어서 해 볼 것: 이미 쓴 이름 목록 {{이전에_쓴_이름}}을 알려주고 겹치는 세트는 제외하라고 해 보기.Terminology
관련 논문
LLM Voice: 초안을 LLM에 맡기면 안 되는 이유
Martin Fowler: LLM이 쓴 초안은 사람이 고쳐도 특유의 어색함이 남는다
사실 회상엔 Instruction 튜닝이 세금: Base 모델이 Instruct 모델을 이긴다
Base 모델에 few-shot 이어쓰기와 다중 샘플링을 썼더니 chat 대비 F1 0.568→0.684
AI는 도구다, 잘 쓰려면 기술이 필요하다
Hickey의 'AI는 도구가 아니다'에 맞서, LLM도 쓰는 사람의 기술이 결과를 가른다고 반박
딥리서치 에이전트의 Reflective Prompt Optimization: 토픽 분리·멀티 시드로 본 진짜 성능 향상과 프롬프트 과적합
GEPA로 프롬프트를 최적화했더니 held-out 인용 보상 0.702→0.781
GPT-6와 Intelligent UI: 채팅 안에서 시각·인터랙티브 응답 만들기
OpenAI가 GPT-6로 채팅 응답에 UI를 넣는다는데 원문이 없어 댓글 반응만 확인된다
Base 모델도 첫 토큰 단서(cue) 하나로 추론한다: 학습 데이터가 만든 연상
응답 첫 두 토큰만 고정했더니 Olmo-3-7B의 MATH-500 정답률이 42%에서 78%로 올랐다
Jev식 Typed Decision Model에서는 정의보다 라벨이 이긴다
옵션 이름을 A, B로 바꿨더니 정확도가 +0.1511 올랐다
프롬프트는 얼마나 필요한가? Few-shot 예시를 블랙박스로 최소화하는 DD-FSM
Delta debugging으로 few-shot 예시를 평균 65.3% 줄여도 출력은 그대로
Related Resources
Original Abstract (Expand)
Character names in large language model (LLM) fiction concentrate on a handful of recurrent names such as 'Elara' and 'Elias', a measurable face of AI slop. Existing fixes either require logit access or retraining, or operate per request and cannot control concentration across a corpus. How much prompt-level strategies reduce concentration, and at what cost to name naturalness, has not been systematically measured. We present an empirical study of name-concentration control across eight strategies and introduce speculative naming, a fine-tuning-free method that adapts the draft-verify-reject paradigm of speculative decoding from tokens to names. The method requests candidate name-sets through verbalized sampling, scores them against a SlopTracker that combines a per-model fingerprint with a runtime counter, and selects through a temperature-controlled rule or its strict variant (HARD). We use 20 LLMs to generate 44,782 stories in four languages from text and visual stimuli (88,919 named characters), and measure concentration with a list-free collision metric (Slop Ratio, SR) decomposed into known and emergent components. List-based strategies do not remove slop: static banlists displace concentration to emergent names and more than halve the share of attested real names. Speculative naming removes it: the sampling scaffold alone cuts SR by 89% on average, the dynamic tracker brings the total reduction to 95%, mean collision probability falls from 7.3% to 0.4%, and known-name collisions hold at zero while naturalness stays close to baseline (42-69% attested by language) and within-story collisions drop from 4.3% to 0.2%. The strategy ranking is stable across languages, model families, and name-counting conventions. Name concentration is thus controllable at the corpus level without logit access or retraining; broader creative diversity beyond naming remains open.