학생들에게 출처가 검증된 문제를 제공하는 CompTIA 연습 시험 엔진 구축하기
요약
CompTIA 시험 준비를 위해 출처가 검증된 문제만을 제공하는 연습 시험 엔진 구축 과정을 다룹니다. AI가 생성한 콘텐츠의 정확성을 보장하기 위해 모든 정답을 1차 자료(primary source)와 연결하는 '소스 영수증' 파이프라인을 구축하는 방법을 설명합니다.
핵심 포인트
- 정답의 근거를 1차 자료의 인용구로 강제하는 파이프라인 구축
- AI 생성 콘텐츠의 불확실성을 해결하기 위한 '소스 영수증' 개념 도입
- 검토자의 주관을 배제하고 코드로 정확성을 보장하는 시스템 설계
- 원문을 그대로 복제하지 않고 근사하게 설명하는 교육적 원칙 적용
온라인에서 무료 연습 문제를 통해 CompTIA 시험을 공부해 본 적이 있다면, 이미 그 문제점을 알고 있을 것입니다. 대부분의 "연습 시험"은 재활용된 시험 덤프 (exam dumps)입니다. 수십 개의 사이트에 복사하여 붙여넣은 동일한 유출 풀이며, 미묘하게 틀린 "정답"이 걱정스러울 정도로 많고, 그 내용이 어디에서 왔는지에 대한 표시도 전혀 없습니다.
학생에게 그것은 무용지물보다 더 나쁩니다. 잘못된 답을 완전히 확신하며 암기한 채 시험장에 들어가, 실수하는 법을 적극적으로 훈련하게 될 수도 있기 때문입니다.
저는 학생들에게 정반대의 약속을 하는 연습 시험 엔진을 만들고 싶었습니다. 즉, 여러분이 보는 모든 답은 1차 자료 (primary source)로 추적될 수 있어야 한다는 것입니다. "대부분 확인했습니다"라거나 "검토자가 아마 잘못된 것을 잡아낼 것입니다" 같은 것이 아닙니다. 코드로 강제되는 확실한 보장입니다. 이 포스트는 제가 그 약속을 실제 파이프라인 (pipeline)으로 어떻게 전환했는지, 그리고 그 과정에서 어떤 비용이 들었는지에 대한 이야기입니다.
규칙으로 명시된 보장
이 엔진 전체는 의도적으로 불합리한 하나의 제약 조건을 중심으로 구축되었습니다:
만약 질문의 정답을 1차 자료로 추적할 수 없다면, 파이프라인은 해당 문제를 게시할 수 없습니다.
이 단 하나의 규칙이 학생이 신뢰할 수 있는 학습 도구와, 조용히 잘못된 것을 가르치는 덤프를 구분 짓는 요소입니다. 아래의 모든 내용은 선의가 아닌, 기본적으로 이 규칙이 실현되도록 만드는 기계 장치들입니다.
정확성은 느낌(vibe)이어서는 안 됩니다
AI가 생성한 퀴즈 콘텐츠가 만들어지는 일반적인 방식은 다음과 같습니다: 모델에 프롬프트 (prompt)를 입력하고, 50개의 질문을 얻은 뒤, 대충 훑어보고 배포하는 것입니다. 특정 질문의 정확성은 검토 시점에 누군가가 내리는 판단(또는 판단을 잊어버리는 것)에 달려 있습니다. 이는 확장성이 없으며 재현 불가능합니다. 누가 보느냐에 따라 월요일에는 통과했던 동일한 질문이 화요일에는 탈락할 수도 있기 때문입니다.
저는 정확성이 질문당 의견이 아닌, 엔진의 속성이 되기를 원했습니다. 테스트가 통과하는지 여부를 "검토"하지 않는 것과 마찬가지로 — 테스트는 통과(green)하거나 통과하지 못하거나 둘 중 하나입니다 — 질문은 증거를 지니고 있거나, 아니면 자동으로 폐기되어야 합니다.
그 증거가 바로 제가 소스 영수증 (source receipt)이라고 부르는 것입니다.
영수증 (The receipt)
생성 과정에서 살아남는 모든 문제는 정답을 정당화하는 1차 소스 자료(primary source material)의 문구 그대로를 발췌한 내용을 반드시 포함해야 합니다. 단순히 느낌(vibe)이나 "모델이 그렇게 말했다"는 식의 근거가 아니라, 인간이나 스크립트가 확인할 수 있도록 문제 객체(question object)에 저장된 실제 인용 구간(quoted span)이어야 합니다.
문제는 대략 다음과 같은 형태를 띠게 됩니다:
json{ "id": "netplus-1-0012", "objective": "1.2", "stem": "데이터 전송 전에 세션을 설정하는 전송 프로토콜은 무엇입니까?", "answer": "TCP", "evidence": { "excerpt": "...연결 지향형 전송은 비연결형 전송과 대조적으로, 교환 전에 세션을 설정합니다...", "source": "공식 시험 목표, 도메인 1.2" } }
이 증거(evidence) 블록이 핵심입니다. 이것은 지속적이고 저장된 영수증입니다. 이 영수증은 문제와 함께 영구적으로 이동하므로, 학생(또는 저)이 생성되는 순간뿐만 아니라 몇 달 후에도 정답 여부를 감사(audit)할 수 있습니다.
그 위에는 교육학적으로나 법적으로 중요한 엄격한 규칙이 하나 더 층을 이루고 있습니다: 근사하게 설명하되, 절대 그대로 복제하지 마십시오(approximate and explain, never reproduce). 영수증은 문제를 실제 목표에 근거하게 만들지만, 문제와 설명은 새롭게 작성됩니다. 저는 저작권이 있는 시험 문제 풀(exam pool)을 재출판하는 것이 아닙니다. 이 엔진은 공개된 목표에 입증 가능할 정도로 정렬된(aligned) 독창적인 문제를 생성합니다. 이러한 차이점이야말로 학생이 유출된 자료를 공부하지 않고도 이 시스템을 사용할 수 있는 온전한 이유입니다.
게이트 (The gates)
생성은 쉬운 부분입니다. 흥미로운 엔지니어링은 잘못된 문제가 학생에게 도달하는 것을 막으려는 모든 시도에 달려 있습니다.
- 적대적 검증기 (The adversarial verifier). 질문이 초안 작성된 후, 두 번째 단계에서는 저자 대신 검사관 역할을 수행합니다. 이 단계의 유일한 임무는 공격하는 것입니다: 저장된 발췌문이 실제로 표시된 정답을 뒷받침하는가? 더 정확한 선택지가 있는가? 발췌문이 주장하지 않은 내용을 포함하도록 억지로 늘려 해석되고 있지는 않은가? 생성기 (Generator)는 배포하기를 원하고, 검증기 (Verifier)는 거부하기를 원합니다. 정확성은 그들 사이의 간극에 존재합니다.
- check-mocks.mjs. 전체 문제 은행의 구조적 무결성을 검증하는 CI 스크립트입니다. 모든 질문에는 영수증 (receipt)이 있어야 하고, 모든 영수증은 비어 있지 않아야 하며, 모든 정답은 실제 선택지와 매핑되어야 하고, 고립된 참조 (orphaned references)가 없어야 합니다. 이는 CI에서 실행되며, 무언가 잘못되면 빌드를 실패시킵니다.
- 블루프린트 합계 게이트 (The blueprint-sum gate). CompTIA는 도메인 가중치 (예: 도메인 1은 시험의 X%를 차지함)를 공개합니다. 게이트는 생성된 분포가 실제 공식 블루프린트 (blueprint)와 일치하는지 확인하여, 학생의 연습 세트가 생성하기 쉬운 내용에 과도하게 편중되는 대신 실제 시험의 형태를 반영하도록 합니다.
- NO-GO 게이트 — 제가 가장 자랑스럽게 생각하는 부분입니다. 검증 신뢰도 (verification confidence)가 임계값 (threshold) 아래로 떨어지면 해당 질문은 폐기됩니다. 저는 의도적으로 이 게이트가 매우 민감하게 작동하도록 조정했습니다. 현재 약 24%의 오탐 폐기율 (false-cut rate)로 작동하며, 이는 폐기된 질문의 약 4분의 1은 아마도 괜찮았을 것임을 의미합니다. 이것이 버그처럼 들릴 수도 있습니다. 하지만 이것은 시스템에서 가장 중요한 설계 결정입니다. 확신 없이 틀린 답을 학생에게 전달하는 것은 학생에게 실제 비용과 시험 낙방이라는 피해를 줍니다. 좋은 질문 하나를 버리는 것은 약간의 생성 예산 외에는 저에게 아무런 비용도 들지 않습니다. 실패 모드 (failure modes)가 매우 비대칭적이므로, 저는 게이트를 비용이 적게 드는 실패 쪽으로 조정했습니다. 학생을 대상으로 하는 도구에서, 과도한 폐기는 하나의 기능 (feature)입니다.
text$ node check-mocks.mjs scanned: 187 candidates verified: 142 NO-GO: 45 (confidence < threshold) → 142 shipped, receipts attached
의도적으로 지루하게 구성한 스택 (The deliberately boring stack)
이 중 그 어떤 것도 무거운 프레임워크 (framework)를 필요로 하지 않으며, 프레임워크를 사용하려 했다면 실수였을 것입니다. 이 사이트는 Cloudflare Pages 상에서 동작하는 바닐라 JS (vanilla JS) 퀴즈 엔진입니다. 정적이며(static), 빠르고, 관리해야 할 빌드 단계 (build step)가 없으며, 호스팅 비용이 무료입니다. 매주 실행되는 CI (Continuous Integration) 작업이 게이트 (gates)를 다시 실행하며, 목표 (objectives)가 변경될 때 데이터의 노후화 (staleness)를 표시합니다. 규율은 런타임 (runtime)이 아닌 파이프라인 (pipeline)에 있습니다.
라이브 서비스 중이며, 학생들에게는 무료입니다
이 엔진은 현재 6개의 CompTIA 트랙 — Network+, Security+, A+ Core 1 & 2, CySA+, 그리고 PenTest+ — 을 지원하며, 모두 회원 가입이나 결제 벽 (paywall) 없이 무료로 제공됩니다. 여기서 직접 체험해 보실 수 있습니다:
certpracticelab
Core1
Core2
Network+
Security+
CySA+
PenTest+
학생이 보는 모든 정답 뒤에는 증빙 자료 (receipt)가 뒷받침됩니다. 그것이 약속이며, 저의 선의가 아닌 코드를 통해 강제됩니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기