본문으로 이동
모든 코스
ChicagoAI와 일200분4 모듈
최신 자료2026년 겨울학기

AI 가상 시민을 만들고, 믿지 않는 법 배우기

역할 프롬프트로 가상 행위자를 만들고 실제 라벨과 비교하되, 모델 대화를 사람 사회의 증거로 바꾸지 않는 검증법을 익힙니다.

AI 두 명의 정치 대화가 현실 시민의 행동을 얼마나 설명할 수 있을까요?

프로젝트와 최신성

University of Chicago Knowledge Lab의 2026년 수업 노트북을 고등학생용으로 축소했습니다. API 키를 요구하지 않고 가상 인물에는 실제 개인정보를 넣지 않습니다.

2026년 실제 수업 저장소지만 단일 완성 앱이 아니라 여러 노트북의 모음입니다. 저장소에 명시적 라이선스가 없고 원수업은 API 크레딧·GPU를 사용하므로, 이 과정은 Week 3의 사전 생성 결과만 사용합니다.

먼저 볼 장면

AI 두 명의 양극화 대화를 실제 여론처럼 발표하기

역할 지시가 만든 출력은 프롬프트와 모델의 산물입니다. 현실 시민에 대한 주장은 허가된 실제 자료와 비교하고 표본·측정 한계를 적어야 합니다.

데이터 흐름

사회 질문이 가상 응답과 검증표가 되는 길

1연구 질문주장 범위를 좁힘
2역할 프롬프트맥락·규칙·출력 지정
3언어 모델가상 응답 생성
4현실 비교실제 자료와 오차 비교
0/4

‘다음 단계’를 눌러 입력이 결과가 되는 길을 따라가세요.

구성요소 대화

가상 시민이 ‘사람처럼 보일’ 때의 대화

‘다음 단계’를 눌러 구성요소의 첫 메시지를 열어 보세요.

코드 워크스루

관심 분야의 문제를 정하고, 코드와 데이터를 읽고, AI 실험을 검증한 뒤 결과를 발표합니다.

45분

모델을 부르기 전에 비밀부터 지키기

API 키가 무엇인지, 왜 입력창으로만 받아야 하는지, 노출됐을 때 왜 폐기·재발급해야 하는지 배웁니다.

먼저 떠올릴 비유

호텔 객실 열쇠처럼, 화면에서 지웠다고 복사된 열쇠가 무효가 되는 것은 아닙니다.

핵심 판단

노트북은 `getpass`로 키를 화면에 드러내지 않고 받아 클라이언트에 전달합니다. 저장소나 결과 파일에는 키를 남기지 않습니다.

직접 해보기

키가 노출된 가상 사고에 대해 폐기, 재발급, 사용 내역 확인, 기록 제거 순서의 대응 카드를 만듭니다.

남길 증거

API 키 사고 대응 4단계 카드

코드 용어
저장소의 실제 코드이 파일에서 확인
Tutorials-Homework_Notebooks/Week_3.ipynba09c8ed
from openai import OpenAI
# Use this if running in Colab
OPENAI_API_KEY = getpass.getpass("Enter your OpenAI API key: ")
client = OpenAI(api_key=OPENAI_API_KEY)
코드가 하는 일
  1. 1

    OpenAI API용 클라이언트 클래스를 가져옵니다.

  2. 2

    Colab에서는 `getpass`가 입력한 키를 화면에 그대로 표시하지 않습니다.

  3. 3

    키를 클라이언트에 전달해 요청 준비를 마칩니다.

새 상황에 적용하기

실수로 API 키를 공개 GitHub에 올렸다가 파일에서 지웠습니다.

가장 먼저 해야 할 일은 무엇인가요?

45분

프롬프트를 실험 조건으로 기록하기

메시지 목록, 모델 이름, 응답 추출을 분리하고 조건이 달라질 때 결과가 왜 달라지는지 추적합니다.

먼저 떠올릴 비유

연극 대본의 역할·대사·무대 지시가 달라지면 같은 배우도 다른 장면을 만드는 것과 같습니다.

핵심 판단

`text_generate`는 메시지와 모델을 API에 보내고 첫 응답의 내용을 돌려줍니다. 모델·프롬프트·날짜를 기록해야 다시 비교할 수 있습니다.

직접 해보기

사전 생성 결과 두 묶음에서 역할 문장만 다른 조건을 비교하고 다른 설정이 섞이지 않았는지 확인합니다.

남길 증거

프롬프트 버전과 모델 버전이 있는 실험 로그

코드 용어
저장소의 실제 코드이 파일에서 확인
Tutorials-Homework_Notebooks/Week_3.ipynba09c8ed
from openai import OpenAI

client = OpenAI(
    api_key=openai.api_key,
)

def text_generate(messages):
    response = client.chat.completions.create(model="gpt-4o-mini", messages=messages)
    return response.choices[0].message.content
