긴 PDF를 나눠 요약하면서 페이지와 출처를 보존하는 방법

PDF를 추적 가능한 묶음으로 나누고 원래 페이지 번호, 변경 이력, 누락 여부를 확인합니다. 24페이지 예제와 분할 스크립트, 실제 결과를 제공합니다.

따로 고정된 여러 구간을 하나의 연속된 밧줄이 연결하는 일러스트.

PDF 전체를 한 번에 안정적으로 처리하기 어렵다면 식별 가능한 묶음으로 나누고, 묶음별 근거를 추출한 다음, 근거를 통합한 뒤 요약하세요. 파일을 나누는 것만으로는 부족합니다. 원본의 어느 페이지가 전달됐고 어떤 사실이 남았으며 후속 변경이 이전 내용을 대체하는지 확인해야 합니다.

이 글에는 작성자가 만든 24페이지 연습 보고서와 로컬 분할 스크립트가 있습니다. 쉽게 확인할 수 있도록 만든 작은 문서입니다. 페이지 추적과 상충하는 수정사항을 다루는 예제이지, 24페이지가 모델의 컨텍스트 한도를 넘는다는 실험이나 장문 기억력 벤치마크가 아닙니다.

분할 전에 어떤 한도인지 진단하기

‘너무 길다’는 말은 여러 문제를 뜻할 수 있습니다. 파일 크기 제한으로 업로드가 실패하거나 스캔 문서에 추출할 텍스트가 없을 수 있습니다. 입력이 모델 한도를 넘기도 하고 출력 한도가 작아 답이 중간에 끝나기도 합니다. 파일을 받은 도구가 검색 방식으로 일부 내용을 제공할 수도 있으므로 전체 PDF가 한 번의 모델 요청에 들어갔다고 가정하면 안 됩니다.

해결책도 다릅니다. 이미지 압축은 바이트를 줄이지만 추출 텍스트를 줄이지 않을 수 있습니다. 짧은 요약을 요구하는 것은 출력을 바꾸는 것이지 입력량을 반드시 줄이는 것은 아닙니다. PDF를 거부하는 업로드 경로는 모델 이름만 바꿔도 해결되지 않습니다.

정확한 오류, 텍스트 검색 가능 여부, 페이지 수, 요청 작업을 확인하세요. 한도와 지원 입력은 바뀔 수 있으므로 모델과 날짜도 기록합니다. 컨텍스트 윈도 설명(영어)은 컨텍스트와 출력 한도를 구분합니다. 메가바이트나 페이지 수에 보편적인 상수를 곱해 엄격한 토큰 한도를 추정하지 마세요.

정답을 확인할 수 있는 문서 준비하기

24페이지 프로젝트 보고서, 분할 스크립트, 대조용 사실 데이터를 받으세요. 정답 데이터는 결과 평가 전까지 어시스턴트 입력에서 제외합니다.

1페이지에는 초기 예산 USD 120,000, 12페이지에는 2026년 12월 15일 출시일이 있습니다. 17페이지는 출시일 변경, 22페이지는 예산 변경을 담습니다. 9페이지에는 식별 안내 외에는 의도적으로 비워 둔 페이지라고 적혀 있습니다. 이를 통해 ‘확인했지만 관련 내용 없음’과 ‘처리하지 않음’을 구분할 수 있습니다.

목표는 현재 출시일·예산, 이전 값과 출처 페이지, 파일럿을 막을 수 있는 선행조건을 담은 의사결정 표입니다. 변경사항을 빠뜨린 유창한 개요는 이 작업의 완료가 아닙니다.

보내기 전에 페이지 포함 목록 만들기

격리된 Python 3 환경에서 PyMuPDF를 사용합니다.

python3 -m venv .venv
source .venv/bin/activate
python -m pip install pymupdf
python split_report.py sample-project-report.pdf report-batches \
  --max-pages 6 --max-chars 12000

