본문으로 건너뛰기

문서 뷰어 QA 가이드 — 시각 프리뷰 · 청크 위치 하이라이트

이 문서는 문서 뷰어(업로드한 문서를 시각적으로 미리보고, 청크를 선택하면 문서 내 위치를 하이라이트하는 기능)를 QA가 화면에서 직접 따라 검증할 수 있도록 단계별로 정리한 것입니다. 모든 화면은 실제 GenD prod 환경에서 캡처했습니다.

대상 포맷 (5종 전부 지원):

포맷시각 렌더 방식청크 하이라이트 방식
PDFreact-pdf (페이지 canvas)페이지 위 bbox 오버레이 (백엔드 PyMuPDF 좌표)
HWP / HWPX@rhwp/core (WASM → SVG)SVG 위 <rect> 오버레이 (글자 좌표 매칭)
DOCXmammoth (→ HTML)본문 텍스트 <mark> 래핑
XLSXSheetJS (→ 시트 표)매칭 셀 배경 강조 + 매칭 최다 시트 자동 전환
PPTXpptx-preview (→ 슬라이드)슬라이드 텍스트 <mark> 래핑

핵심 동작 원칙: 좌측은 문서를 시각적으로 렌더하고, 우측 청크 목록에서 청크를 클릭하면 그 청크의 텍스트가 문서의 어디에 있는지 좌측에 하이라이트됩니다. 좌표(bbox)가 필요한 건 PDF·HWP뿐이고, Office(DOCX/XLSX/PPTX)는 렌더된 텍스트를 청크 텍스트와 매칭해 표시합니다.


0. 사전 준비

0-1. 검증용 샘플 파일

각 포맷의 샘플 문서가 필요합니다. 직접 보유한 실파일을 써도 되고, 없으면 아래 스크립트로 생성할 수 있습니다(서버 apps/api 가상환경 기준).

# python-docx, openpyxl, python-pptx 필요
from docx import Document
from openpyxl import Workbook
from pptx import Presentation

doc = Document()
doc.add_heading("QA 테스트 문서", 0)
for i in range(30):
doc.add_paragraph(f"이 문단은 DOCX 시각 프리뷰 검증용 {i}번째 문단입니다.")
doc.save("qa-sample.docx")

wb = Workbook()
ws = wb.active
ws.title = "매출"
ws.append(["항목", "금액"])
for i in range(50):
ws.append([f"품목{i}", 1000 + i])
wb.save("qa-sample.xlsx")

prs = Presentation()
for i in range(5):
slide = prs.slides.add_slide(prs.slide_layouts[1])
slide.shapes.title.text = f"슬라이드 {i + 1} 제목"
slide.placeholders[1].text = f"PPTX 검증용 본문 {i + 1}"
prs.save("qa-sample.pptx")

PDF·HWP는 실파일을 준비하세요. (HWP는 HWPX도 가능하며, 텍스트 추출이 가능한 문서여야 합니다 — 스캔 이미지만 든 문서는 미지원.)

0-2. ⚠️ 중요 — 기존 문서는 재업로드 필요

문서 뷰어의 시각 렌더는 업로드 시점에 원본을 별도 저장합니다. 따라서 이 기능 배포 이전에 올라간 문서는 원본이 없어 시각 프리뷰가 뜨지 않고 텍스트 뷰로 fallback됩니다. QA 시에는 반드시 새로 업로드한 문서로 검증하세요.

0-3. 검증 위치

브라우저에서 경로 /ai/documents (상단 제목이 문서인 페이지)로 이동해 진행합니다.


1. UI 업로드 (전 포맷 공통)

  1. 문서 페이지 우상단 문서 업로드 버튼을 클릭합니다.
  2. 파일 선택 다이얼로그에서 샘플 파일을 고릅니다. 파일 선택기의 허용 확장자가 .pdf, .docx, .hwp, .xlsx, .pptx, .txt, .md 인지 확인합니다.
  3. 보안 등급(기본 PUBLIC)을 두고 업로드 + Ingest 를 클릭합니다.
  4. 잠시 후 목록 표에 방금 올린 파일이 청크 수와 함께 나타나면 성공입니다.

체크포인트: PDF·DOCX·XLSX·PPTX·HWP 5종 모두 이 업로드 버튼으로 올라가야 합니다(드래그 우회가 아니라 실제 UI 업로드).


