영어권 Reddit 페르소나로 한국 시장을 시뮬레이션하면 어색합니다. 그래서 NVIDIA가 공개한 한국인 페르소나 100만 명 데이터셋을 MiroFish에 통합했고, 야놀자 2026년 실적 시나리오를 한국인 에이전트들에게 직접 물어봤습니다.
왜 한국어 페르소나가 필요했나
MiroFish는 LLM 기반 멀티에이전트 소셜 시뮬레이션 프레임워크입니다. 가상의 Reddit·Twitter 환경에서 수십 명의 에이전트가 서로 게시물을 올리고, 댓글을 달고, 의견을 형성하는 과정을 관찰할 수 있습니다. 사용자는 시드 문서를 던져 넣기만 하면, 시뮬레이션이 끝난 뒤 LLM이 자동으로 보고서를 작성해 돌려줍니다.
문제는 MiroFish 기본 페르소나가 영어권 Reddit 사용자 기반이라는 점입니다. 한국 시장의 인바운드 관광이나 국내 플랫폼 점유율 같은 주제를 다룰 때, 미국·유럽 사용자 프로필이 토론을 끌고 가면 결과가 산으로 갑니다. "23세 서귀포 청년의 주말 흑돼지 구이 취향"이 나오는 게 자연스러운 자리에서, 영어권 페르소나는 그 결을 만들지 못합니다.
그래서 두 가지를 결합한 한국어 포크를 만들었습니다.
- MiroFish 본체: 멀티에이전트 엔진과 보고서 자동화
- NVIDIA Nemotron-Personas-Korea: 100만 명 규모의 통계적으로 정교한 한국인 페르소나 데이터셋

