연구 질문(1강)과 가설(2강)이 준비되었다면, 이제 그 가설을 실제로 시험할 장치를 만들 차례다. 이 장치가 실험 설계이며, 핵심은 단 하나다. "내가 바꾼 것 때문에 결과가 달라졌다"고 말할 수 있는 구조를 만드는 것이다.
실험은 결국 변수(variable) 사이의 관계를 확인하는 일이다. 실험에 등장하는 변수는 역할에 따라 세 종류로 나뉜다.
| 종류 | 정의 | 실험에서의 역할 |
|---|---|---|
| 독립변수(independent variable) | 연구자가 의도적으로 바꾸는 값 | 원인 후보 |
| 종속변수(dependent variable) | 그 결과로 달라지는지 관찰하는 값 | 결과 측정치 |
| 통제변수(control variable) | 결과에 영향을 줄 수 있어 고정하는 값 | 잡음 차단 |
"한국어 초성 줄임말(예: ㅇㅈ, ㄱㅅ)을 LLM이 이해하는가"를 4지선다로 평가하는 실험을 예로 들면 다음과 같다.
여기서 중요한 구분이 하나 있다. 독립변수는 연구자가 **조작(manipulation)**하는 값이고, 종속변수는 측정하는 값이다. 실험 하나에서 조작하는 독립변수는 가능한 한 하나로 유지한다. 모델도 바꾸고 프롬프트도 바꾸고 문항도 바꿨는데 정답률이 올랐다면, 무엇 덕분인지 말할 수 없기 때문이다. 이렇게 독립변수와 함께 몰래 따라 움직이며 결과를 오염시키는 변수를 교란변수(confounding variable)라 부르며, 실험 설계의 절반은 교란변수를 찾아 묶어두는 일이다.
변수를 정했으면, 각 변수를 어떻게 재는지를 구체적 절차로 못박아야 한다. 이를 조작적 정의(operational definition)라 한다. "LLM의 초성 이해 능력"은 그 자체로는 측정할 수 없는 추상 개념이다. 조작적 정의를 거치면 이렇게 바뀐다.
초성 이해 능력 := 초성 줄임말의 원어 의미를 묻는 4지선다 문항 N개에 대해, 모델 응답에서 파싱한 선택지가 정답과 일치하는 비율
이 정의에는 문항 형식, 문항 수, 응답 파싱 방법, 채점 규칙이 모두 들어 있다. 조작적 정의가 느슨하면 같은 실험을 두 사람이 돌려도 다른 숫자가 나온다. 정답(gold)을 만드는 절차와 주석 일치도는 5강에서, 측정치가 실력을 왜곡하는 함정들은 7강에서 다룬다.
주의: 조작적 정의는 개념을 축소한다. 4지선다 정답률은 "이해"의 한 단면일 뿐이며, 논문에서도 결론은 조작적 정의의 범위 안에서만 주장해야 한다. "4지선다에서 초성을 원어 수준으로 맞힌다"고 말할 수 있을 뿐, "초성을 이해한다"는 더 큰 주장으로 건너뛰면 안 된다.
독립변수를 적용한 집단이 실험군(experimental group), 적용하지 않은 채 나머지 조건을 동일하게 맞춘 집단이 대조군(control group)이다. 의학에서 신약을 먹는 집단과 위약을 먹는 집단을 나누는 것과 같은 구조다.
왜 대조군이 반드시 필요한가. 초성 줄임말 실험에서 어떤 모델이 정답률 62%를 기록했다고 하자. 이 숫자 하나만으로는 아무 해석도 할 수 없다.
같은 62%가 비교 대상에 따라 정반대의 결론을 낳는다. 즉 숫자는 비교 구조 안에서만 의미를 갖는다. 단독으로 제시된 성능 수치는 자랑일 수는 있어도 증거는 아니다.
대조군을 설계할 때의 원칙은 "독립변수 말고는 전부 동일하게"다. 실험군과 대조군이 문항 세트도 다르고 프롬프트도 다르다면, 그 비교는 이미 무너져 있다. 프롬프트 템플릿·보기 위치·디코딩 설정을 조건 간에 공정하게 맞추는 구체적 기법은 19강에서 다룬다.
ML·LLM 연구에서는 실험군·대조군이라는 말 대신 arm과 baseline이라는 용어를 주로 쓴다.
두 조건만 비교하는 실험은 arm이 2개(제안 조건 + baseline)지만, 실제 연구에서는 arm이 더 많아지는 경우가 흔하다. 초성 줄임말 실험이라면 다음과 같은 arm 구성이 가능하다.
| arm | 입력 형태 | 역할 |
|---|---|---|
random |
없음 | 무작위 찍기 하한선 (25%) |
plain |
원어 그대로 | 상한선에 가까운 참조점 |
choseong |
초성 줄임말 | 관심 조건 |
choseong_hint |
초성 + 맥락 힌트 | 힌트 효과 확인 |
좋은 baseline의 조건은 두 가지다. 첫째, 사소한(trivial) baseline을 반드시 포함한다: 무작위 선택, 최빈 답 고르기 같은 것. 제안 방법이 이것조차 크게 못 이기면 문항 설계부터 다시 봐야 한다. 둘째, 강한 baseline을 피하지 않는다. 일부러 약한 상대만 세워 이기는 것은 자기기만이며, 리뷰어가 가장 먼저 지적하는 부분이다.
이 연구실의 파이프라인에서는 arm 정의가 conf/arms.yaml 한 곳에 모이고, 학습 스테이지가 그 목록을 순회한다. arm을 코드 곳곳에 흩어두지 않고 한 파일에 선언하는 이유도 결국 비교 구조를 한눈에 검증 가능하게 만들기 위해서다. 파이프라인 전체 구조는 20강에서 다룬다.
arm 설계의 특수한 형태로 절제 실험(ablation study)이 있다. 제안 방법에서 구성 요소를 하나씩 빼면서, 각 요소가 성능에 실제로 기여하는지 확인하는 비교다. "힌트 + few-shot 예시"를 넣은 조건이 잘 됐다면, 힌트만 뺀 arm과 예시만 뺀 arm을 추가로 돌려 어느 쪽이 효과의 원천인지 분리한다. 구조적으로는 "독립변수를 하나씩만 움직인다"는 원칙을 요소 단위로 적용한 것이다.
통제(control)한다는 말은 "독립변수 이외에 결과를 설명할 수 있는 후보를 미리 제거한다"는 뜻이다. 실험이 끝난 뒤 "혹시 이것 때문 아니냐"는 질문이 나올 수 있다면, 그 질문은 실험 전에 설계로 봉쇄했어야 한다.
통제가 무엇인지 보여주는 가장 유명한 사례는 20세기 초 독일의 말 "영리한 한스(Clever Hans)"다. 이 말은 산수 문제를 내면 발굽을 두드려 정답 횟수만큼 답하는 것처럼 보였고, 대중과 일부 학자들까지 말이 계산을 한다고 믿었다. 그러나 심리학자가 조건을 하나씩 통제하며 검증한 결과(질문자가 답을 모르는 조건, 말이 질문자를 볼 수 없는 조건) 한스의 정답률은 무너졌다. 말은 계산을 한 것이 아니라, 정답 횟수에 도달했을 때 질문자가 무의식적으로 보이는 긴장 완화의 신호를 읽고 있었던 것이다.
이 사례가 지금까지 인용되는 이유는, "결과가 나왔다"와 "내가 생각한 이유로 결과가 나왔다"가 전혀 다른 명제임을 보여주기 때문이다. 한스는 실제로 높은 정답률을 냈다. 문제는 정답률이 아니라 그 정답률의 원인이었고, 원인은 통제된 비교로만 가려낼 수 있었다.
같은 구조의 문제가 LLM 평가에서 반복된다. 자연어 추론 벤치마크에서 높은 점수를 받던 언어모델이, 사실은 논증을 이해한 것이 아니라 "not" 같은 특정 단어의 출현 패턴이라는 표면 단서를 이용하고 있었음이 통제 실험으로 드러난 연구가 널리 알려져 있다. 단서를 제거한 대조 문항에서 성능이 무작위 수준으로 떨어진 것이다. 연구 커뮤니티가 이런 현상을 "Clever Hans 효과"라고 부르는 것은 우연이 아니다.
초성 줄임말 실험에도 같은 함정이 있다. 모델이 초성을 "이해"한 것인지, 보기 넷 중 셋이 명백히 어색해서 소거법으로 맞힌 것인지, 유명한 줄임말이라 학습 데이터에서 답을 통째로 외운 것인지는 정답률만으로 구별되지 않는다. 각각을 가려내려면 오답 보기의 그럴듯함을 통제한 문항, 학습 컷오프 이후 생긴 신조어로 층화한 비교(18강) 같은 추가 설계가 필요하다.
LLM 실험에서 조건 간에 고정해야 할 대표적 항목은 다음과 같다.
통제의 마지막 조각은 조작 확인(manipulation check)이다. 독립변수를 바꿨다고 믿는 것과 실제로 바뀐 것은 다르다. 초성 실험이라면 이런 점검이 해당한다.
plain arm의 입력에 초성이 섞여 들어가지 않았는가조작 확인 없이 "초성 조건과 원어 조건의 차이가 없었다"는 결과를 얻으면, 그것이 모델의 능력 때문인지 조작이 실패해서 두 조건이 사실상 같아졌기 때문인지 구별할 수 없다. 각 arm의 실제 입력 몇 개를 눈으로 확인하는 절차를 파이프라인에 넣어 두는 것이 실무적 해법이다.
한편 조건을 서로 다른 문항 집단에 줄지, 같은 문항 전체에 모든 조건을 적용할지도 설계 선택이다. LLM 실험은 사람 실험과 달리 같은 문항에 모든 arm을 적용하는 것이 대체로 가능하고, 이렇게 짝지은 비교는 통계적으로도 훨씬 강력하다. 그 이유와 대응(paired) 검정은 11강에서 다룬다.
코드를 만들기 전에, 다음 다섯 줄을 채운 설계 표를 먼저 작성한다.
초성 줄임말 실험으로 채우면 다음과 같은 모양이 된다.
| 항목 | 내용 |
|---|---|
| 독립변수 | 입력 형태 (초성 vs 원어) |
| 종속변수 | 4지선다 정답률 (파싱 규칙 포함한 조작적 정의로) |
| arm 목록 | random(하한선), plain(참조점), choseong(관심 조건), choseong_hint(힌트 효과) |
| 통제 항목 | 문항 세트, 프롬프트 템플릿, 보기 순서 배치, 디코딩 설정, 시드, 채점 규칙 |
| 예상 반론 | "유명 줄임말은 암기로 맞힌 것" → 컷오프 이후 신조어 층화 / "소거법으로 맞힌 것" → 오답 보기 그럴듯함 통제 |
5번이 비어 있지 않은 설계가 좋은 설계다. 반론을 설계 단계에서 적어두면, 그 반론이 곧 추가 arm이나 통제 항목이 된다. 이 표는 2강의 반증 조건, 14강의 사전 등록과 자연스럽게 이어진다. 결과를 보기 전에 고정한 설계만이 결과를 해석할 자격을 준다.