이 글은 Kaggle Benchmarking Challenge에 제출하는 내용입니다.
튜터는 정답을 제공하면서도 학습자에게 실패를 안겨줄 수 있습니다. A1 수준의 설명을 요청하면, 많은 모델들이 학생이 아직 배우지 않은 어휘와 문법으로 가득 찬 세련된 단락을 반환합니다.
저는 이러한 격차를 측정하기 위한 벤치마크를 만들었습니다. 즉, 모델이 실제 영어 학습 질문에 답변하면서도 요청된 CEFR 수준 근처에 머무를 수 있는지 여부입니다.
제가 측정한 내용
이 과제는 모델에게 English Language Learners Stack Exchange의 30개 질문 중 하나를 제공하고 A1, B1 또는 C1 수준으로 답변을 요청합니다. 각 질문은 두 번씩 나타납니다:
- Bare: 대상 레벨만 요청하고 다른 것은 없습니다.
- Informed: 채점자가 사용한 어휘와 문법 지침이 포함됩니다.
이를 통해 모델당 180개의 행(row)이 생성됩니다: 30개 질문 × 3개 레벨 × 2가지 조건.
고정된 답변과 관련성 판결에 대해, CEFR 구성 요소는 결정론적입니다. 이는 어휘(vocabulary), 문법(grammar), 구문(syntax)을 결합합니다:
score = 0.4 × vocabulary + 0.4 × grammar + 0.2 × syntax
별도의 컨텍스트 기반 심사관(context-bound judge)이 답변이 학습자의 실제 질문에 답하는지 여부를 확인합니다. 이는 의도적으로 좁게 설정되었습니다. 이 심사관은 스타일이나 사실적 정확도를 채점하지 않으며, 결정론적 CEFR 채점기를 대체하지 않습니다. 만약 심사관이 실패하거나 잘못된 증거를 반환하면, 해당 행은 기본값으로 통과하는 대신 점수가 매겨지지 않은 상태로 유지됩니다.
score >= 0.8와 같은 수치적 규칙은 없습니다. 별도의 Boolean adherent 진단은 구조적 게이트(structural gate), 레벨별 어휘 상한 및 하한, 그리고 문법 상한을 통과해야 합니다.
정보가 담긴 프롬프트는 일반 언어 생성 지침을 PASSING RULES라고 부릅니다. 이 제목은 Kaggle의 합격/불합격 기준을 만드는 것은 아닙니다. 3~5문장으로 요청하는 것은 프롬프트 가이드이며, 불리언 스코어러(Boolean scorer)의 구조적 게이트는 최소한 두 개의 감지된 문장을 요구합니다.
수준 임계값 조정 방법
저는 모델 답변을 보고 어휘 및 구문 제한을 정하지 않았습니다. 시드 13으로, 다섯 개의 고정된 UniversalCEFR 영어 서브셋에서 A1, B1, C1 수준의 3~5문장 창(window) 913개를 샘플링했습니다. 이 중 891개의 창은 최소 20개의 인식된 내용어(content words)를 포함하여 임계값 적합성(threshold fit)에 도달했습니다.
각 목표 수준별로, 어휘 상한선(vocabulary ceilings)은 실제 수준 라벨링이 된 창에서 해당 위반율의 90번째 백분위수부터 시작되었습니다. 그런 다음 두 개의 상한선을 함께 5% 간격으로 완화하여 평가 가능한 창의 최소 90%가 둘 다 통과하도록 했습니다. 어휘 하한선(vocabulary floor)은 목표 수준의 상위 두 밴드에 포함된 단어 비율의 10번째 백분위수에서 가져왔습니다. 구문 밴드는 문장 길이, 문장당 절 수, 단어 길이의 5%–95% 백분위수 범위를 사용합니다. 문법 상한선은 감지된 상위 수준 구성(above-level constructions)의 90번째 백분위수 절대 개수를 사용합니다.
| 목표 | 한 단계 위 | 두 단계 이상 위 또는 미기재 | 어휘 하한선 | 상위 수준 문법 허용치 |
|---|
| A1 | 13.57% | 14.16% | 설계상 없음 | 최대 1회 적중 |
| ... | | | | |
Kaggle에 업로드된 것은 하나의 Python 파일입니다. 여기에는 스코어러(scorer), 보정 임계값(calibrated thresholds), 단어 프로필(word profiles), 30개의 속성 질문(attributed questions), 프롬프트, 그리고 8쌍의 심사관 사전 비행 테스트(eight-pair judge preflight)가 포함되어 있습니다. 실행 시 프로젝트 파일이나 인터넷 다운로드가 필요하지 않습니다.
테스트된 모델
로컬 개발 파일럿
Kaggle에 게시하기 전에, 두 개의 양자화된(quantized) 로컬 모델에서 360개의 출력을 고정했습니다:
| 모델 | 파라미터 | 평균 점수 | 관련성 및 준수도 |
|---|
| Qwen3.5-2B-4bit | 2B | 0.8321 | 113/180 |
| Qwen3.5-9B-4bit | 9B | 0.9495 | 148/180 |
두 모델 모두 동일한 30개 질문, 프롬프트, 디코딩 설정(decoding configuration), 그리고 512 토큰 출력 상한선을 사용했습니다. 관련성 판단은 parity-fixed v5 재점수화 전에 고정되었습니다.
Kaggle 모델
최종 Kaggle 실행에는 낮은 추론 능력을 지원하는 Gemini 3.7 Flash와 2,048 토큰의 결합된 추론 및 답변 할당량이 사용되었습니다:
| Kaggle 모델 | 포함 이유 | 평균 점수 |
|---|
| Gemini 3.7 Flash | Kaggle 호스팅 카탈로그를 통해 사용할 수 있는 효율적인 필수 사고(mandatory-thinking) 모델 | 0.9612 |
두 개의 로컬 Qwen 모델과 하나의 라이브 Kaggle 모델만으로도 제한적이고 실제 모델에 기반한 결과를 얻기에 충분하지만, 광범위한 확장성이나 크로스 프로바이더(cross-provider) 주장을 하기는 부족합니다. 두 번째 Kaggle 모델이 공개 리더보드를 강화할 수 있었겠지만, 별도의 지출 승인이 필요했기 때문에 의도적으로 보류했습니다.
발견 사항
9B 로컬 모델은 0.9495점을 기록하여 2B 모델의 0.8321점과 비교되었습니다. 또한 관련성이 높고 CEFR에 준수하는 답변을 더 많이 생성했습니다: 148개 대 113개.
이 결과는 신중하게 해석해야 합니다. 이는 9B 모델이 이 스코어러와 이 30개 질문을 더 잘 처리했다는 것을 의미할 뿐입니다. 파라미터 수 자체가 CEFR 준수의 원인임을 보여주지는 않으며, 두 개의 모델만으로는 확장성 연구가 아닙니다.
정보가 담긴 프롬프트(informed prompt)가 모든 목표 수준에 동일하게 도움이 되지는 않았습니다. 동결된 로컬 파일럿에서는 일반적으로 더 짧은 출력을 생성했지만, 점수 효과는 모델과 목표 수준에 따라 달랐습니다. 따라서 단순히 지침이 많다고 항상 도움이 된다고 가정하는 대신, 쌍을 이루는 기본(bare) 설계와 정보가 담긴 설계를 비교하여 이러한 상충 관계를 보여줍니다.
가장 큰 방법론적 놀라움은 C1에서 나왔습니다. 보정된 어휘 하한선(calibrated vocabulary floor)이 0으로 무너졌습니다. 답변은 높은 수준의 어휘를 피하면서도 C1보다 훨씬 단순하게 들릴 수 있습니다. 저는 가능한 수정 방안으로 별도의 기술자 기반 평가자(descriptor-based judge)를 테스트했습니다. 이 평가자는 작성자가 만든 A1 부정 통제군(negative controls)을 통과했지만, 레이블링된 C1/C2 긍정 사례 중 4.17%만을 감지했기 때문에, 답변을 본 후 조정하기보다는 기각했습니다.
실패한 이 평가자는 벤치마크 점수에 포함되지 않습니다. 이는 선택적 진단 자료이자 작동하지 않은 것을 기록하는 용도로 보존됩니다.
최종 Kaggle 실행에서는 180개 행 전체를 완료했습니다. 독립적인 재점수화는 180/180 행에서 Kaggle과 일치했으며, 모든 180개의 답변이 관련성이 있었고, 154개가 관련성과 CEFR 준수성을 모두 갖추었으며, 어떤 출력도 결합된 2,048 토큰 제한에 근접하지 않았고, 수동 검토 결과 눈에 띄게 잘린 답변은 0개였습니다. 이전의 1,024 토큰 실행에서는 0.9679점을 받았지만, 14개의 답변이 문장 중간에서 끝났기 때문에 플랫폼 완성도만으로는 충분하지 않아 거부되었습니다.
Kaggle의 과제 열(task column)은 55.6%를 표시하며, 이는 백분율 형식 적용 후 가장 낮은 v5 행 점수(0.5558)와 일치합니다. 이것은 응답 통과율이 아니며 180개 행의 평균값(0.9612)도 아닙니다. 부동 소수점(float)을 반환하는 과제에는 수치적 통과 임계값이 없기 때문에, 저는 벤치마크의 전체 점수 열을 비활성화하고 검증된 집계를 명시적으로 보고합니다.
다음에 측정할 것들
가장 우선순위가 높은 변경 사항은 검증된 C1 하한선입니다. 이를 위해서는 출처가 분리되고 참가자가 분리된(source-disjoint, participant-disjoint) 레이블링된 텍스트 또는 짧은 튜터 답변에 대한 인간 평가가 필요합니다. 또한 관련성만으로는 답이 질문을 다루고 있다는 것만을 알려주기 때문에, 사실적 정확성 검사도 추가할 것입니다.
더 많은 질문 세트는 문항 민감도(item sensitivity)를 낮출 것입니다. 현재의 30개 질문은 실제적이며 출처가 명확하지만, 모든 학습자 수준, 모국어 또는 질문 유형을 대표하는 표본은 아닙니다.
재현성 및 출처 (Reproducibility and attribution)
이 저장소는 생성된 과제(task), 결정론적 채점기 테스트(deterministic scorer tests), 소스 해시(source hashes), 결과 요약, 그리고 항목별 출처 표(per-item attribution table)를 보존합니다.
Kaggle은 현재 해당 과제 및 벤치마크 페이지에 Apache 2.0 메타데이터 라벨을 표시합니다. 업로드된 노트북과 소스 저장소는 실제 아티팩트 용어들을 보존합니다: 원래의 벤치마크 코드는 AGPL-3.0-only이며, 임베드된 제3자 자료는 별도로 명시된 라이선스를 유지합니다. 플랫폼 라벨이 이러한 고지 사항을 대체하지 않습니다.
이 벤치마크는 도쿄외국어대학교(Tokyo University of Foreign Studies)의 Tono Laboratory에서 제공하는 CEFR-J 어휘 프로파일 1.5 및 문법 프로파일 20180315와, CC BY-SA 4.0 하의 Octanove C1/C2 프로파일을 사용합니다.[1] 학습자 질문은 원래 저자, 프로파일 링크, 질문 링크, 적용 가능한 CC BY-SA 개정 라이선스, 소스 스냅샷 해시, 그리고 변환 기록을 유지합니다.[2]
Kaggle 과제나 공개 소스 저장소에는 UniversalCEFR 학습자 텍스트가 임베드되어 있지 않습니다. 동결된 영어 부분집합(Frozen English subsets)은 집계 보정 통계(aggregate calibration statistics)를 기여했으며, 공개 증거는 출처 식별자, 해시, 집계 결과, 그리고 기록된 CC BY-NC-SA 4.0 또는 CC0 1.0 용어를 유지합니다.[5]
나의 벤치마크 (My benchmark)
Kaggle 과제: https://www.kaggle.com/benchmarks/tasks/astrakamratowski/cefr-adherence-benchmark/5
Kaggle 벤치마크: https://www.kaggle.com/benchmarks/astrakamratowski/cefr-adherence-benchmark
소스 저장소: https://github.com/Astra-K/cefr-adherence-benchmark
출처 (Sources)
다음은 참고 자료 목록입니다.