NVIDIA Nemotron-Personas-Korea가 뭔가요
NVIDIA가 2025년 공개한 합성 페르소나 데이터셋입니다. 한국 통계청 인구 분포에 맞춰 성별·연령·지역을 비례 분포로 생성하고, 그 위에 직업·문화 배경·가족·취미·관심사 같은 서사 필드를 LLM으로 풍부하게 채워 넣은 구조입니다.
페르소나 한 명의 실제 모습은 이렇습니다.
김용환 씨는 공학적 정밀함과 철도 기관사의 책임감을 갖춘 채, 서귀포의 느긋한 풍경 속에서 안정적인 미래를 설계하는 23세 청년입니다. […] 1초의 오차도 허용하지 않는 전동차 기관사 시절의 정밀한 운행 습관을 가지고 있으며, 현재는 한국철도공사와 같은 안정적인 공기업에 입사하기 위해 매일 정해진 시간에 도서관으로 향해 […] 주말이면 친구들과 서귀포 시내의 흑돼지 구이집을 찾아다니며 맛을 비교하고 […]
지역·직업·생활 패턴이 구체적으로 살아 있습니다. 이런 사람 100명이 가상 Reddit에서 야놀자 IR 자료를 보고 토론한다면, 영어권 페르소나로는 절대 안 나올 텍스처가 만들어집니다.
층화추출로 100명 뽑기
100만 명에서 그냥 무작위로 100명을 뽑으면 인구 분포에 따라 수도권·30~40대가 과대표집됩니다. 그래서 **층화추출(stratified sampling)**을 씁니다. 성별·연령대·권역을 격자(cell)로 나누고, 각 셀에서 최소 1명 이상이 나오도록 보장하는 방식입니다.
# config/sampling_config.yaml
sample_size: 100
seed: 42
dataset: "nvidia/Nemotron-Personas-Korea"
stratify_by:
- field: sex
- field: age
bins: [[20, 30], [30, 40], [40, 50], [50, 60], [60, 100]]
labels: ["20대", "30대", "40대", "50대", "60대+"]
- field: province
mapping:
수도권: ["서울", "경기", "인천"]
영남: ["부산", "대구", "울산", "경상북", "경상남"]
호남: ["광주", "전북", "전라남"]
충청: ["대전", "세종", "충청북", "충청남"]
강원제주: ["강원", "제주"]
min_per_cell: 1
성별 2 × 연령 5 × 권역 5 = 최대 50개 격자. 100명을 뽑으면 격자당 평균 2명. 서울 30대 남자가 30명씩 들어차는 일은 발생하지 않습니다. 사회과학 표본 설계에서 가장 흔히 쓰는 방법을 그대로 적용했습니다.
seed: 42로 고정해 두면 누가 돌리든 같은 결과가 나옵니다. 실제로 이번 실험에서는 위 설정으로 109명이 뽑혔습니다(셀별 보정 결과).
시뮬레이션 시드 — 어떤 정보를 넣었나
블로그 포스트의 핵심 파트입니다. 이 시뮬레이션이 그럴듯한 결과를 내놓은 비결은 거의 전부 시드 단계의 설계에서 결정됐습니다. 시드는 크게 네 묶음으로 들어갔습니다.
① 출처별 신뢰도 가중치를 둔 원문 자료
야놀자 IR 자료를 무차별 투입하지 않고, 세 등급으로 가중치를 매겼습니다.
| 데이터 소스 | 신뢰도 가중치 |
|---|---|
| 실적 보도자료 및 DART 공시 | 1.0 (최상) |
| 야놀자리서치 전문 리포트 | 0.9 (상) |
| 언론 보도 및 제3자 조사기관 | 0.7 (중) |
이 가중치는 보고서 본문에서 인용·논거의 비중을 조정하는 데 쓰입니다. 익명 기사로만 나온 가설은 약하게 다루고, DART 공시 수치는 그대로 인용됩니다. 페르소나 토론이 "어디서 들은 얘긴데"로 흐르지 않게 잡아주는 장치입니다.
② 정량 입력 변수 6개
시장 수요 4개 + 기업 운영 2개 = 총 6개를 시뮬레이터의 입력으로 정의했습니다.
시장 수요 변수
- Inbound_Vol : 연간 방한 외래객 수 (기준 1,893.7만 / 범위 1,600만~3,000만)
- Outbound_Vol : 연간 국외 출국객 수 (기준 2,955.0만 / 범위 2,300만~3,200만)
- Avg_Spend_In : 인바운드 1인당 지출액 (기준 1,155.8달러 / ±10%)
- CN_Factor : 중국인 유입 가중치 (1.0~1.5, 한일령 등 정치 변수 반영)
기업 운영 변수
- R&D_Invest : 매출 대비 AI/기술 투자 비중 (조정 EBITDA에 영향)
- Cross_Sell_Rate : 플랫폼 내 교차 판매 성공률 (TTV 성장에 기여)
각 변수마다 기준값 + 변동 범위가 같이 들어가 있는 게 핵심입니다. 페르소나들은 "기준값 대비 어느 정도 흔들리면 어떤 일이 일어나는지"를 토론하게 됩니다.
③ 출력 목표(Target) 5개와 검증 기준점
그룹 재무 지표
- Target_Revenue : 연결 매출 1.2조 원 달성 가능 여부 (2025년 1.03조 기준)
- Target_TTV : 글로벌 통합거래액 40조~50조 진입 시점
- EBITDA_Margin : 조정 EBITDA 마진 10%~15% 유지 여부
사업부별 지표
- ES_Growth : 엔터프라이즈 솔루션 매출 성장률 20%+ 유지
- NOL_Operating_Profit : 놀유니버스 연간 영업이익 200억 원 돌파
여기에 **2026년 1분기 실제 발표 실적(매출 2,182억 / TTV 7조)**을 백테스팅 기준점으로 못 박았습니다. 시뮬레이션이 끝나면 결과를 이 실제 수치와 정합성 점검하는 구조입니다.
④ 전이 계수와 스트레스 시나리오
시드에는 변수 간 인과 관계를 명시한 "수요 전이 가정"도 들어갔습니다.
- 인바운드 외래객 +100만 명 → 놀유니버스 중국 관련 거래액 +10%, ES 솔루션 매출 +2%
- 아고다·트립닷컴 점유율 +5%p → 야놀자 CP 부문 아웃바운드 TTV −15% (스트레스 테스트)
이 두 줄이 시뮬레이션 결과의 절반을 결정합니다. 페르소나들은 이 계수가 어떤 조건에서 유지되는지, 어떤 조건에서 깨지는지를 토론합니다.
⑤ 시간대별 활동 패턴 — 한국인답게 움직이게
마지막 시드는 시뮬레이션 시간 설계입니다. 72시간(3일 주기)을 시간대별로 활동량이 다르게 설정했습니다.
| 시간대 | 활동 배율 | 설명 |
|---|---|---|
| 00:00 ~ 05:00 | 0.05× | 새벽 휴면 |
| 06:00 ~ 08:00 | 0.4× | 출근 시간 |
| 09:00 ~ 18:00 | 0.7× | 업무 시간 |
| 19:00 ~ 22:00 | 1.5× | 피크 — 관광·플랫폼 이용 집중 |
저녁 시간대에 토론과 게시물이 폭증하도록 설계했습니다. 한국 OTA·여행 플랫폼의 실제 트래픽 패턴과 비슷합니다. "심야에 야놀자 검색이 늘어난다"는 행동을 페르소나가 자생적으로 재현하는 것이 아니라, 시뮬레이터가 시간 가중치로 강제로 만들어줍니다.
이렇게 다섯 묶음의 시드를 던져 넣으면, MiroFish가 시드 문서들을 분석해 47개 비즈니스 엔티티를 자동으로 추출합니다.

