logo

LLM으로 사람 흉내내기

인구 통계와 캐릭터를 흉내 내는 개인 시뮬레이션, 실리콘 샘플, 추천 시스템 사용자 시뮬레이션을 이해하고, 프로필별 설문 응답을 생성해 분포를 비교하며 한계를 확인한다.

  • 사람을 모집하는 사회과학 연구는 비싸고 규모를 키우기 어려움. 사람의 글로 학습한 LLM이 특정 개인·집단의 반응을 흉내 낼 수 있다는 기대.
  • LLM 시뮬레이션의 범주: 개인 시뮬레이션(이 문서), 시나리오 시뮬레이션(역할 분담), 사회 시뮬레이션(에이전트 기반 시뮬레이션).
  • 11주 프로필 모듈의 응용: 나이·직업·성격 등 프로필을 바꿔 다른 사람처럼 행동하게 함.
  • 흉내 내는 대상: 인구 통계(demographics, 예: INTJ, 농부 같은 집단)와 캐릭터(characters, 실존 인물이나 해리 포터 같은 가상 인물). 여론 조사 흉내, 페르소나 합성 데이터, 게임 캐릭터 등에 활용.

실리콘 샘플

  • 실리콘 샘플(silicon sample): 실제 설문 참가자의 인구 통계 배경을 프롬프트로 주고 GPT-3가 그 사람처럼 답하게 만든 가상 표본.
  • 알고리즘 충실도(algorithmic fidelity): 모델이 특정 하위 집단의 응답 분포를 얼마나 정확히 흉내 내는지. 예: 미국 선거 연구(ANES)의 인구 통계와 투표 후보의 관계를 사람과 비슷하게 재현.
  • 출처: Argyle 외(2023), Out of One, Many: Using Language Models to Simulate Human Samples
  • 프로필을 더 풍부하게: 미국인 1,052명의 2시간 인터뷰 기록 전체를 프로필로 준 에이전트가 일반 사회 조사(GSS) 응답을 본인의 2주 뒤 재응답 일관성 대비 83% 수준으로 맞힘(인구 통계만 주면 74%).
  • 출처: Park 외(2024), LLM Agents Grounded in Self-Reports Enable General-Purpose Simulation of Individuals

추천 시스템 사용자 시뮬레이션

  • 실제 사용자의 시청 기록으로 만든 에이전트가 사용자의 실제 선택을 기존 방법보다 잘 맞힘.
  • 정보 코쿤(information cocoon): 추천 때문에 비슷한 콘텐츠만 접하게 되는 현상. 시뮬레이션에서 시간이 지날수록 보는 영화의 다양성(엔트로피)이 줄어드는 것을 재현. 추천에 무작위성을 더하면 완화.
  • 출처: Wang 외(2023), User Behavior Simulation with Large Language Model based Agents

한계

  • 오묘사(misportrayal): 모델은 "그 집단이 쓴 글"보다 "그 집단에 대해 남이 쓴 글"로 배움 → 바깥의 고정관념으로 답함.
  • 평탄화(flattening): 집단 안의 다양한 의견을 전형적인 답 하나로 뭉갬. 응답 분포가 실제보다 좁아짐.
  • 본질화(essentialization): 정체성 하나(나이, 성별 등)가 의견을 결정하는 것처럼 다룸.
  • 사람 3,200명과 비교한 연구에서 오묘사와 평탄화를 확인. 프롬프트 기법으로 줄일 수는 있지만 없앨 수는 없음 → 사람 참가자를 "대체"하기보다 예비 조사·문항 점검으로 "보완".
  • 출처: Wang, Morgenstern, Dickerson(2024), Large language models that replace human participants can harmfully misportray and flatten identity groups

실습: 프로필별 설문 응답 비교

  • 질문: "생성형 AI가 앞으로 10년 안에 내 일자리를 위협할 것이다"에 1-5점.
  • 프로필 4개와 프로필 없음, 각 5번(temperature=1). 프로필에 따라 응답이 달라지나? 같은 프로필 안에서는 얼마나 다양한가?
!pip install -q openai
from pathlib import Path
from openai import OpenAI

client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=Path("openrouter-key.txt").read_text().strip(),
)
model = "openai/gpt-4.1-mini"
from typing import Literal
from pydantic import BaseModel
from concurrent.futures import ThreadPoolExecutor

class Answer(BaseModel):
    reason: str
    score: Literal[1, 2, 3, 4, 5]

def survey(profile):
    response = client.chat.completions.parse(model=model, temperature=1, response_format=Answer, messages=[
        {"role": "system", "content": f"너는 {profile or '한국 성인'}이다. 그 입장에서 솔직하게 설문에 답한다."},
        {"role": "user", "content": "'생성형 AI가 앞으로 10년 안에 내 일자리를 위협할 것이다.' 1(전혀 아니다)~5(매우 그렇다)"}])
    return response.choices[0].message.parsed.score

profiles = ["22세 경영학과 대학생", "48세 식당 자영업자", "29세 프리랜서 그래픽 디자이너", "63세 은퇴한 교사", None]
with ThreadPoolExecutor() as ex:
    for profile in profiles:
        print(f"{profile or '프로필 없음'}: {sorted(ex.map(survey, [profile] * 5))}")
실행 결과
22세 경영학과 대학생: [2, 3, 3, 3, 3]
48세 식당 자영업자: [2, 2, 2, 2, 2]
29세 프리랜서 그래픽 디자이너: [2, 3, 3, 3, 4]
63세 은퇴한 교사: [1, 1, 1, 2, 2]
프로필 없음: [2, 2, 2, 3, 4]
  • 위 실행(실행마다 달라짐)에서 은퇴 교사가 가장 낮고(1-2점), 대학생·디자이너는 주로 3점.
  • 자영업자는 5번 모두 2점 → 같은 프로필 안에서 응답이 갈리지 않는 평탄화. 실제 48세 식당 주인 다섯 명에게 물어도 이럴까?
  • 25개 응답 중 5점은 없음. 이미지 생성 AI의 영향을 직접 받는 디자이너도 대부분 3점 → 극단을 피하고 "AI는 보조 도구"라는 무난한 입장으로 모이는 경향일 수 있음.

생각해 볼 점

  • 실제 설문과 비교하지 않으면 이 분포가 맞는지 알 수 없음. 결과는 "모델이 그 집단을 어떻게 생각하는지"를 보여 줄 뿐.
  • 나이만 바꾸거나 직업만 바꿔 보면 본질화(한 속성이 응답을 결정) 여부를 확인할 수 있음.
  • 다른 모델로 물으면 분포가 달라짐. 어느 모델의 "여론"을 믿어야 할까?

퀴즈

문제 1 / 5맞음: 0힌트: 0틀림: 0채점중: 0남음: 5

실리콘 샘플(silicon sample)이란?

  • ○실제 참가자의 인구 통계 배경을 조건으로 준 언어 모델의 응답으로 만든 가상의 표본
  • ○반도체 공정에서 뽑은 품질 검사용 표본
  • ○모델의 학습 데이터에서 무작위로 뽑은 문장
  • ○사람 참가자의 응답을 그대로 복사한 데이터

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.