← 홈으로
이 글의 한국어 번역은 Claude를 이용해 자동 생성되었습니다. 의도하지 않은 표현이나 오류가 있을 수 있습니다. 영어 원문 보기 →
AI·2026년 7월 2일·14분 소요

Demos: 대한민국 지방선거를 맞힌 100만 페르소나 모델

합성 유권자를 만들었다 — 100만 개의 페르소나, 한국산 소버린 LLM 하나, 2차원 이념 공간. 그리고 2026년 6월 전국동시지방선거 예측을 투표 전에 봉인했다. 결과는 광역단체장 16곳 중 15곳, 기초단체장 223곳 중 192곳 적중 — 파이프라인 어디에도 여론조사는 없었다. 실제 수식과 함께 쓴 방법론, 그리고 모델을 거의 침몰시킬 뻔한 구조적 결함 하나와 그 수리까지.

A two-dimensional map of a synthetic Korean electorate

2026년 6월 3일, 대한민국은 제9회 전국동시지방선거를 치렀다 — 광역단체장 16석과 기초단체장 223석이 하루에 결정됐다. 그로부터 일주일 전인 5월 27일 10:00 UTC, 우리 4인 팀은 방향성 예측 전체를 공개 git 저장소의 append-only 디렉터리에 커밋하고(커밋 070dc22), 가장 틀릴 가능성이 높다고 판단한 두 선거구에 표시를 남긴 뒤, 모델에서 손을 뗐다.

개표가 끝났을 때: 광역단체장 16곳 중 15곳 적중(94%), 기초단체장 223곳 중 192곳 적중(86%). 모델은 여론조사를 단 한 번도 보지 않았다. 입력의 전부는 합성 인구, 검증된 과거 선거 결과, 그리고 GPU 한 장 위에서 돌아가는 한국산 11.5B 파라미터 언어 모델 하나였다.

이 시스템의 이름은 Demos — δῆμος, 민중 — 다. 이 글은 그 방법론을 수식과 함께 적은 것이다. 흥미로운 부분들은 산문만으로는 옮겨지지 않기 때문이다. 그리고 후반부에는 우리 스스로의 백테스트가 드러낸 구조적 결함 하나 — 모델이 시간을 보지 못했다 — 와 그것을 고친 레이어에 대한 정직한 기록이 있다.

먼저, 사람들

모든 것은 NVIDIA의 Nemotron-Personas-Korea 데이터셋에서 출발한다: 인구총조사와 행정 통계 분포(KOSIS, 법원 이름 등록 자료, 건강보험 인구통계)에 맞춰 통계적으로 보정된 100만 개의 합성 한국인 페르소나로, 시·군·구 단위까지 해상도를 갖는다. 각 페르소나는 작은 전기(傳記)다: 나이, 직업, 가족, 지역, 그리고 한 문단 분량의 질감. 실존 인물은 어디에도 등장하지 않는다 — 사람이 없으니 유출될 개인정보도 없다.

그리고 설계상, 정치도 없다. 데이터셋에는 정당 성향 필드도, 이념 점수도, 표로 집계할 수 있는 그 무엇도 없다. 이 부재가 기술적 문제의 전부다:

정치적 레이블이 전혀 없는 합성 시민이 주어졌을 때, 그가 어떻게 투표할지에 대한 분포를 추론하라 — 그리고 그 근거를 보여줄 수 있어야 한다.

누굴 찍을지는 모델에게 묻지 마라

뻔한 접근 — 페르소나를 LLM에 건네고 "진보요, 보수요?"라고 묻는 것 — 은 특유의 방식으로 실패한다: 모드 붕괴(mode collapse)다. 모델은 인구 집단 전체에 대한 '사견'을 형성하고 그것을 통째로 할당해 버린다. 분류기는 이 일에 정확히 잘못된 모양이다.

