먼저 볼 장면
AI 두 명의 양극화 대화를 실제 여론처럼 발표하기
역할 지시가 만든 출력은 프롬프트와 모델의 산물입니다. 현실 시민에 대한 주장은 허가된 실제 자료와 비교하고 표본·측정 한계를 적어야 합니다.
역할 프롬프트로 가상 행위자를 만들고 실제 라벨과 비교하되, 모델 대화를 사람 사회의 증거로 바꾸지 않는 검증법을 익힙니다.
AI 두 명의 정치 대화가 현실 시민의 행동을 얼마나 설명할 수 있을까요?
University of Chicago Knowledge Lab의 2026년 수업 노트북을 고등학생용으로 축소했습니다. API 키를 요구하지 않고 가상 인물에는 실제 개인정보를 넣지 않습니다.
2026년 실제 수업 저장소지만 단일 완성 앱이 아니라 여러 노트북의 모음입니다. 저장소에 명시적 라이선스가 없고 원수업은 API 크레딧·GPU를 사용하므로, 이 과정은 Week 3의 사전 생성 결과만 사용합니다.
역할 지시가 만든 출력은 프롬프트와 모델의 산물입니다. 현실 시민에 대한 주장은 허가된 실제 자료와 비교하고 표본·측정 한계를 적어야 합니다.
관심 분야의 문제를 정하고, 코드와 데이터를 읽고, AI 실험을 검증한 뒤 결과를 발표합니다.
API 키가 무엇인지, 왜 입력창으로만 받아야 하는지, 노출됐을 때 왜 폐기·재발급해야 하는지 배웁니다.
노트북은 `getpass`로 키를 화면에 드러내지 않고 받아 클라이언트에 전달합니다. 저장소나 결과 파일에는 키를 남기지 않습니다.
키가 노출된 가상 사고에 대해 폐기, 재발급, 사용 내역 확인, 기록 제거 순서의 대응 카드를 만듭니다.
API 키 사고 대응 4단계 카드
a09c8edfrom 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)OpenAI API용 클라이언트 클래스를 가져옵니다.
Colab에서는 `getpass`가 입력한 키를 화면에 그대로 표시하지 않습니다.
키를 클라이언트에 전달해 요청 준비를 마칩니다.
실수로 API 키를 공개 GitHub에 올렸다가 파일에서 지웠습니다.
먼저 한 가지를 골라 보세요.
메시지 목록, 모델 이름, 응답 추출을 분리하고 조건이 달라질 때 결과가 왜 달라지는지 추적합니다.
`text_generate`는 메시지와 모델을 API에 보내고 첫 응답의 내용을 돌려줍니다. 모델·프롬프트·날짜를 기록해야 다시 비교할 수 있습니다.
사전 생성 결과 두 묶음에서 역할 문장만 다른 조건을 비교하고 다른 설정이 섞이지 않았는지 확인합니다.
프롬프트 버전과 모델 버전이 있는 실험 로그
a09c8edfrom 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.contentAPI 키가 연결된 클라이언트를 준비합니다.
함수는 메시지 목록을 받아 `gpt-4o-mini`에 전달합니다.
응답 후보 중 첫 메시지의 내용만 돌려줍니다.
두 프롬프트 결과가 다르지만 한쪽은 다른 모델과 다른 날짜에 실행됐습니다.
먼저 한 가지를 골라 보세요.
공화당·민주당 역할을 부여한 두 에이전트의 대화 코드를 읽고 프롬프트가 행동을 만드는 범위를 봅니다.
각 에이전트는 현실 정당 구성원이 아니라 `system` 역할 문장에 반응하는 같은 모델입니다. 대화는 가설 생성에는 유용하지만 인구 추정은 아닙니다.
대화에서 프롬프트가 직접 유도했을 가능성이 있는 표현을 표시하고 현실 검증이 필요한 주장으로 바꿉니다.
가상 대화→검증 질문 변환표
a09c8edrepublican_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)첫 메시지가 모델에 공화당 역할을 주고 대화를 시작시킵니다.
그 응답을 두 번째 에이전트의 사용자 메시지로 넘깁니다.
두 번째 system message는 민주당 역할을 부여하지만 둘 다 실제 사람은 아닙니다.
AI 두 명의 대화에서 강한 양극화가 나타났습니다.
먼저 한 가지를 골라 보세요.
가상 투표와 관측 라벨을 F1으로 비교하고 작은 표본·대표성·공정성을 별도 한계로 남깁니다.
F1은 두 분류의 일치 성능을 한 값으로 요약하지만 누가 빠졌는지, 왜 틀렸는지, 전국을 대표하는지는 알려 주지 않습니다.
20개 사전 생성 응답의 혼동표를 만들고 F1과 함께 오류 사례 세 개를 질적으로 검토합니다.
점수·오류 사례·대표성 한계가 함께 있는 검증 노트
a09c8edobserved_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)관측된 투표 라벨을 목록으로 만들고 모델 예측을 차례로 수집합니다.
관측값과 예측값을 같은 두 범주 기준의 참·거짓 목록으로 바꿉니다.
마지막에 두 목록의 F1 점수를 계산합니다.
20명 표본에서 F1이 0.9였습니다.
먼저 한 가지를 골라 보세요.
이번 코스의 결과물
AI 가상사회는 어떤 연구 질문에는 유용하고, 어떤 질문에는 구조적으로 답할 수 없나요?
다음 코스