코드가 하는 일
  1. 1

    API 키가 연결된 클라이언트를 준비합니다.

  2. 2

    함수는 메시지 목록을 받아 `gpt-4o-mini`에 전달합니다.

  3. 3

    응답 후보 중 첫 메시지의 내용만 돌려줍니다.

새 상황에 적용하기

두 프롬프트 결과가 다르지만 한쪽은 다른 모델과 다른 날짜에 실행됐습니다.

결론 전에 해야 할 일은 무엇인가요?

50분

역할 대화는 현실 사회가 아니다

공화당·민주당 역할을 부여한 두 에이전트의 대화 코드를 읽고 프롬프트가 행동을 만드는 범위를 봅니다.

먼저 떠올릴 비유

마네킹 둘이 옷을 입었다고 거리의 사람들 취향을 조사한 것은 아닌 것과 같습니다.

핵심 판단

각 에이전트는 현실 정당 구성원이 아니라 `system` 역할 문장에 반응하는 같은 모델입니다. 대화는 가설 생성에는 유용하지만 인구 추정은 아닙니다.

직접 해보기

대화에서 프롬프트가 직접 유도했을 가능성이 있는 표현을 표시하고 현실 검증이 필요한 주장으로 바꿉니다.

남길 증거

가상 대화→검증 질문 변환표

코드 용어
저장소의 실제 코드이 파일에서 확인
Tutorials-Homework_Notebooks/Week_3.ipynba09c8ed
republican_agent = [{'role': 'system', 'content': "Assume that you are a Republican. Now, you are engaging in a virtual political discourse."},
                    {'role': 'user', 'content': 'Initiate the discourse.'}]
response = text_generate(republican_agent)
print('Republican:', response)
democrat_agent = [{'role': 'system', 'content': "Assume that you are a Democrat. Now, you are engaging in a virtual political discourse."},
                  {'role': 'user', 'content': response}]
response = text_generate(democrat_agent)
print('Democrat:', response)
코드가 하는 일
  1. 1

    첫 메시지가 모델에 공화당 역할을 주고 대화를 시작시킵니다.

  2. 2

    그 응답을 두 번째 에이전트의 사용자 메시지로 넘깁니다.

  3. 3

    두 번째 system message는 민주당 역할을 부여하지만 둘 다 실제 사람은 아닙니다.

새 상황에 적용하기

AI 두 명의 대화에서 강한 양극화가 나타났습니다.

가장 큰 해석 오류는 무엇인가요?

60분

실제 라벨과 비교하고도 겸손하게 쓰기

가상 투표와 관측 라벨을 F1으로 비교하고 작은 표본·대표성·공정성을 별도 한계로 남깁니다.

먼저 떠올릴 비유

예고편 몇 장면이 본편의 모든 인물을 대표하지 않는 것과 같습니다.

핵심 판단

F1은 두 분류의 일치 성능을 한 값으로 요약하지만 누가 빠졌는지, 왜 틀렸는지, 전국을 대표하는지는 알려 주지 않습니다.

직접 해보기

20개 사전 생성 응답의 혼동표를 만들고 F1과 함께 오류 사례 세 개를 질적으로 검토합니다.

남길 증거

점수·오류 사례·대표성 한계가 함께 있는 검증 노트

코드 용어
저장소의 실제 코드이 파일에서 확인
Tutorials-Homework_Notebooks/Week_3.ipynba09c8ed
observed_vote = df_sampled['vote_decision'].tolist()
predicted_vote = []
for i in tqdm(df_sampled['prompt'].tolist()):
    predicted_vote.append(text_generate([{'role': 'user', 'content': i}]))

from sklearn.metrics import f1_score
true_bool = [label == "Donald Trump" for label in observed_vote]
predicted_bool = [label == "Donald Trump" for label in predicted_vote]
f1_score(true_bool, predicted_bool)
코드가 하는 일
  1. 1

    관측된 투표 라벨을 목록으로 만들고 모델 예측을 차례로 수집합니다.

  2. 2

    관측값과 예측값을 같은 두 범주 기준의 참·거짓 목록으로 바꿉니다.

  3. 3

    마지막에 두 목록의 F1 점수를 계산합니다.

새 상황에 적용하기

20명 표본에서 F1이 0.9였습니다.

전국 예측 모델이라고 주장하기 전에 무엇이 더 필요한가요?

이번 코스의 결과물

사전 생성 에이전트 응답 감사 노트와 대표성 한계 문서

제출 전 확인

  • API 키나 실제 개인 식별정보를 사용하지 않았다.
  • 프롬프트·모델·실행 기준일을 기록했다.
  • 합성 응답을 실제 사람의 의견으로 표현하지 않았다.
  • F1 외에 오류 사례·표본·대표성 한계를 적었다.

7분 세미나 질문

AI 가상사회는 어떤 연구 질문에는 유용하고, 어떤 질문에는 구조적으로 답할 수 없나요?

다음 코스

직업을 없애는 질문 대신 업무를 다시 설계하기

과정 보기