그래서 우리는 그 질문을 아예 하지 않는다. 대신 LLM(KT Mi:dm 2.0, 한국의 소버린 모델 중 하나 — 우리는 한국산 LLM만 쓰기로 스스로 제한을 걸었고, 그 제약을 기능으로 취급했다)을 **특징 추출기(feature extractor)**로 쓴다. 각 페르소나에 대해, 한국 정치학 문헌에 근거를 둔 일곱 개의 좁은 행동 신호를 채점한다: 경제적 불안, 제도 신뢰, 지역 정체성, 세대 의식, 반기득권 정서, 그리고 진보·보수 이슈 클러스터 각각의 현저성. 각 신호는 점수 sks_k, 신뢰도 ckc_k, 그리고 페르소나를 인용하는 한국어 근거 문자열로 돌아온다.

신뢰도가 낮은 추출은 아무것도 움직이지 못해야 하므로, 모든 신호는 사용 전에 무지(無知) 쪽으로 수축시킨다:

s~k=cksk+(1ck)12.\tilde{s}_k = c_k\, s_k + (1 - c_k)\cdot \tfrac{1}{2} .

결정론적 매퍼 — 순수 함수, 명시적 가중치 행렬, LLM 없음 — 가 일곱 개의 수축된 신호를 4원 정치 사후분포

π=(πprog, πcent, πcons, πnone),π=1,\pi = (\pi_{\text{prog}},\ \pi_{\text{cent}},\ \pi_{\text{cons}},\ \pi_{\text{none}}), \qquad \textstyle\sum \pi = 1,

와 기득권 친화도 점수로 바꾼다. 이 사후분포는 지역 사전분포와 혼합된다. 페르소나는 허공에 떠 있는 개인이 아니기 때문이다 — 대구의 60세 상인과 광주의 60세 상인은 매우 다른 기준선에서 출발한다:

πi=0.35br(i)+0.65f(s~i),\pi_i = 0.35\, b_{r(i)} + 0.65\, f(\tilde{\mathbf{s}}_i),

여기서 brb_r은 광역 단위의 성향 기준선이다. 광역 아래에서는 두 번째 보정이 기초 단위 구조를 덧댄다: 각 시·군·구에 대해 검증된 과거 결과(최근 선거들, 그리고 가능한 곳에서는 2025년 대선의 하위 지역 득표차)로부터 성향 오프셋을 계산하고,

Δdistrict=clamp(0.00833w, ±0.50),w=0.60Δrecent+0.40εΔpres,\Delta_{\text{district}} = \mathrm{clamp}\big(0.00833 \cdot w,\ \pm 0.50\big), \qquad w = 0.60\,\Delta_{\text{recent}} + 0.40\,\varepsilon\,\Delta_{\text{pres}},

페르소나의 사후분포에 더한다. 기초 단위 오버라이드 229개 — 하나하나가 특정한 검증된 선거 결과로 추적된다.

추출은 NVIDIA H100 한 장에서 워커 128개로 초당 13–14회의 LLM 호출을 유지하며 돌았다. 광역 16곳 전체 실행에 약 72분. 모든 사후분포는 (persona, model, version)을 키로 캐시된다 — 선거 주간까지 293,610개 — 그래서 재실행은 CPU만으로 싸게 끝난다. 이 캐시는 뒤에서 중요해진다.

2차원 위의 유권자

이제 각 페르소나는 지도 위의 점이 된다. x축은 이념, y축은 기득권 친화도다:

xi=πconsπprog[1,+1],yi[0,1],x_i = \pi_{\text{cons}} - \pi_{\text{prog}} \in [-1, +1], \qquad y_i \in [0, 1],

여기에 페르소나별 가우시안 지터(σx=0.15\sigma_x = 0.15, σy=0.10\sigma_y = 0.10, 시드 고정 — 모든 실행이 재현 가능하다)를 더해, 1만 개의 페르소나가 격자로 겹쳐 쌓이지 않게 한다. 후보들도 같은 지도 위에 산다. 정당의 위치에 문서화된 이력을 더해 배치된다.