스크립트는 새 출력 디렉터리에 PDF 4개, 텍스트 파일 4개, manifest.json을 만듭니다. 미리 준비한 연습 묶음도 받을 수 있습니다. 이는 모델이 아니라 스크립트가 만든 파일입니다. 기존 디렉터리 재사용을 거부해 이전 결과를 조용히 바꾸지 않습니다. 텍스트의 각 페이지 앞에는 원본 파일명과 원래 페이지 번호가 있으며, 매니페스트에는 원본 SHA-256, 전체 페이지 수, 묶음별 원본 페이지가 기록됩니다.

문자 수 제한은 작업 제어값이지 토크나이저가 아닙니다. 6페이지 제한도 이 예제를 검토하기 쉽게 만든 설정입니다. 모델, 내용 밀도, 출력 여유에 맞게 둘 다 조정하세요. 한 페이지가 문자 목표를 넘으면 조용히 자르지 않고 초과 페이지로 표시합니다. 의미 있는 절 단위로 나누고 각 절에 원래 페이지 참조를 유지하세요.

스크립트의 검사는 각 원본 페이지가 한 번 배정됐는지 확인합니다. 이는 파일 포함 여부를 보일 뿐 모델이 모든 페이지를 읽었다는 증거는 아닙니다. 아래의 묶음별 근거와 최종 검사가 필요합니다.

텍스트가 없거나 읽기 순서가 잘못된 페이지 확인하기

추출 텍스트가 없는 페이지는 needs-visual-review-or-OCR로 분류합니다. 자동으로 빈 페이지라 해서는 안 됩니다. 스캔 표, 도식, 필기일 수 있습니다. 원본을 열어 관련성을 판단하고 지원되는 인터페이스로 이미지나 OCR 결과를 제공하세요.

PyMuPDF 페이지 문서(영어)는 텍스트 추출과 OCR을 별개 작업으로 설명합니다. 이 기본 스크립트는 텍스트만 추출하며 OCR을 자동 실행하거나 차트 이해를 보장하지 않습니다. 텍스트가 있는 PDF도 읽기 순서는 틀릴 수 있습니다. 다단 구성, 각주, 표는 렌더링된 원본에서 확인하세요.

표가 분할 경계에 걸리면 자연스러운 위치로 경계를 옮기거나 인접 페이지를 명시적으로 중복 포함합니다. 중복 범위는 매니페스트에 기록하고 원본 페이지와 사실을 기준으로 중복 근거를 정리하세요. 비슷한 문장을 무작정 지우면 안 됩니다. 제공 스크립트는 겹치지 않는 페이지 묶음을 만들며 절이나 표의 경계를 자동 추론하지 않습니다.

묶음별로 근거 추출하기

레이아웃이 중요하면 PDF를, 텍스트 경로가 적합하면 표시된 텍스트를 사용합니다. 어느 묶음의 출력인지 알아볼 수 있게 관리하세요. 해당 묶음과 manifest.json을 첨부하거나 페이지 매핑을 요청에 붙입니다. 예를 들어 3번 묶음은 원본 13~18페이지이므로 분할 PDF의 5페이지는 원본 17페이지입니다. 텍스트에는 원본 페이지 표시가 이미 있습니다. 정답 JSON은 첨부하지 마세요.

Ofox Chat처럼 파일을 받는 어시스턴트에서는 첨부를 확인하고 분할 PDF 카운터 대신 원본 매핑을 사용하세요. 다음 요청을 각 묶음에 적용합니다. 재현성을 위해 원래 영어 프롬프트를 보존했습니다.

Read only this attached batch of the synthetic project report.
The supplied manifest maps batch pages to original PDF pages.

Return two tables:
1. Coverage: every assigned original page, status (reviewed, no relevant
   content, unreadable, or missing), and a short reason.
2. Evidence: decision/risk, exact value or date, approval/effective date
   if stated, original source page, a short supporting excerpt, and whether
   the source says it supersedes another value.

