persona-LDT
Overview / 개요
한국어 어휘 판단 과제(LDT)의 AI 시뮬레이션 실험
LLM(Claude)에게 실제 참가자의 인구통계 정보와 단어 속성을 제공하고, 어휘 판단 과제(Lexical Decision Task)에서의 반응시간(RT)과 정답여부를 예측하게 하는 실험이다.
연구 질문
LLM이 인간 참가자의 인구통계적 특성과 단어의 심리언어학적 속성을 기반으로
한국어 어휘 판단 과제의 반응시간 및 정확도 패턴을 현실적으로 시뮬레이션할 수 있는가?
Background / 연구 배경
어휘 판단 과제 (Lexical Decision Task)
어휘 판단 과제(LDT)는 인지심리학에서 어휘 접근(lexical access) 과정을 연구하는 대표적 실험 패러다임이다. 참가자는 화면에 제시된 문자열이 실제 단어인지 비단어인지를 최대한 빠르고 정확하게 판단한다.
- 반응시간(RT): 어휘 접근의 용이성을 반영하는 핵심 종속변수
- 정답여부: 어휘 표상의 존재 및 접근 가능성을 반영
AI 시뮬레이션 동기
전통적 LDT 실험은 대규모 참가자 모집, 실험실 환경 통제, 시간 및 비용 등의 제약이 있다. LLM을 활용한 시뮬레이션은 다음을 탐색한다:
- LLM이 심리언어학적 변수와 반응시간 간의 관계를 학습 데이터로부터 내재화했는지
- 인구통계 변수(나이, 교육, 성별)에 따른 차이를 재현할 수 있는지
- 이론적 원칙 제공 여부가 시뮬레이션 품질에 미치는 영향
KLP2 (Korean Lexicon Project 2)
본 실험의 입력 데이터는 KLP2에서 수집된 한국어 단어 속성 데이터를 기반으로 한다. KLP2는 한국어 단어의 심리언어학적 속성(빈도, 친숙성, 구체성, 상상가능성, 정서가, 각성가 등)을 대규모로 수집한 프로젝트이다.
Experimental Design / 실험 설계
독립변수
참가자 변수 (Between-subjects)
| 변수 | 설명 | 코딩 |
|---|
age | 나이 | 연속 (세) |
gender | 성별 | 1=남성, 2=여성 |
education | 교육 수준 | 17 (초등박사) |
aver_CRH | 평균 읽기 습관 점수 | 연속 |
단어 변수 (Within-subjects)
| 변수 | 설명 | 단위 |
|---|
length | 단어 길이 | 음절 수 |
log_type_freq | 로그 단어 빈도 | 로그 변환값 |
의미이해 | 의미 이해 정도 | 평정치 |
친숙성 | 단어 친숙성 | 평정치 |
구체성 | 구체성 정도 | 평정치 |
상상가능성 | 심상 용이성 | 평정치 |
정서가 | 정서적 가치 | 평정치 |
각성가 | 각성 수준 | 평정치 |
종속변수
| 변수 | 설명 | 범위 |
|---|
predicted_rt | 예측 반응시간 | 약 400~2000ms |
predicted_correct | 예측 정답여부 | 1=정답, 0=오반응 |
실험 구조
- 과제: 모든 자극은 실제 한국어 단어 (정답 = 항상 ‘a’ 키)
- 단위: List별 배치 처리 (참가자 그룹 × 단어 세트)
- 설계: 참가자 변수 × 단어 변수 완전 교차
Version Comparison / 버전 비교
본 실험은 두 버전으로 구성되어 예측 원칙(이론적 가이드) 제공 여부의 효과를 비교한다.
| 구분 | 버전 A (현재 구현) | 버전 B (비교 조건) |
|---|
| 이름 | 예측 원칙 포함 | 예측 원칙 미포함 |
| System Prompt | LDT 이론 기반 예측 원칙 제공 | 과제 설명만 제공, 원칙 없음 |
| 기대 효과 | 이론 정합적 예측 | LLM 자체 내재 지식 기반 예측 |
| 비교 목적 | 명시적 이론 가이드가 시뮬레이션 품질을 향상시키는지 검증 | |
비교 분석 포인트
- RT 분포의 현실성 (실제 인간 데이터와의 유사도)
- 단어 빈도 효과(word frequency effect)의 재현 정도
- 참가자 변수에 따른 개인차 패턴의 일치도
- 정답률의 현실성
Prediction Principles / 예측 원칙
버전 A의 system prompt에 포함된 예측 원칙은 다음과 같다:
반응시간(RT) 원칙
- 현실적 범위: 실제 한국어 LDT 데이터의 범위 (약 400~2000ms)
- 단어 빈도 효과:
log_type_freq가 높을수록 RT 감소 (가장 강한 예측변수)
- 단어 길이 효과:
length(음절 수)가 길수록 RT 증가
- 친숙성/의미이해 효과: 점수가 높을수록 RT 감소
- 연령 효과: 나이가 많을수록 RT 증가 (인지 처리 속도 저하)
- 교육 효과: 교육 수준이 높을수록 RT 감소
- 읽기 습관 효과: CRH 점수가 높을수록 RT 감소
- 한국어 특성: 교착어 구조, 음절 구조, 한자어 vs 고유어 고려
- 개인차: 같은 list 내에서도 참가자 특성에 따라 RT 차이 발생
정답여부 원칙
- 전체 정확률: 실제 LDT 정확률 수준 (85~98%)
- 단어 속성 효과: 낮은 빈도·친숙성 단어에서 오반응 증가
- 참가자 효과: 고령·저학력·저CRH 참가자일수록 오반응 확률 증가
Technical Implementation / 기술 구현
아키텍처
[KLP2 CSV 데이터]
│
▼
[Pandas: List별 그룹핑]
│
▼ (List 단위 배치)
[Prompt 구성] ──→ System Prompt (과제 설명 + 예측 원칙)
│ User Prompt (참가자 정보 + 단어 정보)
▼
[Claude API 호출] ──→ claude-sonnet-4-5
│ 비동기 처리 (httpx + asyncio)
│ 동시 처리: Semaphore(WORKERS)
▼
[JSON 응답 파싱]
│
▼
[CSV 저장 + 체크포인트]
모델 및 파라미터
| 파라미터 | 값 | 설명 |
|---|
MODEL | claude-sonnet-4-5 | Anthropic Claude Sonnet 4.5 |
MAX_TOKENS | 4096 | 최대 출력 토큰 수 |
RETRY_LIMIT | 3 | API 호출 재시도 횟수 |
RETRY_DELAY | 10 | 재시도 대기 시간 (초) |
WORKERS | 3 (설정 가능) | 동시 처리 List 수 |
BATCH | 10 | 배치당 처리 List 수 |
데이터 흐름
- 데이터 로드: KLP2 CSV (
euc-kr 인코딩) → Pandas DataFrame
- 그룹핑:
Linklist 기준으로 참가자-단어 조합 구성
- 프롬프트 생성: 참가자 정보 (인구통계) + 단어 정보 (8개 속성) → 구조화된 프롬프트
- API 호출: 비동기 HTTP 요청, Rate Limit 대응 (429 → 점진적 대기)
- 응답 파싱: JSON 추출 (코드블록 또는 raw JSON)
- 결과 저장: CSV 파일 (증분 저장,
utf-8-sig)
- 체크포인트: 완료된 List ID를 JSON으로 저장, 중단 후 재시작 지원
프롬프트 구조
System Prompt
[과제 설명] → LDT 과제의 절차와 키 매핑 설명
[예측 원칙] → RT 및 정답여부 예측 규칙 (버전 A에서만)
[출력 형식] → JSON 스키마 지정
User Prompt
[List: {list_id}]
{N}명의 참가자가 {M}개의 한국어 단어를 보고 어휘 판단 과제를 수행했습니다.
[참가자 정보 — N명]
- PMI_ID {id}: {age}세, {gender}, 교육={education}, CRH={crh}
[단어 정보 — M개]
1. '{stimulus}' | 길이:{length}음절 | log빈도:{freq} | 의미이해:{val} | ...
모든 N×M개 조합을 JSON으로 출력하세요.
Data Specification / 데이터 명세
입력 파일
| 항목 | 값 |
|---|
| 파일명 | raw_data_KLP2_modify_2_.csv |
| 인코딩 | euc-kr |
| 위치 | Google Drive (/content/drive/MyDrive/) |
주요 컬럼
| 컬럼명 | 설명 | 역할 |
|---|
PMI_ID | 참가자 고유 ID | 참가자 식별 |
Linklist | List 그룹 ID | 배치 처리 단위 |
stimulus | 자극 단어 | 예측 대상 |
age | 나이 | 참가자 변수 |
gender | 성별 (1=남, 2=여) | 참가자 변수 |
education | 교육 수준 (1~7) | 참가자 변수 |
aver_CRH | 평균 읽기 습관 | 참가자 변수 |
length | 단어 길이 (음절) | 단어 변수 |
log_type_freq | 로그 단어 빈도 | 단어 변수 |
의미_이해 | 의미 이해 점수 | 단어 변수 |
친숙성 | 친숙성 점수 | 단어 변수 |
구체성 | 구체성 점수 | 단어 변수 |
상상가능성 | 상상가능성 점수 | 단어 변수 |
정서가 | 정서가 점수 | 단어 변수 |
각성가 | 각성가 점수 | 단어 변수 |
출력 파일
| 항목 | 값 |
|---|
| 파일명 | ldt_predictions.csv |
| 인코딩 | utf-8-sig |
출력 컬럼
| 컬럼명 | 설명 |
|---|
PMI_ID | 참가자 ID |
list_id | List 그룹 ID |
stimulus | 자극 단어 |
predicted_rt | 예측 반응시간 (ms) |
predicted_correct | 예측 정답여부 (1/0) |
체크포인트 파일
| 항목 | 값 |
|---|
| 파일명 | ldt_checkpoint.json |
| 형식 | {"completed_lists": [list_id, ...]} |
| 용도 | 중단 후 재시작 시 완료된 List 건너뛰기 |
Execution Environment / 실행 환경
플랫폼
- Google Colab (Jupyter Notebook 환경)
- Google Drive 마운트 필요 (
/content/drive/MyDrive/)
필수 패키지
| 패키지 | 용도 |
|---|
httpx | 비동기 HTTP 클라이언트 (API 호출) |
pandas | 데이터 처리 |
asyncio | 비동기 처리 |
json | JSON 파싱 |
API 요구사항
- Anthropic API Key 필요
- 설정 방법: 직접 입력 또는 Colab Secrets (
ANTHROPIC_API_KEY)
- API 버전:
2023-06-01
실행 절차
- Google Colab에서 노트북 열기
- 셀 1: 패키지 설치 (
httpx)
- 셀 2: Google Drive 마운트
- 셀 3: API 키 및 파일 경로 설정
- 셀 4: KLP2 데이터 로드 및 확인
- 셀 5: 시뮬레이션 실행 (비동기)
- 셀 6: 결과 확인 및 저장
Appendix / 부록
교육 수준 매핑 테이블
| 코드 | 교육 수준 |
|---|
| 1 | 초등학교 졸업 |
| 2 | 중학교 졸업 |
| 3 | 고등학교 졸업 |
| 4 | 전문대 졸업 |
| 5 | 대학교 졸업 |
| 6 | 석사 졸업 |
| 7 | 박사 졸업 |
성별 매핑 테이블
JSON 응답 스키마
{
"results": [
{
"pmi_id": 123,
"stimulus": "단어",
"rt": 650,
"correct": 1
}
]
}