LLM을 활용한 주관식 일본어 답변 채점: Django + pydantic-ai
요약
JLPT 학습 앱 BetterLingo을 개발하며 주관식 일본어 답변 채점 시스템 구축 경험을 공유합니다. 단순히 LLM에게 채점을 맡기는 대신, 과제 유형별로 자체 루브릭과 가중치를 적용하여 점수의 안정성을 확보하는 것이 핵심입니다. 또한, 비용 효율성을 위해 채점은 Qwen3-Next-80B 같은 저렴한 모델을 사용하고, 튜터링 기능에는 Claude Sonnet을 분리 사용하는 전략을 취했습니다.
핵심 포인트
- 과제 유형별로 루브릭(rubric)을 분할 적용하여 점수 안정성을 높였습니다.
- 채점은 Qwen3-Next-80B 등 저렴한 모델, 튜터링은 Claude Sonnet 등 고성능 모델로 비용 효율화했습니다.
- 구조화된 출력(Structured output)을 활용하는 것이 신뢰성 확보의 핵심입니다.
- 단일 범용 프롬프트보다 각 과제에 맞는 세부 시스템 프롬프트를 사용하는 것이 효과적입니다.
JLPT(N2 목표)를 준비하고 있는데, 제가 시도해 본 모든 준비 앱에서 계속 신경 쓰이는 점은 전부 객관식이라는 것입니다. A/B/C/D 중 하나를 누르면 초록색 체크 표시가 뜨고 학습하는 기분이 들죠. 하지만 객관식은 _인식(recognition)_을 훈련할 뿐, 회상(recall) 능력을 키워주지는 못합니다. 실제 문장 하나를 만들어낼 수 없으면서도 합격처럼 보이는 점수를 패턴 매칭으로 얻는 식입니다.
그래서 저는 BetterLingo을 만들기로 했습니다. 이 앱은 JLPT 학습용 앱이며, 일일 연습이 주관식입니다. 객관식이 아닙니다. 실제 답변을 작성하면 LLM이 이를 채점합니다. 이 글은 실제로 구축하는 데 가장 흥미로웠던 부분, 즉 학습자가 점수를 신뢰할 수 있을 만큼 안정적으로 주관식 일본어 답변을 채점하는 방법에 대한 내용입니다.
'그냥 모델에게 채점하게 시키는 것'의 문제점
가장 단순한 버전은 하나의 프롬프트입니다:
“자유 형식(Free-form)”은 단일 과제가 아닙니다. 매일의 세트는 네 가지 유형으로 구성되어 있으며, 각 유형마다 다른 채점 중점을 두어야 합니다:
- 답변 (Answer) — 일본어로 프롬프트에 응답합니다. 의미와 자연스러움에 따라 채점됩니다.
- 빈칸 채우기 (Fill in the blank) — 어느 정도 맞는 토큰 하나를 제시하며, 문법/연어(collocation)에 엄격하게 점수가 매겨집니다.
- 번역 EN→JP — 의미 충실도가 최우선이며, 그다음이 자연스러움입니다.
- 번역 JP→EN — 이해도 확인용입니다. 영어의 문법은 덜 중요합니다.
점수를 안정화시킨 비결은 단일한 보편적 루브릭(rubric)을 사용하지 않은 것이었습니다. 각 유형마다 자체 시스템 프롬프트와 세부 항목별 가중치를 갖습니다. 번역 과제의 핵심을 놓쳤지만 완벽하게 자연스러운 답변이, 의미를 정확히 포착한 답변과 같은 점수를 받아서는 안 됩니다.
채점 비용을 거의 0에 유지하기
이는 제가 매일 진행하는 학습 세션에서 운영되고 있으며, 그에 비례하여 청구되는 요금이 발생하지 않으면서도 확장되기를 원합니다. 따라서 두 개의 LLM 작업은 비용 프로필별로 분리됩니다:
- 채점 (Grading) (높은 빈도, 모든 연습 항목마다 실행)은 NVIDIA의 무료 추론(inference) 티어를 사용하는 Qwen3-Next-80B를 사용합니다. 구조화된 출력 덕분에 더 작고 저렴한 모델이라도 안정적으로 작동할 수 있습니다.
- 튜터 + 힌트 (Tutor + hints) (낮은 빈도, 날카로워야 함)는 OpenRouter를 통해 Claude Sonnet을 사용합니다.
튜터(저는 그녀를 Rami라고 부릅니다)는 자유 형식 과제의 또 다른 축입니다. 그녀는 사용자의 실제 시도를 확인합니다: 질문, 작성한 내용, 점수, 항목별 세부 분석, 피드백. 따라서
- 구조화된 출력(Structured output)이 신뢰성의 핵심 동력입니다. '산문 분석하기(parse the prose)' 방식에서 '점수는 타입 지정 객체(typed object)이다' 방식으로 전환하는 것만으로 거의 모든 불안정성을 제거할 수 있었습니다.
- 과제 유형별로 루브릭을 하나씩 적용하는 것이 하나의 영리한 범용 프롬프트보다 낫습니다.
- 특히 대량의 채점이 필요한 경우, 엄격한 제약 조건(tight constraints)을 가진 저렴한 모델이 느슨한 프롬프트를 가진 비싼 모델보다 더 나은 경우가 많습니다.
- 구조화된 피드백을 튜터에게 전달하면, 마치 실제로 사용자의 작업물을 읽는 것처럼 느끼게 합니다. — 왜냐하면 실제로 그러하기 때문입니다.
아직 거친 단계입니다. 제가 주 사용자로서 제 N2 준비 과정에서 부딪히면서 개선하고 있습니다. 만약 LLM을 사용하여 자유 형식의 사용자 입력을 채점하거나 평가하는 무언가를 구축하고 있다면, 스키마 설계와 루브릭 분할에 대해 의견을 나눌 수 있어 기쁩니다. 그리고 만약 직접 JLPT를 준비하고 계시다면, betterlingo.io가 제가 만들고 있는 것입니다. 진심으로 피드백을 받고 싶습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기