증상: RAG에 수천 개 PDF를 넣었는데 답변이 바닥글 저작권, 깨진 표, 만료된 부록을 인용한다—embedding 작업은 모두 성공.
근본 원인: 저품질 PDF는 PDF Parsing 단계에서 이미 깨지고, 더러운 청크가 Vector Database에 그대로 들어가며 검색 신뢰도는 오히려 올라간다.
2026년 7월 내부 Knowledge Base 팀의 2,400개 PDF를 감사한 결과, 골든 질문 인용 정확도가 78%에서 51%로 하락. top-3 히트의 63%에 반복 헤더나 OCR 노이즈가 포함됐다. 본문은 당시 구축한 오염 방지 파이프라인—파서 순위가 아니라 임베딩 전 게이트와 평가. 기준일 2026-08-07.
Quick Answer: 리콜보다 먼저 더러운 데이터를 막기
| 상황 | 먼저 할 일 | 서두르지 말 것 |
|---|---|---|
| 첫 PDF 배치 | 50건 샘플 Parsing 비교 + 추출률 게이트 | 더 큰 embedding 모델로 교체 |
| 헤더/저작권 인용 | 머리글·바닥글 제거 + 중복 행 dedup | 문서 더 추가 |
| 표 답변 환각 | 표 별도 파싱 또는 HTML/Markdown 변환 | 무분별한 chunk 축소 |
| 스캔 PDF 위주 | OCR 품질 점수 + 저점수는 수동 큐 | 모든 파일에 PyPDF |
| 대규모·정확도 하락 | source_id 배치 삭제 + 골든 회귀 | 원인 없이 전체 재임베딩 |
Vector Database를 오염시키는 5가지 PDF 패턴
| 패턴 | 증상 | 검색 피해 | 탐지 신호 |
|---|---|---|---|
| 반복 헤더/바닥글 | 매 페이지 동일 문구 | 일반 질의가 저작권에 히트 | 청크 내 동일 문장 ≥3회 |
| OCR 노이즈 | 문자 혼동·끊긴 단어 | 키워드·의미 불일치 | 비사전 문자 >8% |
| 깨진 표 | 열 붕괴 | 수치 환각 | 구분자 없는 긴 숫자열 |
| 2단/각주 혼선 | 단락 교차 | 인용 불연속 | 행 너비 급변 |
| 만료 부록 | 폐지 정책 | 맞지만 오래된 답 | mtime vs 버전 불일치 |
문자 수 ≠ 좋은 Knowledge Base. 최대 문자 파서가 레이아웃 인식보다 답변 가능률 11%p 낮음—노이즈도 내용으로 집계됨.
입고 게이트: embedding 전 차단
- 파일: 암호·0자·추출률 <15% → 거부/OCR.
- 페이지: 공백·이미지·근중복 → 스킵.
- 청크: token <30, 중복 >40% → 폐기.
- 업무:
source_id없음 → 쓰기 금지.
긴 컨텍스트는 깨끗한 ingest 대체 불가—Kimi K3 1M 컨텍스트와 RAG 경계.
PDF Parsing: 문자 수가 아니라 답변 가능률
| 시나리오 | 권장 | 장점 | 주의 |
|---|---|---|---|
| 디지털 PDF | PyMuPDF / pdfplumber | 빠름 | 표 취약 |
| 복잡 레이아웃 | Unstructured / Docling | 블록 분류 | CPU/RAM |
| 스캔 | 클라우드 OCR | 정확도 | 비용·프라이버시 |
실측(2026-07, 50 PDF): hit@3 레이아웃 74% vs pdfplumber 61%.
청킹: 바닥글 증폭 방지
- 제목·section 단위 분할, 긴 절만 슬라이딩 윈도우.
- 헤더 중복 시 overlap 10–15%.
- 표는
content_type=table분리.
롤백 가능한 Knowledge Base 메타데이터
source_id, ingest_batch, parser_version, content_hash, effective_date 필수. cosine >0.95 근중복은 정보 밀도 높은 쪽 유지.
사례: 2,400 PDF 롤백
| 지표 | 수정 전 | 게이트 후 |
|---|---|---|
| 40문 hit@3 | 51% | 79% |
| 헤더/저작권 인용 | 63% | 4% |
| 청크 수 | 1.28M | 0.71M |
7단계 체크리스트
- 50 PDF 샘플과 자동 게이트 비교.
- 2개 PDF Parsing을 20문으로 비교.
- 헤더/바닥글 규칙 staging 검증.
- 메타데이터와
source_id삭제 확인. - 20–50문 평가 세트 유지.
- 거부율 급증 모니터링.
- 분기별 만료 문서 정리.
로컬 시험: 30분 AI 개발 환경.
파싱은 워커, Vector Database는 깨끗한 청크만
Macstripe 클라우드 Mac으로 macOS 배치 작업 후 Linux 벡터 서비스에 동기화.
FAQ
PDF가 Markdown보다 Vector DB를 더 오염시키는 이유?
숨은 레이아웃, OCR, 반복 헤더, 깨진 표가 embedding되고 반복으로 순위가 올라감.
최소 게이트는?
추출률, 중복, 길이, 언어.source_id 없으면 쓰기 금지.
어떤 PDF Parsing?
디지털: PyMuPDF/pdfplumber. 복잡: Unstructured/Docling. 스캔: OCR. 골든 질문으로 선택.
전체 재임베딩 없이 복구?
source_id·ingest_batch로 배치 삭제→재파싱→해당 문서만 재임베딩.
결론
순서: PDF Parsing → 게이트 → 청킹·메타데이터 → 골든 평가 → embedding. Vector Database는 쓰레기를 높은 신뢰도로 반환한다.
관련: 긴 컨텍스트와 RAG · 로컬 AI 환경