페르소나와 각 후보 사이의 거리는 세 개의 곱셈 레이어로 조정되는데, 각각의 범위는 의도적으로 좁다:

dij=zicj2Aj(ri)regional affinity[0.78,1]Djincumbency×0.96Hjpersonal vote[0.92,1].d_{ij} = \big\lVert z_i - c_j \big\rVert_2 \cdot \underbrace{A_j(r_i)}_{\text{regional affinity} \in [0.78,\,1]} \cdot \underbrace{D_j}_{\text{incumbency} \times 0.96} \cdot \underbrace{H_j}_{\text{personal vote} \in [0.92,\,1]} .

지역 친화도가 제일 크다 — 한국 선거에서 후보가 어디 출신인지는 엄청나게 중요하고, 문헌도 그렇게 말한다. 현직 프리미엄과 개인표는 작은 넛지로, 박빙 승부는 기울일 수 있지만 공간 구조를 뒤집을 수는 없게 묶여 있다.

기권자는 무시되지 않고 모델링된다. 페르소나는 정치적으로 이탈해 있으면서 동시에 나온 후보 전원에게서 멀 때 기권한다:

πnone0.40andminjdij>0.60    abstain.\pi_{\text{none}} \geq 0.40 \quad\text{and}\quad \min_j d_{ij} > 0.60 \;\Longrightarrow\; \text{abstain}.

나머지 전원은 조정 거리의 제곱에 대한 날카로운 소프트맥스로 투표한다:

P(ij)=exp ⁣(dij2/T)kexp ⁣(dik2/T),T=0.10.P(i \to j) = \frac{\exp\!\big(-d_{ij}^2 / T\big)}{\sum_k \exp\!\big(-d_{ik}^2 / T\big)}, \qquad T = 0.10 .

T=0.10T = 0.10은 근접성을 거의 결정적으로 만든다 — 이것은 투표지, 선호 조사가 아니다. 선거구 단위 득표율은 표본 투표를 집계하고, 후보 인지도 하한을 섞고(한 번도 들어본 적 없는 후보에게서 표를 받을 수는 없다), 광역별 기류 탄력성 ε\varepsilon — 스윙이 큰 수도권은 1.00, 정치적으로 가장 관성적인 지역은 0.50 — 으로 스케일된 유계 정부 심판 시프트를 적용한다:

vj=renorm(max(0, 0.80vjraw+0.20recogj+gjεr)).v_j = \mathrm{renorm}\Big( \max\big(0,\ 0.80\, v_j^{\text{raw}} + 0.20\, \mathrm{recog}_j + g_j\,\varepsilon_r \big) \Big).

위의 모든 하이퍼파라미터 — 총 91개 — 는 어떤 예측이 생성되기도 전에 버전 관리되는 매니페스트에 동결된다. 표본 크기는 인구 비례로 N=clamp(pop/1000, 1500, 15000)N = \mathrm{clamp}(\text{pop}/1000,\ 1500,\ 15000)이고, 민감도 검사에서 표본을 잘라내도 득표율은 최대 1.28pp 움직였다. 인구통계적 평균은 강건하다. 그것이 100만 페르소나짜리 보정된 인구가 사주는 것이다.

왜 실패했어야 했는가

여기가, 홍보용 글이라면 건너뛰었을 부분이다.

실제 예측을 하기 전에 백테스트부터 했다. 2024년 국회의원 선거 — 그 결과가 기초 사전분포 보정에 쓰였으니 in-sample이다 — 에서 공간 모델은 **174개 지역구 중 153개(87.9%)**를 맞혔고, 평균 절대 오차는 8.9pp였다. 고무적이었다. 그다음 완전히 held-out인 2022년 지방선거에 돌렸더니 훨씬 교육적인 답이 나왔다: 광역단체장 70.6%, 기초단체장 63.3% — 그리고 수도권 기초 단위에서는 대략 30%로 붕괴.

