문항 하나가 출고되기까지, 실제 입력과 출력
직접 쓴 영어 지문을 실제 워크북 제작 라인에 넣고 어휘 문항 하나를 따라갔습니다. 첫 출력, 코드 검사, 다른 모델의 검수 지적, 수정본과 재검수 결과를 그대로 보여 드리고, 출고 영수증은 실제로 나간 워크북의 기록으로 보여 드립니다.
AI가 처음 쓴 오답 rehearsal은 코드 검사를 다 통과했지만, 다른 모델모델 model AI의 '두뇌' 하나하나를 부르는 말. 같은 회사도 크기·성능별로 여러 모델을 냅니다.의 검수에서 “이 오답을 넣어도 글이 말이 된다”는 이유로 걸렸습니다. 걸린 문항 하나만 고친 오답 forgiving은 5.6초 만에 재검수를 통과했습니다. 이 글은 그 문항 하나가 계약, 작성, 코드 검사, 검수, 수정을 거치는 동안 실제로 들어간 것과 나온 것을 순서대로 보여 줍니다.
하루 만에 190쪽 워크북을 낸 기록에서는 문항 4,393개, 검수 지적 306건 같은 큰 숫자만 적었습니다. 이번에는 반대로 문항 하나만 봅니다. 예시 지문은 시험이나 교재 지문이 아니라 이 글을 위해 제가 직접 쓴 143단어짜리 영어 글입니다.
이 지문을 10월 9일 실제 워크북 라인의 작성·검사·검수·수정 코드에 넣어 돌렸고, 아래 JSONJSON 제이슨 프로그램끼리 데이터를 주고받는 글 형식. 항목 이름과 값을 짝지어 적습니다.은 그때 나온 출력을 줄인 것입니다. 시연은 재검수에서 멈췄습니다. 마지막 조판과 출고는 9월 27일에 실제로 나간 워크북의 영수증으로 대신 보여 드립니다.
오늘 따라갈 문항
문항 제작을 보여 주려고 쓴 예시 지문입니다. 익숙한 내용을 실제로 기억하는 것과 혼동하는 상황을 소재로 삼았습니다.
Many students believe that rereading a chapter the night before a test is the safest way to prepare. The pages feel familiar, and that familiarity is easily mistaken for knowledge. Researchers call this the fluency illusion: because the words are easy to process, readers assume they will be easy to recall. Recall, however, is a different task. When a test asks students to produce an answer without the page in front of them, the comfortable feeling quickly disappears. A more effective habit is to close the book and try to retrieve the main ideas from memory. This feels slower and more frustrating, but the effort itself strengthens the memory. Spacing these attempts over several days helps even more, since each retrieval happens after a little forgetting. In short, the study methods that feel productive are not always the ones that produce lasting learning.
워크북에서는 지문 속 낱말 몇 개가 네모 안의 두 낱말로 바뀝니다. 이 글에서 따라갈 자리는 여덟 번째 문장의 forgetting입니다. 수정이 끝난 문항을 학생용 모양으로 표시하면 이렇습니다.
Spacing these attempts over several days helps even more, since each retrieval happens after a little [ forgiving / forgetting ].
1단계. 계약: 쓰기 전에 정해 두는 출제 규칙
여기서 계약은 문항을 만들기 전에 정해 두는 출제 규칙입니다. AI에게 “어휘 문제 만들어”라고 하지 않고, 보기 수와 정답 조건처럼 지켜야 할 기준을 유형마다 먼저 적어 둡니다. 이 문항의 유형은 워크북의 ‘어휘 선택’입니다. 계약 파일에는 항목이 더 많지만, 핵심은 여섯 가지입니다.
| 항목 | 어휘 선택 유형의 계약 |
|---|---|
| 출제 의도 | 지문 안 여러 자리에서, 문맥에 맞는 낱말을 그럴듯한 두 낱말 중에서 고른다 |
| 표시 개수 | 지문 길이로 정한다. 140~169단어면 9개, 170단어 이상이면 10개 |
| 선지 개수 | 자리마다 2개. 둘 다 같은 품사·같은 형태로 그 자리에 문법적으로 들어가야 한다 |
| 정답 개수 | 자리마다 1개. 나머지 하나는 문맥상 틀려야 한다 |
| 화면에 보이는 방식 | ”네모 안의 두 낱말 중 글의 흐름에 맞는 것을 골라 ○표 하시오.” 정답이 왼쪽·오른쪽에 오는 횟수 차이는 1 이하, 같은 쪽 연속은 2번까지 |
| 비슷한 유형과의 차이 | 어법 선택은 뜻을 유지한 채 형태만 틀리게 만든다. 어휘 선택은 형태는 맞고 뜻이 틀려야 한다 |
계약에는 금지 목록도 붙어 있습니다. 정답 앞에 not을 붙인 오답, 사전에 없는 낱말, 문맥을 안 읽어도 걸러지는 엉뚱한 낱말, 두 낱말 다 말이 되는 자리는 쓰지 않습니다.
이 지문은 143단어라서 어휘 선택 자리가 9개로 정해졌습니다. 이 숫자는 모델이 정하지 않습니다. 코드가 지문 길이로 계산해서 작성 지시에 넣습니다. 같은 지문에서 어법 선택과 빈칸 활동 문항도 함께 나오지만, 이 글에서는 어휘 한 문항만 따라갑니다.
2단계. AI가 쓴 것
작성 모델은 GPTGPT 지피티 OpenAI가 만든 AI 모델 이름. ChatGPT 안에서 돌아가는 모델입니다.-6 SolSol 솔 OpenAI GPT 계열의 상위 모델 중 하나. 깊게 생각하는 작업에 강합니다.(사고 강도 중간)입니다. 위 지문과 규칙을 받고 한 번의 호출로 이 지문의 문항 38개(어휘 9, 어법 7, 빈칸 11개씩 둘)와 해설을 냈습니다. 74.7초 걸렸습니다.
아래는 프로그램이 읽는 문항 기록입니다. 학생에게 보이는 화면이 아니라 정답, 오답, 해설을 항목별로 저장한 것입니다. 따라갈 문항의 첫 출력입니다.
{
"correct": "forgetting",
"distractor": "rehearsal",
"mechanism": "DM_LEXICAL_LURE",
"why_wrong_ko": "며칠 간격으로 회상하면 조금 잊은 뒤 다시 꺼내게 된다는 설명을 사전 반복 연습으로 바꿉니다.",
"plausibility_ko": "반복 연습도 기억력 향상과 관련된 활동이므로 회상 앞에 놓일 법해 보입니다.",
"occurrence": 1
}
위에서부터 정답, 오답, 오답의 종류, 왜 틀렸는지, 왜 끌리는지입니다. occurrence는 같은 낱말이 지문에 여러 번 나올 때 몇 번째인지 적는 칸입니다. 오답 종류는 미리 등록된 8개 코드 중에서만 고를 수 있고, DM_LEXICAL_LURE는 관련 있어 보여 고르기 쉬운 오답이라는 뜻입니다.
3단계. 형식은 코드가 봅니다
모델이 낸 결과는 검수 모델에게 가기 전에 코드 검사부터 받습니다. 개수가 계약과 맞는지, 정답이 지문에 실제로 있는 낱말인지, 오답과 정답이 같은 낱말은 아닌지, 같은 활동 안에서 자리가 겹치지 않는지, 오답 종류 코드가 등록된 것인지 봅니다.
이번 출력의 결과는 통과였습니다.
{ "unit_id": "DEMO_SELF_WRITTEN_FLUENCY-S1", "pass": true, "violations": [] }
걸리면 어떻게 나오는지 보려고 출력 사본에 일부러 세 군데 흠을 냈습니다. 정답 철자를 forgeting으로 바꾸고, 어법 문항 하나의 오답을 정답과 똑같이 만들고, 빈칸 문항 둘을 지웠습니다.
vocabulary_answer_not_in_source
grammar_identical_choices
count.plain_blanks[DEMO_SELF_WRITTEN_FLUENCY-S1]: 9!=11
세 줄은 차례로 ‘정답 낱말이 원문에 없음’, ‘두 보기가 같음’, ‘빈칸이 목표 11개보다 두 개 모자람’이라는 뜻입니다. 실제 출력은 같은 원인을 다른 각도로 적은 줄까지 여섯 줄인데, 세 줄만 옮겼습니다. 이런 형식 문제로 모델을 다시 부르지 않는 이유는 AI에게는 쓰는 일만 맡깁니다에 정리해 두었습니다.
코드가 통과시켰다고 문항이 맞는 건 아닙니다. rehearsal은 철자도, 개수도, 형식도 다 맞았습니다.
4단계. 다른 모델이 오답을 원문 자리에 넣어 봅니다
검수는 작성에 쓰지 않은 모델이 합니다. 9월 27일 워크북과 같은 설정인 GPT-6 LunaLuna 루나 OpenAI GPT 계열의 가볍고 저렴한 모델. 이 블로그의 해설서 도구가 쓰는 모델입니다.(사고 강도 높음)로 돌렸습니다. 검수 모델은 지문 전체와 정답이 포함된 작성 결과를 받고, 오답을 원문 자리에 넣어 지문 전체의 설명과 맞는지 확인합니다. 오답을 넣은 문장도 지문 전체의 설명과 맞는다면, 하나만 정답이라고 하기 어렵습니다.
21.9초 뒤에 나온 판정입니다. 통과한 세 항목은 줄였습니다.
{
"checks": [
{
"id": "choice_is_valid_contrast",
"pass": false,
"evidence": "Vocabulary item “forgetting” fails: replacing it with “rehearsal” yields “since each retrieval happens after a little rehearsal,” which remains a plausible explanation in context."
}
],
"verdict": "fail",
"defective_items": [
{
"family": "vocabulary",
"target": "forgetting",
"reason": "The distractor “rehearsal” produces a plausible sentence and does not clearly contrast with the source explanation."
}
]
}
맞는 지적입니다. “조금 연습한 뒤에 다시 꺼내 보면 더 도움이 된다”도 말이 됩니다. rehearsal을 고른 학생에게 오답인 이유를 분명하게 설명하기 어렵습니다.
작성 지시에도 같은 규칙이 이미 있었습니다. “오답을 원문 자리에 넣어 읽어 보고 문장이 성립하면 버려라.” 쓴 모델은 이 규칙을 받고도 통과시켰고, 다른 모델이 잡았습니다. 같은 규칙이라도 쓰는 쪽과 보는 쪽을 나누는 이유입니다.
판정의 defective_items가 다음 단계의 입력이 됩니다. 어느 활동의 어느 문항인지 정답 낱말 그대로 적혀 있어서, 코드가 그 행을 정확히 찾아갑니다.
5단계. 걸린 문항만 고칩니다
코드가 먼저 판단합니다. 형식 검사는 통과했고, 실패가 문항 하나에 한정된 검사에서만 나왔고, 지목된 문항이 실제 행과 정확히 맞으면 그 문항만 고치는 길로 보냅니다. 이 지문에서 만든 문항 전체를 다시 쓰게 하지 않습니다.
수정 모델에게 가는 목록에는 지목된 문항 하나와 그 문장, 지금 오답, 검수 사유가 담깁니다.
{
"family": "vocabulary",
"target": "forgetting",
"sentence": "Spacing these attempts over several days helps even more, since each retrieval happens after a little forgetting.",
"current_distractor": "rehearsal",
"reason": "The distractor “rehearsal” produces a plausible sentence ..."
}
21.1초 뒤에 돌아온 수정본입니다.
{
"family": "vocabulary",
"target": "forgetting",
"distractor": "forgiving",
"mechanism": "DM_LEXICAL_LURE",
"why_wrong_ko": "용서는 기억이 조금 흐려지는 현상이 아니므로, 며칠 간격을 둔 회상이 왜 더 도움이 되는지 설명하지 못합니다.",
"plausibility_ko": "forgetting과 철자가 비슷하고 둘 다 -ing형이어서, 문맥을 빨리 읽으면 같은 종류의 표현으로 착각할 수 있습니다."
}
수정본에서 받아들이는 건 오답과 해설뿐입니다. 정답 낱말, 몇 번째 등장인지, 지문 속 위치, 지목되지 않은 나머지 37개 문항은 코드가 그대로 둡니다. 수정본이 정답과 같은 낱말이거나 해설이 비어 있으면 받지 않습니다.
재검수에도 고친 문항 하나만 갑니다. 5.6초 뒤에 통과가 나왔습니다.
{ "items": [{ "family": "vocabulary", "target": "forgetting", "pass": true, "reason": "" }] }
다만 forgiving은 쉬운 오답입니다. 철자는 비슷하지만 학습과 기억을 다룬 문맥에서는 쉽게 걸러지고, 1단계 금지 목록의 “엉뚱한 낱말”과 경계에 있습니다. 검수 지시는 일부러 “너무 쉽다는 이유로는 떨어뜨리지 말라”고 적어 둡니다.
엄격하게만 만들었더니 학생이 걸러야 할 명백한 오답까지 떨어진 적이 있어서입니다. 그래서 재검수 통과를 수업에 바로 쓸 문항이라는 뜻으로 읽지 않습니다. 수업에 쓰기 전에는 사람이 난이도를 보고 오답을 다시 바꿀지 정합니다.
재검수가 본 것은 “고친 오답이 문맥상 틀렸는가”입니다. “좋은 오답인가”는 아직 사람이 판단합니다.
같은 문항을 SEIS로 적으면
수정과 재검수가 끝난 문항을 공개 규격 SEISSEIS 세이스 영어 문항·지문을 한 형식으로 적는 해민웨이의 데이터 규격(JSON).로 적으면 아래와 같습니다. 앞의 기록에 지문 속 위치와 보기·정답 정보를 붙인 꼴입니다. 지문은 줄였고 출처 칸 등 일부도 생략했습니다.
{
"passages": [{
"id": "passage-fluency-s1",
"text": "Many students believe ... after a little forgetting. ...",
"markers": [{
"id": "marker-vocab-8",
"label": "forgetting",
"kind": "inline_choice",
"owner_item": "item-vocab-8",
"offset": { "start": 752, "end": 762, "unit": "unicode_code_point" }
}],
"integrity": { "origin_kind": "authored", "is_original": true }
}],
"items": [{
"id": "item-vocab-8",
"prompt": "네모 안의 두 낱말 중 글의 흐름에 맞는 것을 고르시오.",
"choices": [
{ "label": "A", "text": "forgiving" },
{ "label": "B", "text": "forgetting" }
],
"answer": { "form": "single", "value": "B" },
"inline_choice_drill": { "activity": "vocabulary_choice" }
}]
}
offset은 원문에서 낱말이 놓인 위치입니다. 줄이기 전 지문의 맨 앞 글자를 0번으로 세어, 752번부터 761번까지가 forgetting이라는 뜻입니다. 지문에 [BLANK] 같은 표시를 끼워 넣지 않고 원문은 그대로 둔 채 위치만 적습니다. integrity에는 이 지문을 직접 썼다는 정보를 기록합니다.
SEIS 검증기에 이 파일과, 일부러 하나씩 망가뜨린 사본을 같이 넣었습니다.
[정상] schema OK, semantic OK
[위치 한 칸 밀림] semantic FAIL: marker marker-vocab-8 label does not match text span
[없는 보기를 정답으로] semantic FAIL: item item-vocab-8 answer is not a choice label
[주인 없는 표시] semantic FAIL: marker marker-vocab-8 has missing owner
위치가 한 글자만 어긋나도, 정답이 없는 보기를 가리켜도 바로 걸립니다. 지문 안 선택형(inline_choice) 표기는 아직 공개 저장소에 올리기 전이라, 이 검사는 제 작업용 정본 검증기로 돌렸습니다.
6단계. 조판과 출고 영수증
시연은 재검수에서 마쳤습니다. 실제 라인에서는 통과한 문항이 버전으로 고정된 판형에 들어가고, 정답이 왼쪽에 올지 오른쪽에 올지는 검수가 끝난 뒤 무작위로 정합니다. 학생용, 정답, 빠른 정답, 합본 PDF가 한 번에 나옵니다.
아래는 9월 27일에 실제로 나간 워크북 2판의 출고 영수증을 줄인 것입니다. 출고 ID와 학교 정보는 가렸습니다.
{
"delivery_id": "<출고 ID>-R2",
"version": "R2",
"supersedes": "<출고 ID>-R1",
"source_count": 59,
"units": 183,
"failed_units": [],
"files": {
"…__학생용.pdf": { "pages": 195, "sha256": "82db563b…" },
"…__정답.pdf": { "pages": 195, "sha256": "42de870e…" },
"…__빠른정답.pdf": { "pages": 26, "sha256": "0580609b…" },
"…__합본.pdf": { "pages": 390, "sha256": "5a8e0555…" }
},
"quality": {
"pipeline_review": "codex gpt-6-luna high, strict substitution check",
"authoring": "codex gpt-6-sol medium",
"independent_audit": "SWE-2 max, 183 units / 4,393 items"
}
}
supersedes는 이 판이 대체한 이전 판입니다. 2판을 낸 뒤에도 1판이 무엇이었는지 바로 찾을 수 있습니다. sha256은 파일 내용이 같은지 대조하는 값이라, 학생 손에 간 PDF가 이 판의 그 파일이 맞는지 나중에 확인할 수 있습니다.
quality에는 이 판이 받은 검수 기록이 들어갑니다. 라인 안 검수(Luna)와 별개로, 출고 전에는 다른 회사 모델(SWE-2 max)이 문항 4,393개 전체를 한 번 더 독립 검수했습니다. 그 검수에서도 이번 rehearsal과 같은 종류의 지적이 나왔습니다. 1판에서 impoverished 자리에 diminished를 오답으로 넣은 문항이, 그 문장에서 두 낱말이 거의 같은 뜻이라는 이유로 걸렸습니다.
이번 시연의 입력과 출력
| 단계 | 들어간 것 | 나온 것 | 맡은 쪽 |
|---|---|---|---|
| 계약 | 유형 규격, 지문 길이 | 자리 개수, 금지 목록, 작성 지시 | 사람이 정하고 코드가 계산 |
| 작성 | 지문, 작성 지시 | 문항 38개와 해설 (74.7초) | GPT-6 Sol |
| 형식 검사 | 작성 결과 | 통과 | 코드 |
| 검수 | 지문, 정답이 포함된 작성 결과 | rehearsal 지적 1건 (21.9초) | GPT-6 Luna |
| 국소 수정 | 지목된 문항, 문장, 검수 사유 | forgiving과 새 해설 (21.1초) | GPT-6 Sol, 나머지는 코드가 그대로 둠 |
| 재검수 | 고친 문항 하나 | 통과 (5.6초) | GPT-6 Luna |
| 조판·출고 | (시연 안 함) 9월 27일 2판 기록 | PDF 4종, 출고 영수증 | 코드, 마지막 확인은 사람 |
시간은 이번 시연에서 잰 값이고, 모델 호출 시간은 그날 서버 상태에 따라 달라집니다.
처음 오답 rehearsal은 형식 검사를 통과했지만 문맥 검수에서 걸렸습니다. 고친 forgiving은 재검수를 통과했고, 수업에 쓰기 전 난이도 판단은 사람 몫으로 남아 있습니다. 문항을 적는 규격 SEIS는 GitHub에 공개해 두었습니다.
새 글 소식
새 글이 나오면 메일로 알려 드립니다.
새 글 주소와 한 줄 요약만 보냅니다. 광고는 보내지 않습니다.