2. 포맷별 시각 프리뷰 + 청크 하이라이트 검증

각 포맷마다: ① 목록에서 파일 행 클릭 → 프리뷰 열기 → ② 좌측에 시각 렌더 확인 → ③ 우측 청크 목록에서 청크 클릭 → ④ 좌측에 하이라이트 표시 확인.

2-1. PDF

PDF 페이지가 이미지로 렌더되고, 청크 클릭 시 반투명 인디고 박스(bbox) 가 해당 텍스트 줄들을 덮습니다. 여러 줄에 걸친 청크는 줄마다 박스가 생기고 해당 페이지로 스크롤됩니다.

PDF — 청크 bbox 하이라이트

✅ 청크를 클릭하면 좌측 PDF에 인디고 박스가 뜨고 그 위치로 스크롤되어야 합니다.

2-2. HWP / HWPX

HWP가 SVG로 렌더되고(수식·표 포함), 청크 클릭 시 글자 위에 인디고 사각형 오버레이가 표시됩니다.

HWP — 청크 위치 하이라이트

✅ 수식이 많은 문서는 일부 청크가 부분 매칭될 수 있으나(graceful), 본문 청크는 정상 하이라이트됩니다.

2-3. DOCX

Word 문서가 본문 HTML로 렌더되고, 청크 클릭 시 해당 문단 텍스트가 인디고 형광펜(<mark>) 으로 표시되며 그 위치로 스크롤됩니다.

DOCX — 청크 텍스트 하이라이트

✅ 만약 변환 결과가 비어 있는 문서(텍스트박스/헤더 위주)라면 자동으로 텍스트 뷰로 fallback 됩니다(빈 화면에 멈추지 않음).

2-4. XLSX

엑셀이 시트 탭 + 표로 렌더되고, 청크 클릭 시 매칭되는 셀의 배경이 인디고로 강조됩니다. 매칭이 가장 많은 시트로 자동 전환되며, 시트 탭에는 매칭 셀 수가 (N) 으로 표시됩니다. 사용자가 수동으로 다른 탭을 눌러도 강제 복귀되지 않습니다.

XLSX — 셀 매칭 하이라이트 + 시트 탭

✅ 시트 탭 라벨에 매출 (153) 처럼 매칭 수가 보이고, 해당 셀들이 강조되어야 합니다.

2-5. PPTX

파워포인트가 슬라이드로 렌더되고, 청크 클릭 시 해당 슬라이드 텍스트가 인디고 형광펜 으로 표시됩니다.

PPTX — 슬라이드 텍스트 하이라이트

✅ 청크 본문 머리의 [Slide N] 표기는 RAG용 내부 마커이며, 하이라이트는 마커를 제외한 실제 슬라이드 텍스트에 정확히 매핑되어야 합니다.


3. 엣지 케이스 체크리스트

#시나리오기대 동작
1기능 배포 이전 업로드 문서 열기시각 렌더 대신 텍스트 뷰로 표시(빈 화면 X)
2청크 선택 해제 후 같은 청크 재선택다시 해당 위치로 스크롤됨
3문서 A에서 청크 선택 → 문서 B 열고 같은 인덱스 청크 선택문서 B의 올바른 위치로 스크롤됨
4매칭되는 텍스트가 없는 청크(수식·이미지 위주)하이라이트 없이 렌더만 유지(에러 X)
55MB(PPTX는 15MB) 초과 대용량 문서텍스트 뷰로 fallback
6DOCX 변환이 빈 결과텍스트 뷰로 fallback(“변환 중…”에서 멈추지 않음)

4. 통과 기준 (Definition of Done)

  • PDF·HWP·DOCX·XLSX·PPTX 5종 모두 UI 업로드 → 시각 렌더 확인
  • 5종 모두 청크 클릭 시 좌측에 하이라이트(bbox / rect / mark / 셀) 표시 + 해당 위치로 스크롤
  • 기존(구) 문서는 텍스트 뷰로 안전하게 fallback
  • 매칭 실패 청크에서도 화면이 깨지지 않음

참고: 본 기능의 설계 배경과 포맷별 구현은 내부 스펙 docs/superpowers/specs/2026-06-08-office-preview-design.md2026-06-06-document-viewer-chunk-highlight-design.md 를 참고하세요.