47개 엔티티 — 누가 토론에 참여했나
시뮬레이터가 시드에서 뽑아낸 47개 엔티티는 9개 타입으로 분포돼 있습니다.
- Organization: 야놀자 본사
- ConsumerTravelPlatform / CompetitorPlatform: 야놀자 CP, 아고다, 트립닷컴, 부킹닷컴 등
- EnterpriseSolutionProvider: 야놀자클라우드, AI 데이터 분석 솔루션
- TourismAuthority: 한국관광공사 등 공공 기관
- MediaOutlet: 경제지·여행 전문지
- EventOrCampaignOrganizer / TravelMarketSegment: 이벤트·세분 시장
- Person: 일반 사용자 (여기에 한국 페르소나가 주입됨)
각 엔티티는 활동 수준(activity_level), 게시 빈도, 댓글 빈도, 감정 편향(sentiment_bias), 입장(stance), 영향력 가중치를 따로 갖습니다. 예를 들어 한 ES 제공자는 activity_level=0.72, posts/hour=3, sentiment_bias=+0.55, stance="supportive"로 설정돼서, 자기 사업과 관련된 화제에 적극적으로 긍정 게시물을 올리도록 짜여 있습니다.
[📷 스크린샷 4:]
실행 흐름 — Step 1부터 보고서까지
전체 흐름은 다음과 같습니다.
[Step 1] 환경 설정 → .env 작성, Codex CLI 로그인 확인
[Step 2] 페르소나 샘플링 → docker compose run sampler
[Step 3] MiroFish 기동 → docker compose up
[Step 4] 프로젝트·시뮬 생성 → 웹 UI에서 시드 문서 업로드
[Step 5] 페르소나 주입 → ./scripts/inject.sh <simulation_id>
[Step 6] 자동 설정·실행 → Prepare → Run
[Step 7] 보고서 확인 → 보고서 페이지에서 5섹션 결과 확인
Step 5 — 한국 페르소나 주입
여기가 한국어 포크의 핵심입니다.
./scripts/inject.sh ./data/profiles/reddit_profiles.json <simulation_id>
# Done: 109명의 프로필을 시뮬레이션에 주입했습니다.
스크립트는 샘플러가 만든 한국 페르소나 JSON을 시뮬레이션 업로드 경로로 복사합니다. 이후 MiroFish가 시뮬레이션을 시작할 때 이 파일을 우선으로 사용합니다.
Step 6 — Prepare → Run
UI에서 Prepare 버튼을 누르면 MiroFish가 페르소나에게 게시물 생성용 프롬프트를 분배합니다. 그리고 시드 단계에서 정의된 초기 게시물 4개가 자동으로 떨어집니다. 실제 시드 게시물의 예시는 이렇습니다.
"2025년 야놀자 연결 매출 1.03조, TTV 39.2조를 보면 2026년 1.2조 매출과 40조~50조 TTV 진입이 현실적인지 궁금합니다." — Student
"아고다와 트립닷컴 점유율이 5%p 상승하면 CP 부문 아웃바운드 TTV가 15% 감소한다는 시나리오는 꽤 민감해 보입니다." — Organization
이 4개 게시물이 토론의 출발점을 만들고, 47개 에이전트가 시간대별 활동 가중치에 따라 응답·재게시·반박을 누적합니다. 72시간 동안 누적된 게시물 DB는 31MB까지 부풀었습니다.

보고서가 말한 것 — 5가지 핵심 발견
1. 외래객 "숫자"보다 "질"이 중요하다
"외래객 증가를 볼 때 단순 인원수보다 객단가와 국적 믹스가 더 중요하다."
가장 자주 반복된 인사이트입니다. 페르소나들은 인바운드 1,600만 → 3,000만 같은 절대 규모보다, 객단가·체류일수·국적 믹스를 먼저 봐야 한다고 일관되게 짚었습니다. 특히 중국 관광객 회복은 "유입 수"가 아니라 "항공 공급 + 예약 전환율 + 숙박·액티비티·교통패스 같은 체류형 소비"의 동반 회복으로 판단해야 한다는 결론이 나왔습니다.
2. 환율은 거래액을 직접 끌어올리지 않는다 — 채널을 바꾼다
"고환율 환경에서는 해외여행 수요의 총량보다 결제 전환율과 예약 채널 이동이 더 중요하다."
흥미로운 관찰이었습니다. 고환율 국면에서 페르소나들은 "여행을 안 가는" 게 아니라 "예약을 늦추고, 채널을 바꾸는" 행동을 보였습니다. 환율은 거래액을 줄이는 게 아니라, 어느 OTA에서 결제가 일어나는지를 바꾸는 변수로 작동합니다.
3. 컨슈머 부문은 TTV, 엔터프라이즈 부문은 전환 깊이
야놀자의 두 축인 CP(Consumer Platform)와 ES(Enterprise Solution)가 인바운드 회복에 다르게 반응했습니다.
- CP: 외래객 증가 → TTV가 직접 반응. 단, 원화 환산 체감가·예약 전환율·항공 좌석 공급·지역 믹스에 따라 강도가 달라짐
- ES: 외래객 증가가 출발점은 맞지만, 항공 공급 회복 + 예약 전환율 + 숙박·액티비티 소비 + 국적 믹스가 함께 움직일 때만 매출 개선으로 연결
페르소나들이 인용한 실적 수치도 들어가 있습니다 — 2025년 Q1 AI 기반 데이터 솔루션 매출 전년 동기 대비 +133%, ES 조정 EBITDA 882억 원(+30.3%).

