Capstone 04 — 멀티모달 문서 QA (Vision-First PDF, Tables, Charts)

2026년 문서 질의응답(Document QA)의 프런티어는 OCR 후 텍스트(OCR-then-text) 방식에서 비전 우선 후기 상호작용(vision-first late interaction)으로 이동했습니다. ColPali, ColQwen2.5, ColQwen3-omni는 각 PDF 페이지(page)를 이미지(image)로 다루고, 다중 벡터 후기 상호작용(multi-vector late interaction)으로 임베딩(embedding)하며, 질의(query)가 페이지 패치(patch)에 직접 어텐션(attention)하도록 합니다. 금융 10-K 보고서, 과학 논문, 손글씨(handwritten) 노트에서 이 패턴은 OCR 우선 방식을 큰 폭으로 이깁니다. 1만(10k) 페이지 규모에서 파이프라인을 끝까지 만들고, OCR 후 텍스트 방식과 나란히(side-by-side) 비교한 결과를 공개합니다.

유형: Capstone 언어: Python (파이프라인), TypeScript (뷰어 UI) 선수 지식: Phase 4 (컴퓨터 비전), Phase 5 (자연어 처리; NLP), Phase 7 (트랜스포머; transformers), Phase 11 (LLM 엔지니어링), Phase 12 (멀티모달), Phase 17 (인프라) 활용되는 Phase: P4 · P5 · P7 · P11 · P12 · P17 예상 시간: 30시간

문제

기업에는 OCR 파이프라인이 망가뜨리는 PDF가 쌓여 있습니다. 회전된 표(table)가 들어 있는 스캔된 10-K, 수식(equation)이 빽빽한 과학 논문, 이미지로 봐야 비로소 의미가 살아나는 차트(chart), 손글씨로 적힌 주석(annotation)이 그런 사례입니다. 이를 텍스트 우선(text-first)으로 다루면 신호의 절반을 잃습니다. 2026년의 답은 원본 페이지 이미지에 대한 후기 상호작용 다중 벡터 검색(late-interaction multi-vector retrieval)입니다. ColPali(Illuin Tech)가 이를 도입했고, ColQwen2.5-v0.2와 ColQwen3-omni가 정확도를 끌어올렸습니다. ViDoRe v3 벤치마크에서 비전 우선 검색은 OCR 후 텍스트보다 의미 있는 폭으로 높은 점수를 내며, 차트와 표, 손글씨에서는 그 격차가 더 벌어집니다.

대신 치러야 할 비용은 저장 공간(storage)과 지연 시간(latency)입니다. ColQwen 임베딩은 페이지당 단일 1024차원(1024-dim) 벡터가 아니라 약 2048개의 패치 벡터입니다. 원시 저장 용량이 크게 늘어납니다. DocPruner(2026)는 측정 가능한 정확도 손실 없이 50% 가지치기(pruning)를 제공합니다. 우리는 1만 페이지를 색인(index)하고, ViDoRe v3 nDCG@5를 측정하고, 2초 미만으로 답변을 서빙(serve)하며, OCR 후 텍스트 베이스라인(baseline)과 직접 비교합니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.차트와 회전된 표가 포함된 문서에서 비전 우선(vision-first) 검색이 OCR 후 텍스트(OCR-then-text) 방식보다 우수한 이유는 무엇인가요?

2.문서 검색에서 '후기 상호작용(late interaction)'이란 무엇인가요?

0/2 답변 완료

개념

후기 상호작용(late interaction)이란 모든 질의 토큰(query token)이 모든 문서 패치 토큰(document patch token)과 점수를 계산하고, 질의 토큰별 최댓값을 합산한다는 뜻입니다. 단일한 풀링 벡터(pooled vector) 없이도 세밀한 매칭(matching)을 얻습니다. 다중 벡터 색인(multi-vector index)인 Vespa, Qdrant 다중 벡터, AstraDB는 패치별 임베딩을 저장하고 검색(retrieval) 시 MaxSim을 실행합니다.

답변자(answerer)는 질의와 상위 k개(top-k)의 검색된 페이지를 이미지로 받아 답변을 작성하는 비전-언어 모델(vision-language model; VLM)입니다. 출력에는 근거 영역(evidence region; 경계 상자 또는 페이지 참조)이 함께 들어가야 합니다. Qwen3-VL-30B, Gemini 2.5 Pro, InternVL3가 2026년 프런티어 선택지입니다. 수식과 과학 표기(scientific notation)에는 OCR 폴백(fallback; Nougat, dots.ocr)을 선택적인 텍스트 채널(channel)로 끼워 넣습니다.