Extract the pilot launch date, budget, blocking dependencies and their
amendments. Preserve old and new values; do not silently reconcile them.
Do not guess facts from another batch. A blank page is reviewed only after
you inspect it. Report unreadable pages and missing attachments explicitly.
Do not use web sources or invent page references.

각 응답을 묶음 번호와 함께 저장하세요. 마지막 문단 하나만 남기면 페이지가 누락됐을 때 대조할 근거가 없습니다. 비공개 문서는 처리 권한이 있는 자료만 제공하고 무관한 민감 부분은 제거합니다.

요약 문장보다 근거를 먼저 통합하기

네 묶음의 근거 표가 나오면 모델에게 긴 대화 네 개를 기억하라고 하기보다 그 표를 통합하세요. 근거가 있는 주장마다 별도 기록을 남깁니다. 문서가 이전 값의 대체를 명시할 때만 새 값을 채택하세요. 날짜가 더 늦다는 사실만으로 충분하지 않은 경우가 있습니다.

Merge these four evidence tables for the same source report.
For each current decision, retain the earlier value, the amendment,
approval date, original pages and supporting excerpts. Mark unresolved
conflicts instead of choosing silently. Identify missing batch outputs.

Produce:
- A current-decisions table.
- A superseded-values table.
- A page coverage table for original pages 1 through 24.
- A short summary supported only by the reconciled evidence.
List any claim that still requires checking against the original PDF.

예제의 현재 출시일은 2027년 1월 12일입니다. 17페이지가 12페이지를 명시적으로 대체합니다. 현재 예산은 USD 135,000이며 22페이지가 1페이지를 대체합니다. 8페이지는 파일럿 시작 전에 공급업체 보안 검토를 마쳐야 한다고 합니다. 해당 주장 옆에 출처를 남기세요.

이 정답을 추출 프롬프트에 넣고 모델이 찾아냈다고 보고하면 안 됩니다. 평가에만 사용하세요. 틀린 값이 나오면 첫 결과를 보관하고 수정 결과를 분리합니다.

세 종류의 완전성 검사하기

입력 포함: 매니페스트가 원본 24페이지를 모두 배정했고 예상 묶음이 모두 존재해야 합니다. 업로드 성공이 모든 파일의 처리 증거는 아닙니다.

처리 포함: 각 출력은 배정된 페이지를 나열하며 9페이지의 관련 내용 없음 상태도 포함해야 합니다. 자기 보고는 관리에 유용하지만 그 자체로 증거는 아닙니다. 페이지 내용을 별도로 확인하세요.

답변 포함: 필요한 날짜, 예산, 의존성이 올바른 변경사항과 페이지로 제시돼야 합니다. 첫 문단만 보지 말고 앞·중간·뒤의 사실을 대조하세요. 실제 문서에서는 요청하지 않았지만 중요한 예외도 확인해 요약이 한계를 감추지 않는지 봅니다.

세 층이 모두 맞아야 통과입니다. 24/24 표시가 있어도 이전 날짜를 쓰면 오답이고, 날짜가 맞아도 없는 25페이지를 출처로 제시하면 실패입니다.

실제 4개 묶음 테스트 결과

2026년 11월 7일 네 PDF 묶음과 manifest.json을 Ofox Chat의 한 대화에 첨부했습니다. 정답이나 분할 전 PDF는 주지 않았습니다. 통합 전에 묶음별 근거 시트, 원본 페이지당 포함 행 하나, 인용, 이전 값, 예외 시트를 요구했습니다. 준비된 네 묶음을 한 대화에서 처리한 것이며 네 개의 독립 모델 세션이나 최대 컨텍스트 시험이 아닙니다. 실제 실행 언어는 영어였습니다. 이 한국어 글은 같은 결과를 설명하며 별도의 한국어 테스트를 수행했다는 뜻은 아닙니다.

실제 감사 통합 문서와 Markdown 의사결정 보고서를 받을 수 있습니다. 통합 문서에는 묶음 시트 4개와 Coverage, Decisions, Exceptions가 있습니다.

