
교육용 콘텐츠 수집을 위한 멀티모달 에이전트 파이프라인 구축
요약
교육용 콘텐츠를 구조화된 학습 자료로 변환하기 위한 멀티모달 에이전트 파이프라인 구축 사례를 소개합니다. LangGraph와 FastAPI를 활용하여 OCR의 한계를 극복하고, 수학 공식 및 다이어그램을 포함한 복잡한 문서를 정확하게 추출 및 생성하는 시스템을 설명합니다.
핵심 포인트
- 단순 OCR의 한계를 극복하기 위한 전문화된 추론 단계의 필요성
- LangGraph를 활용한 워크플로우 오케스트레이션 및 상태 관리
- Mistral Document AI와 GPT-4o를 결합한 멀티모달 데이터 처리
- 인쇄용 워크시트와 대화형 평가를 모두 지원하는 구조화된 데이터 추출
교육 출판사들은 워크시트, 교과서, 스캔된 평가서 안에 수십 년간 쌓인 가치 있는 콘텐츠를 보유하고 있습니다. 이를 구조화된 대화형 학습 자료로 변환하는 것은 보기보다 어렵습니다. 단일 문서 내에 여러 언어로 된 질문이 섞여 있거나, 일관되지 않은 수학적 표기법, 질문에 필수적인 다이어그램, 다단 레이아웃, 그리고 불완전한 OCR(광학 문자 인식) 등이 존재할 수 있기 때문입니다. 이를 수동으로 수행하는 것은 느리고 오류가 발생하기 쉬우며, 일반적인 OCR은 쉬운 부분만 해결할 뿐입니다. 즉, 질문의 경계, 공식, 선택지 또는 교육적 의도를 이해하지 못한 채 텍스트만 추출할 뿐입니다.
동기는 구체적입니다. Wayground에 수집된 구조화된 문제 세트는 두 가지 방식으로 작동합니다. 적절한 교실용 워크시트로 인쇄하거나, 형성 평가 (formative assessment)로 실시간 실행할 수 있습니다. 출판사들은 동일한 소스 자료로부터 두 가지 방식을 모두 원했으며, 교사가 배포하는 자료의 난이도를 조절할 수 있도록 모든 질문에 지식의 깊이 (DoK, Depth of Knowledge) 태그를 달기를 원했습니다. 이러한 이중 용도 때문에 구조화는 타협할 수 없는 요소입니다. 인쇄된 워크시트는 느슨한 서식을 허용하지만, 대화형 평가는 깔끔한 질문 경계, 기계 판독 가능한 정답, 그리고 명시적인 메타데이터가 필요합니다.
우리는 다음과 같은 두 가지 관련 작업을 처리하는 출판사 콘텐츠 수집 시스템을 구축했습니다:
- 워크시트 및 평가 문서에서 기존 질문 추출.
- 교과서 및 기타 참고 자료로부터 새로운 질문 생성.
두 작업 모두 동일한 기반을 공유하지만, 매우 다른 추론과 품질 관리가 필요합니다. 이 포스트에서는 각 파이프라인이 어떻게 작동하는지, 그리고 이를 구축하며 무엇을 배웠는지 설명합니다.
왜 OCR만으로는 부족한가
PDF는 문서의 시각적 표현이지 의미론적 (semantic) 표현이 아닙니다. 다음과 같은 수식이 포함된 워크시트를 생각해 보십시오:
(x^2 - 4) / (x - 2)
기본적인 OCR 시스템은 다음과 같이 생성할 수 있습니다:
x2 - 4
------
x - 2
또는:
x^2 - 4 / x - 2
이러한 출력물들은 텍스트상으로는 유사해 보이지만 수학적으로는 다릅니다. 동일한 모호함이 어디에서나 나타납니다. 화학의 위첨자(superscripts)와 반응 화살표는 의미를 담고 있으며, 물리학 도표는 질문에 답하는 데 필요한 기하학적 구조를 정의하고, 생물학 레이블은 질문 자체의 일부가 될 수 있습니다. 언어는 또 다른 차원을 더합니다. 구자라트어(Gujarati)나 스페인어 학습지는 한 페이지에 영어 과학 용어, 수학 표기법, 그리고 현지 형식의 지침을 혼합하여 사용할 수 있습니다.
따라서 신뢰할 수 있는 수집(ingestion) 시스템에는 OCR 이상의 것이 필요합니다. 전문화된 추론 단계(reasoning steps)의 시퀀스가 필요합니다.
시스템 개요 (System Overview)
이 플랫폼은 LangGraph가 두 가지 워크플로우를 오케스트레이션(orchestrating)하는 FastAPI 애플리케이션입니다. LangGraph는 타입이 지정된 상태 객체(typed state object)를 각 파이프라인을 통해 전달하며, 여기에는 원문 텍스트, 감지된 과목, 추출된 질문, 그리고 품질 점수가 포함됩니다. 이를 통해 실행 과정을 쉽게 검사, 일시 중지 및 재시도할 수 있으며, 에이전트가 프롬프트 내부에 숨겨진 정보에 의존하는 것을 방지합니다.
지원 서비스:
- Mistral Document AI: OCR 및 문서 파싱(parsing)용
- GPT-4o: 구조화된 추출(structured extraction), 공식 변환 및 이미지 이해용
- Portkey: 제공업체 간 모델 라우팅(routing)용
- SymPy: 결정론적(deterministic) 수학 검증용
- PostgreSQL: 문서, 질문, 이미지 및 처리 메타데이터 저장용
- 퍼블리싱 레이어(publishing layer): 내부 표현을 플랫폼 스키마(schema)로 변환
파트 1: 기존 질문 추출하기 (Extracting Existing Questions)
추출(Extraction)은 전사(Transcription)가 아닙니다. 각 문제에 대해 시스템은 저자가 의도한 구조, 즉 발문(stem), 지시 사항, 선택지, 정답, 관련 이미지, 공식, 과목, 언어 및 문제 유형을 재구성해야 합니다. 우리는 이를 8단계의 순차적 워크플로(workflow)로 구현했습니다.
1. OCR 추출 (OCR extraction)
원시 텍스트(raw text), 페이지 구조, 이미지 및 언어 신호를 추출하며, 가능한 한 많은 소스 정보를 의도적으로 보존합니다. 너무 일찍 클리닝(cleaning)을 수행하면 단락 구조나 이미지와 인접 텍스트 간의 관계와 같은 유용한 신호가 파괴됩니다.
2. 구조 분석 (Structure analysis)
이 문서가 어떤 종류인지(문제 번호 매기기, 섹션 제목, 다단 레이아웃, 반복되는 선택지 형식 등)를 결정하고 청킹(chunking) 전략을 선택합니다. 임의적인 토큰(token) 기반 분할은 문제와 선택지를 분리하거나, 도표를 해당 도표를 참조하는 텍스트로부터 떨어뜨려 놓을 수 있습니다. 유용한 질문은 컨텍스트 윈도우(context window)에 얼마나 많은 토큰이 들어가는가가 아니라, 가장 작은 자기 완결적(self-contained) 교육 단위가 무엇인가 하는 점입니다.
3. 과목 분류 (Subject classification)
존재하는 과목을 감지하며, 이는 이후의 프로세싱을 주도합니다. 예를 들어 화학 문서는 생물학 학습지와는 다른 정규화(normalization) 규칙이 필요합니다. 또한 문서에 공식(formula)이 포함되어 있는지 여부를 표시하므로, 텍스트 전용 문서는 공식 처리 과정을 완전히 건너뜁니다.
4. 공식 정리 (Formula cleanup)
일관되지 않은 OCR 출력을 표준화된 LaTeX로 변환합니다. 이 단계는 보수적이어야 합니다. 이 단계의 역할은 표현을 복구하는 것이지, 수학적 의미를 변경하는 것이 아닙니다. 신뢰도가 낮은 경우, 잘못된 수정을 만들어내는 대신 원래의 표현을 보존하고 검토를 위해 플래그(flag)를 지정합니다.
5. 텍스트 정규화 (Text normalization)
손상된 공백, 잘못된 줄 바꿈, 분리된 선택지, 반복되는 헤더 및 푸터, 인코딩 아티팩트(encoding artifacts)를 수정하면서 원본 소스에 대한 참조는 그대로 유지합니다.
6. 구조화된 질문 추출 (Structured question extraction)
정규화된 콘텐츠를 검증된 스키마(schema)로 변환합니다:
{
"question_text": "x의 값은 무엇입니까?",
"question_type": "multiple_choice",
...
여기서 구조화된 출력(Structured output)은 매우 중요합니다. 자유 형식(Free-form)의 모델 응답은 검증하기 어렵고 그대로 게시하기에는 위험합니다.
7. 언어 특화 (Language specialization)
의미를 번역하거나 변경하지 않고 철자 및 언어별 OCR 오류를 수정합니다. 이는 지역 언어와 영어 용어 또는 비라틴 문자가 혼합된 문서에서 중요합니다. 현재 시스템은 영어와 함께 구자라트어(Gujarati) 및 스페인어(Spanish)를 지원합니다.
8. 최종 검증 (Final validation)
필수 필드의 존재 여부, 선택지의 구조적 유효성, 참조된 이미지의 존재 여부, LaTeX 파싱 여부, 질문의 공백 또는 중복 여부, 그리고 신뢰도(confidence)가 게시 임계값을 충족하는지 확인합니다. 출력물은 품질 보고서가 포함된 구조화된 질문 세트입니다.
왜 하나의 거대한 프롬프트 대신 멀티 에이전트를 사용하는가?
문서 전체를 하나의 커다란 프롬프트로 보내는 것이 더 간단하며, 디버깅(debug)은 거의 불가능합니다. 출력이 잘못되었을 때, 실패의 원인이 OCR, 레이아웃 이해, 질문 경계, 수식 파싱, 또는 스키마 생성 중 어디에서 왔는지 알 수 없습니다.
특화된 단계(Specialized stages)는 우리에게 세 가지를 제공합니다: 관측 가능성(observability, 모든 단계가 검사 가능한 중간 출력을 생성함), 타겟 재시도(targeted retries, 수식 변환 실패 시 문서 전체의 OCR을 반복하지 않음), 그리고 독립적인 개선(independent improvement, 파이프라인을 재설계하지 않고도 수식 에이전트나 검증기를 업그레이드할 수 있음).
그렇다고 해서 모든 단계에 LLM이 필요한 것은 아닙니다. 규칙, 파서(parser), 또는 수학 라이브러리로 신뢰성 있게 해결할 수 있는 작업이라면 결정론적 코드(Deterministic code)를 사용하는 것이 더 바람직합니다.
파트 2: 새로운 질문 생성
생성(Generation)은 목적이 다릅니다. 교과서 콘텐츠를 사용하여 특정 인지 수준(Cognitive levels)에서의 이해도를 테스트하는 새로운 질문을 만드는 것입니다. 워크플로우는 9개의 에이전트와 4개의 과목별 생성 모듈을 포함하며, 품질 게이트가 적용된 재시도 루프(Quality-gated retry loop)를 갖추고 있습니다. 즉, 질문은 루브릭(Rubric)에 대해 최소 75점 이상을 받아야 하며, 생성 시도는 최대 3회까지 허용됩니다.
콘텐츠 분석 (Content analysis)
분석기(Analyzer)는 주제를 식별하는 것을 넘어 핵심 개념, 개념 간의 관계, 중요한 수치, 그리고 가장 가치 있게는 학생들이 흔히 범하는 오개념(Misconceptions)을 추출합니다. 고품질의 오답 선택지(Distractor)는 무작위로 틀린 값이 아니라, 그럴듯한 추론 오류를 나타내야 합니다. 연산 순서를 테스트할 때, 곱셈보다 덧셈을 먼저 계산하여 얻은 그럴듯한 오답은 학습자가 무엇을 오해했는지를 드러내기 때문에 유효합니다.
인지 수준 계획 (Cognitive-level planning)
무엇인가를 생성하기 전에, 시스템은 인지 수준에 따른 질문 분포를 계획합니다. 발행 시점에 각 질문은 Wayground가 사용하는 지식 깊이(Depth of Knowledge) 태그에 매핑되므로, 워크시트를 암묵적인 난이도가 아닌 명시적인 엄밀성(Rigor) 목표에 맞춰 구성할 수 있습니다.
| 수준 | 의도된 역량 |
|---|---|
| 1 | 사실, 공식 또는 정의를 회상함 |
| ... |
이러한 계획 단계가 존재하는 이유는, 이 과정이 없으면 언어 모델(Language models)이 겉보기에는 달라 보이지만 실제로는 동일한 얕은 기술을 테스트하는 많은 질문을 생성하기 때문입니다.
과목별 생성 (Subject-specific generation)
범용 프롬프트(Generic prompt)는 과목 전반에 걸쳐 충분한 경우가 드뭅니다. 과목마다 '정확성(Correctness)'이 의미하는 바가 다르기 때문입니다.
| 과목 | 정확성에 요구되는 사항 |
|---|---|
| 수학 (Mathematics) | 기호 검증 (Symbolic verification): SymPy를 사용하여 정답을 확인함 |
| ... |
결정론적 정답 검증 (Deterministic Answer Verification)
언어 모델 (Language models)은 유용한 생성기이지만, 계산기처럼 취급해서는 안 됩니다. 수학 문제의 경우, 생성된 정답은 SymPy를 사용하여 독립적으로 풀이됩니다:
생성기 (Generator)가 제안하면, 검증기 (Verifier)가 문제를 독립적으로 해결합니다. 만약 두 결과가 일치하지 않으면, 해당 문제는 발행 단계로 넘어가지 않습니다. 동일한 원리가 단위 검증 (Unit validation), 화학 방정식 균형 맞추기 (Chemical equation balancing), 그리고 선택지 유일성 확인 (Option uniqueness checks)에도 적용됩니다.
알려진 실수를 활용한 오답 생성 (Distractors from Known Mistakes)
이 부분은 제가 이 시스템에서 가장 좋아하는 부분입니다. 언어 모델에게 틀린 선택지를 만들어내라고 요청하는 대신, 시스템은 SymPy를 사용하여 원본 문제의 변형된 버전을 풀이함으로써 오답 (Distractors)을 생성합니다. 이때 각 변형은 학생이 저지를 법한 특정한 실수를 인코딩합니다.
다음 사례를 고려해 보세요:
f(x) = (3x^2 + 1)^4
올바른 미분은 연쇄 법칙 (Chain rule)을 필요로 합니다:
f'(x) = 4(3x^2 + 1)^3 * 6x = 24x(3x^2 + 1)^3
오답 생성기는 현실적인 실수 변형 (연쇄 법칙 망각, 내부 함수를 잘못 미분, 외부 계수 누락 등)을 적용하며, SymPy는 변경된 각 절차를 평가합니다:
A. 24x(3x^2 + 1)^3 올바른 연쇄 법칙
B. 4(3x^2 + 1)^3 내부 미분 누락
C. 12x(3x^2 + 1)^3 내부 미분을 6x 대신 3x로 계산
...
검증기(Validator)는 각 오답(Distractor)이 정답 및 다른 오답들과 수학적으로 구별되며, 정답 표현식으로 단순화되지 않음을 확인합니다. 그 결과, 현실적이고 결정론적(Deterministic)이며 추적 가능한 오답이 생성됩니다. 즉, 시스템은 특정 선택지가 왜 틀렸는지뿐만 아니라, 어떤 실수가 해당 오답을 만들어냈는지까지 설명할 수 있습니다.
품질 게이트 생성 (Quality-Gated Generation)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기