평가는 2차원 행렬로 구성됩니다. 한 축은 콘텐츠 유형(content type)으로, 일반 텍스트 단락, 밀집된 표, 막대/선 차트, 손글씨 노트, 수식을 다룹니다. 다른 축은 검색 접근법(retrieval approach)으로, 비전 우선 후기 상호작용, OCR 후 텍스트, 둘을 섞은 하이브리드(hybrid)를 비교합니다. 각 셀(cell)에는 nDCG@5와 답변 정확도가 들어갑니다. 이 보고서가 최종 산출물입니다.

아키텍처

PDFs -> page renderer (PyMuPDF, 180 DPI)
           |
           v
  ColQwen2.5-v0.2 embed (multi-vector per page, ~2048 patches)
           |
           +------> DocPruner 50% compression
           |
           v
   multi-vector index (Vespa or Qdrant multi-vector)
           |
query ----+----> retrieve top-k pages (MaxSim)
           |
           v
  VLM answerer: Qwen3-VL-30B | Gemini 2.5 Pro | InternVL3
    inputs: query + top-k page images + optional OCR text
           |
           v
  answer with cited page numbers + evidence regions
           |
           v
  Streamlit / Next.js viewer: highlighted boxes on source page

스택

  • 페이지 렌더링: PyMuPDF(fitz), 180 DPI, 세로 정규화(portrait-normalized)
  • 후기 상호작용 모델: ColQwen2.5-v0.2 또는 ColQwen3-omni(Hugging Face의 vidore 팀)
  • 색인: 다중 벡터 필드를 갖춘 Vespa, Qdrant 다중 벡터, 또는 MaxSim을 지원하는 AstraDB
  • 가지치기: DocPruner 2026 정책(분산이 높은 패치 유지, 50% 압축에서 정확도 손실 < 0.5%)
  • OCR 폴백(수식 / 밀집 표용): dots.ocr 또는 Nougat
  • VLM 답변자: 자체 호스팅(self-hosted) Qwen3-VL-30B 또는 호스팅형 Gemini 2.5 Pro, 폴백으로 InternVL3
  • 평가: ViDoRe v3 벤치마크, 다중 페이지 추론(multi-page reasoning)을 위한 M3DocVQA
  • 뷰어 UI: 근거 영역용 캔버스 오버레이(canvas overlay)를 갖춘 Next.js 15

만들어보기

  1. 데이터 적재(Ingest). 10-K, 과학 논문, 스캔 문서에 걸친 1만 페이지 규모의 PDF 코퍼스(corpus)를 순회합니다. 각 페이지를 1536x2048 PNG로 렌더링합니다. {doc_id, page_num, image_path}를 저장합니다.

  2. 임베딩(Embed). 각 페이지 이미지에 ColQwen2.5-v0.2를 실행합니다. 출력 형태(shape)는 대략 128차원 패치 임베딩 2048개입니다. DocPruner를 적용해 신호가 가장 큰 절반을 유지합니다. Vespa 다중 벡터 필드 또는 Qdrant 다중 벡터에 기록합니다.

  3. 질의(Query). 들어오는 질의마다 질의 타워(query tower; 토큰 단위 임베딩)로 임베딩합니다. 색인에 대해 MaxSim을 실행합니다. 모든 질의 토큰에 대해 페이지 패치 임베딩의 최대 내적(max dot-product)을 취하고 합산합니다. 상위 k개 페이지를 반환합니다.

  4. 합성(Synthesize). 질의와 상위 5개 페이지 이미지를 Qwen3-VL-30B에 전달합니다. 프롬프트(prompt) 예시: “제공된 페이지만 사용해 답하십시오. 각 주장(claim)은 (doc_id, page) 형태로 인용(cite)하고, 영역(region; figure, table, paragraph)을 함께 명시하십시오.”

  5. 근거 영역(Evidence regions). 답변을 후처리(post-process)해 인용된 영역을 추출합니다. VLM이 경계 상자(bounding box)를 출력한다면(Qwen3-VL은 가능), 뷰어에 오버레이로 렌더링합니다.

  6. OCR 폴백. 수식이 밀집된 페이지로 식별된 경우(이미지 분산 휴리스틱 활용), Nougat 또는 dots.ocr을 실행하고 OCR 텍스트를 이미지와 함께 추가 채널로 전달합니다.

  7. 평가(Eval). ViDoRe v3(검색 nDCG@5)와 M3DocVQA(다중 페이지 QA 정확도)를 실행합니다. 같은 코퍼스와 같은 합성기(synthesizer)로 OCR 후 텍스트 파이프라인도 실행합니다. 콘텐츠 유형 × 접근법 행렬(content-type × approach matrix)을 만듭니다.

  8. UI. 먼저 Streamlit 프로토타입을 만들고, 이후 원본 페이지 위에 근거 영역 오버레이를 페이지별로 보여주는 Next.js 15 운영용 뷰어를 만듭니다.

사용해보기