검수 항목관찰 및 독립 확인 결과
원본 페이지 포함1~24페이지 각각 한 행, 누락·중복 ID 없음
뒷받침 인용29개 인용 모두 공백 정규화 후 표시된 원본 페이지와 일치
출시일 변경17페이지의 2027년 1월 12일, 12페이지의 이전 2026년 12월 15일도 보존
예산 변경22페이지의 USD 135,000, 1페이지의 이전 USD 120,000도 보존
보안 의존성8페이지 선행조건 보존, 완료 여부는 미확인
9페이지식별 안내 외에 실질적인 내용이 없는 페이지로 기록하고 생략하지 않음

원본 페이지 매핑과 문자 수 차이가 표시된 실제 영어 Ofox Chat 시트.

모델은 두 가지 감사 한계도 표시했습니다. 분할 전 PDF가 없어서 그 해시를 확인하지 못했고, 이후 작성자가 원본과 로컬 대조를 했습니다. 모든 페이지의 추출 문자 수도 매니페스트와 달랐습니다. 차이를 재현해 보니 준비 스크립트는 get_text(sort=True).strip(), 감사 결과는 앞뒤 공백을 제거하지 않은 get_text()에 해당했습니다. 읽기 순서와 공백 표현 차이는 페이지 누락 없이도 문자 수를 바꿉니다. 모델이 해결하지 못한 일을 해결했다고 바꾸지 않고 원래의 주의사항을 보존했습니다.

차이는 무조건 지우거나 전체 실패로 선언하기 전에 조사해야 합니다. 추출 방법을 기록하고 정규화 방식을 맞춘 뒤 수를 비교하세요. 인용된 페이지 텍스트는 따로 확인해야 하며 문자 수 일치만으로 올바른 해석이 입증되지는 않습니다.

샘플은 짧고 검색 가능하며 변경사항이 명시적입니다. 출처와 대조 절차를 보여줄 뿐 모든 장문·스캔·복잡한 보고서의 정확성을 보장하지 않습니다. 실제 승인 권한이 불분명하면 의사결정 표에도 불확실성을 남기세요.

전체 재실행 없이 복구하기

실패좁힌 복구 방법
묶음 하나가 없음해당 묶음을 처리하고 근거 통합을 갱신
사실은 맞지만 페이지가 틀림원본을 열어 원래 페이지 매핑 수정
최종 결과에 예전 예산 사용두 근거 행과 변경 문구 제공, 이전 값도 보존
스캔 페이지에 텍스트 없음해당 페이지만 렌더링·OCR 후 같은 원본 ID로 추가
응답 중간 종료미완료로 표시하고 묶음이나 출력 범위를 줄여 해당 묶음 재실행
통합 요청이 너무 큼출처를 유지한 절별 근거 표로 먼저 합친 뒤 재통합, 원본 보존

‘원본 17페이지가 12페이지에 대해 말하는 부분을 다시 확인해 현재 출시일을 고치고 이전 값은 별도 표에 유지해줘’처럼 실패한 근거를 지정하세요. ‘더 정확하게 요약해줘’에는 검증할 목표가 없습니다.

다른 사람이 감사할 수 있는 결과 전달하기

원본 PDF, 해시, 매니페스트, 묶음 출력, 통합 근거, 최종 요약, 미해결 문제를 함께 보관하세요. PDF 보고서로 내보내면 다운로드 결과 검증 가이드(영어)로 미리보기뿐 아니라 실제 파일을 확인합니다. 하나의 긴 문서 대신 여러 독립 문서라면 여러 PDF 비교 절차(영어)를 사용하세요.

Ofox Chat에서 연습 보고서부터 시작하고 모든 수정에서 출처 페이지 열을 유지하세요. 목적은 파일을 요청에 넣는 것만이 아니라 동료가 전체 작업을 반복하지 않고 답을 확인할 수 있을 만큼 근거를 보존하는 것입니다.