진단은 깔끔했고, 어떤 개별 수치보다 나빴다: 모델이 시간 불변이었다. 인구통계와 지역 구조는 수십 년 단위로 변하므로, 그것만으로 만든 모델은 모든 선거를 똑같이 예측한다. 2022년은 보수 물결의 해였다. 장기 구조에 닻을 내린 우리의 합성 유권자는 그 바람을 느낄 수 없었다. 무작위로 실패한 게 아니다 — 정치적 날씨가 인구통계적 기후에서 벗어난 곳에서 정확히 실패했고, 물결의 해에 그런 곳은 중요한 모든 곳이다.

구조만으로 만든 선거 모델은 바닥이지 예보가 아니다. 우리는 실패 보고서에 그 문장을 적었고, 그다음 그 수리를 해내야 했다.

수리: 날씨에 닻 내리기

솔깃한 수리는 여론조사다. 우리는 거부했다 — 결벽 때문이 아니라, "몰래 여론조사에 회귀하는 페르소나 시뮬레이션"은 인식론적으로 공허하기 때문이다. 이 시스템이 작동한다면, 검증 가능한 공적 기록만으로 작동해야 한다. 그래서 정식(canonical) 예보는 여론조사 0건을 쓴다. 여론조사는 held-out 평가 세트와, 결코 모델로 채점되지 않은 명확히 표시된 비교용 변형 두 개로 격리됐다.

대신 마지막 레이어는 시뮬레이션된 유권자를 가장 최근의 검증된 선거들에 앵커링한다. 각 선거구에 대해 2024년 총선, 2025년 대선에서 관측된 스윙, 그리고 신정부 허니문 항으로 득표차 목표를 만든다:

m=m2024+0.5Δ2025+H,H=+10pp,m^{*} = m_{2024} + 0.5\,\Delta_{2025} + H, \qquad H = +10\text{pp},

HH는 2022년 사이클 — 신생 정부가 지방선거를 마주한 직전 사례 — 로 보정했다. 입맛대로 고른 값이 아니다. 그리고 어떤 선거구의 출력도 직접 편집하는 대신, 실현된 시뮬레이션이 목표 득표차를 재현하도록 유권자 전체를 이념 축을 따라 옮기는 단일 전역 시프트 Δx\Delta x를 푼다:

find Δx s.t.   margin(Δx)=m,\text{find } \Delta x \text{ s.t. } \; \mathrm{margin}\big(\Delta x\big) = m^{*},

이분법(bisection)으로 — 득표차는 Δx\Delta x에 대해 단조이므로, 이것은 정직한 근 찾기지 튜닝이 아니다. 페르소나도, 사후분포도, 공간 메커니즘 전체도 동결된 채다. 움직이는 것은 기류가 군중을 어디에 놓는가뿐이다. 보정 전 예측판도 정식 예측판 옆에 저장소에 보존되어, 누구든 둘 다 채점해서 기류 레이어가 정확히 무엇을 기여했는지 잴 수 있다.

(하나 더 공개할 것이 있다. 여기 있어야 하는 내용이라서다: 기류 변화를 연속적으로 모델링하기 위해 113,800건의 기사 코퍼스 위에 뉴스 노출 레이어도 만들었다. 제때 검증되지 않아 최종 예보에서 제외했다 — 그리고 제외했다고 말하는 서명된 노트를 선거 전 날짜로 공개했다. 조용히 묻어둔 미사용 장치가 사후 스토리의 시작이 되는 법이다.)

결과보다 영수증 먼저

선거 예측은 정답이 정해진 날짜에 도착하고 반박이 불가능한, AI 평가로는 드문 과제다. 그것이 의미를 가지려면 미리 스스로를 반증 가능하게 만들어야 한다. 그래서 이 규율은 수학만큼이나 빌드의 일부였다:

6월 3일

정식 예보 — 페르소나 레이어 동결, 기류 앵커 가동, 여론조사 0건 — 의 성적:

Governors: 1516=93.8%,Mayors: 192223=86.1%,overall 207239=86.6%.\textbf{Governors: } \frac{15}{16} = 93.8\%, \qquad \textbf{Mayors: } \frac{192}{223} = 86.1\%, \qquad \text{overall } \frac{207}{239} = 86.6\%.

이 수치를 자리매김하는 비교 두 가지. 첫째, 우리 자신의 held-out 기준선과의 비교: 구조-단독 모델은 2022년의 동급 기초 단위에서 63.3%였다. 그것이 여전히 참 적중률이라면, 223곳 중 192곳 이상을 맞힐 확률은

z  =  192223×0.633223×0.633×0.367    7.1,z \;=\; \frac{192 - 223 \times 0.633}{\sqrt{223 \times 0.633 \times 0.367}} \;\approx\; 7.1,

약 7 표준편차다 — 다만 정직한 단서 하나: 선거구 결과들은 전국 기류를 통해 상관되므로, 이것은 효과 크기의 예시로 읽어야지 문자 그대로의 p-value로 읽으면 안 된다. 개선분은 기류 레이어이고, 그것은 노이즈가 아니다.

둘째, 우리가 쓰지 않은 여론조사와의 비교: 기초 단위 148곳에 대해 마지막 선거 전 여론조사로 채점하면, 모델은 여론조사 1위와 67%만 일치했다. 실제 개표로 채점하면 86% 맞았다. 우리의 "여론조사와의 불일치" 중 의미 있는 몫은 여론조사 쪽이 틀린 것이었다. 6월 3일 전에는 감히 이 문장을 쓰지 못했을 것이다. 사전 등록의 요점이 바로, 이제는 써도 된다는 것이다.

그리고 한계도 성과와 같은 확신으로 적는다: 광역 한 곳, 기초 서른한 곳을 틀렸다. 공간 모델은 주요 양당 축을 분해하므로, 그 축 밖에서 치러진 선거 — 실제 경쟁이 거대 정당 대 분파·무소속이었던 일당 우위 지역 — 는 방향성-한정 신뢰만 가지며, 우리는 사전에 그렇게 라벨했다. 동시에 치러진 국회의원 재보궐 14곳은 이 버전의 범위 밖이었다. 이 모델은 바닥 더하기 일기예보이고, 아직 시험해 보지 못한 종류의 날씨가 있다.

계속 곱씹게 되는 것들

다음

Demos는 처음부터 선거 모델 그 이상이었다 — 이 예보는, 정책이 출시되기 전에 시민 반응을 시뮬레이션하는 것이 본업인 페르소나 엔진의 반증 가능한 검증이다. 모든 출력에 출처가 붙은 채로. 선거는 시뮬레이션이 전국 규모로, 공개적으로, 3,500만 유권자가 쥔 답안지에 대고 채점될 수 있는 단 하루였다. 통과했다.

저장소 — 사전 등록 파일, 하이퍼파라미터 매니페스트, 정식 예측판 옆의 무보정판, 공개 노트 — 가 곧 논증이다. 우리를 믿는 유일한 방법이 직접 확인하는 것이 되도록 만들었고, 확인하면 발견하게 되는 유일한 사실은 어느 단계에서도 우리를 신뢰할 필요가 없었다는 것이다.

그것이 처음부터의 설계 목표였다.

크레딧

Demos는 공동 작업이다. 공동 저자들에게 감사를 — 김용성, 홍석진, 그리고 이승재 — 화이트보드 스케치에서 3,500만 유권자에게 채점받을 수 있는 시스템까지, 이것을 함께 끌고 와 준 사람들이다. 이 글의 모든 숫자는 내 것인 만큼 그들의 것이다.

← 모든 글맨 위로 ↑