$ doc-qa ask "what was the 2024 operating margin change for segment EMEA?"
[retrieve]   top-5 pages in 320ms (ColQwen2.5, MaxSim, Vespa)
[synth]      qwen3-vl-30b, 1.4s, cited (form-10k-2024, p. 88) + (..., p. 92)
answer:
  EMEA 영업이익률은 18.2%에서 16.8%로 이동했고, 140bp 하락했습니다.
  cited: 10-K-2024.pdf p.88 (Table 4, Segment Operating Margin)
         10-K-2024.pdf p.92 (MD&A, Operating Performance)
[viewer]     p.88 Table 4 위에 강조된 경계 상자를 오버레이해 열기

제출하기

outputs/skill-doc-qa.md는 제출 산출물을 설명합니다. 특정 코퍼스에 맞춰 조정되고 ViDoRe v3에서 OCR 후 텍스트 베이스라인과 비교 평가된 비전 우선 멀티모달 문서 QA 시스템입니다.

비중평가 항목측정 방법
25ViDoRe v3 / M3DocVQA 정확도OCR-텍스트 베이스라인과 공개 리더보드(leaderboard) 대비 벤치마크 수치
20근거 영역 그라운딩(grounding)인용된 영역이 실제 답변 스팬(answer span)을 포함하는 비율
20저장 공간과 지연 시간 엔지니어링DocPruner 압축 비율, 색인 p95, 답변 p95
20다중 페이지 추론손으로 라벨링한 100문항 다중 페이지 세트의 정확도
15원본 검사용 UX뷰어 명료성, 오버레이 정확도, 나란히 비교 도구
100

연습문제

  1. (쉬움) 같은 코퍼스에서 ColQwen2.5-v0.2와 ColQwen3-omni를 측정합니다. 한 모델은 맞히고 다른 모델은 놓치는 페이지는 무엇입니까? 색인에 “content class” 태그를 추가해 유형별 라우팅(route)을 만듭니다.

  2. (중간) 임베딩을 공격적으로 가지치기합니다(75%, 90%). 압축 절벽(compression cliff)을 찾습니다. ViDoRe nDCG@5가 OCR 베이스라인 아래로 떨어지는 지점입니다.

  3. (중간) 하이브리드를 만듭니다. OCR 후 텍스트와 ColQwen을 병렬 실행하고, RRF로 결합(fuse)한 뒤 크로스 인코더(cross-encoder)로 재정렬(rerank)합니다. 하이브리드가 둘 중 하나만 썼을 때보다 낫습니까? 어디서 가장 도움이 됩니까?

  4. (중간) Qwen3-VL-30B를 더 작은 VLM(Qwen2.5-VL-7B)으로 바꿉니다. 정확도-대비-비용 곡선(accuracy-per-dollar curve)을 측정합니다.

  5. (어려움) 손글씨 노트 지원을 추가합니다. 손글씨 코퍼스를 렌더링하고, ColQwen으로 임베딩하고 검색 성능을 측정합니다. 손글씨 OCR 파이프라인과 비교합니다.

핵심 용어

용어흔한 설명실제 의미
후기 상호작용(Late interaction)“ColPali-style 검색”질의 토큰이 페이지 패치와 독립적으로 점수를 계산하고 MaxSim이 집계(aggregate)함
다중 벡터(Multi-vector)“패치별 임베딩”각 문서가 하나의 풀링 벡터가 아니라 여러 벡터를 가짐
MaxSim“후기 상호작용 스코어링”각 질의 토큰마다 문서 벡터 중 최대 유사도를 취하고 합산
DocPruner“패치 압축”정확도 손실이 거의 없이 패치의 50%를 유지하는 2026년 가지치기 기법
ViDoRe v3“문서 검색 벤치마크”시각 문서 검색을 측정하는 2026년 표준
근거 영역(Evidence region)“인용 경계 상자”답변 스팬을 원본 페이지에서 위치 지정하는 bbox
OCR 폴백(OCR fallback)“수식 채널”수식이나 표가 많은 페이지에서 비전과 함께 쓰는 텍스트 파이프라인

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

doc-qa

Build a vision-first multimodal document QA system on 10k pages with late-interaction retrieval and evidence-region citations.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.ColQwen2.5는 페이지당 약 2048개의 패치 벡터를 생성합니다. DocPruner는 0.5% 미만의 정확도 손실로 50%를 유지합니다. DocPruner가 활용하는 원리는 무엇인가요?

2.수식이 밀집된 과학 페이지에 대해 파이프라인은 비전 모델과 함께 OCR 폴백(fallback) 채널을 추가합니다. 이 하이브리드 방식이 둘 중 하나만 쓰는 것보다 나은 이유는 무엇인가요?

3.평가에는 콘텐츠 유형 x 접근법 행렬(content-type x approach matrix)을 사용합니다. 이 행렬이 단일 집계 점수로는 놓칠 수 있는 어떤 통찰을 제공하나요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다