4. 아고다·트립닷컴 5%p 점유율 상승 → CP 아웃바운드 TTV 15% 감소 시나리오
"아고다와 트립닷컴의 점유율 5%p 상승 시나리오는 CP 부문의 아웃바운드 TTV를 15% 감소시킬 수 있다."
이건 스트레스 테스트 항목이었습니다. 페르소나들은 단순한 점유율 변화가 아니라 "채널 점유율 변화 → 결제 전환 약화 → 거래액 감소"의 인과 사슬로 해석했습니다.
- 경쟁 변수: 아고다·트립닷컴 점유율 상승
- 전이 경로: 예약 채널 이동 + 결제 전환 약화
- 결과 지표: CP 아웃바운드 TTV 15% 감소 가능성
- 검증 포인트: MAU, 재방문, 로컬 결제 편의성, 결제 전환율, 지역별 TTV
5. 2026년 목표 백테스팅 — "도달 가능성의 신호"는 잡혔지만 단정 불가
2025년 1.03조 매출 / 39.2조 TTV를 기준점으로, 2026년 1.2조 매출 / 40~50조 TTV 목표를 페르소나들이 검증했습니다. 결론은 신중했습니다.

2026년 1분기 2,182억 원, TTV 7조 원 수준은 "도달 가능성의 신호"로는 읽히지만, 그 자체만으로 목표 달성 판정은 할 수 없다.
매출 성장만으로는 EBITDA 마진 10~15% 유지가 어렵고, R&D 집행 효과와 비용 효율화가 함께 확인돼야 한다는 단서가 붙었습니다. 놀유니버스 영업이익 200억 원 돌파도 2025년 149억 원에서 단순 연장이 아니라 "인바운드 반사이익의 지속성과 교차판매 전환율"이 받쳐줘야 가능하다고 봤습니다.
한국 페르소나가 만드는 차이
같은 시뮬레이션을 영어 Reddit 페르소나로 돌렸다면, "Why is Korean tourism recovering slowly from China?" 수준의 표면적인 토론에 그쳤을 가능성이 큽니다. 이번 결과에서 인상적이었던 부분은 다음과 같았습니다.
- 결제 시점 지연, OTA 채널 이동, 원화 환산 체감가 같이 한국 소비자에게 익숙한 행동 어휘가 자연스럽게 등장
- 아고다·트립닷컴 vs 야놀자라는 국내 OTA 경쟁 구도가 페르소나 토론에서 자생적으로 형성
- 한일령·중국 회복 같은 지정학 변수가 단순 키워드가 아니라 실제 행동 변수로 연결
페르소나 데이터의 "한국성"이 멀티에이전트 시뮬레이션의 결을 바꾼다는 점을 직접 확인했습니다.
정리
- 한국어 포크의 구성 = MiroFish 본체 + NVIDIA Nemotron-Personas-Korea
- 층화추출로 한국 인구 분포를 반영한 100명 안팎의 페르소나를 뽑고, 시뮬레이션에 주입
- 시드 단계에서 출처 신뢰도 가중치 + 정량 변수 + 출력 목표 + 전이 계수 + 시간대별 활동 패턴을 모두 정의한 것이 좋은 결과의 핵심
- 야놀자 IR 시드 위에서 47개 엔티티 × 72시간 시뮬레이션 → 5섹션 보고서 자동 생성
- 결과는 표면적 인구 통계가 아니라 결제 행동·채널 이동·전환 깊이 같은 한국 소비자 결을 반영한 인사이트
다음 실험으로는 지역별 층화 가중치를 의도적으로 흔들었을 때 토론 방향이 어떻게 바뀌는지(예: 수도권 70% 시나리오 vs 지방 70% 시나리오)를 비교해볼 계획입니다.