From 826f66f8f55c217ed9c4c778eabb06b1f83707d6 Mon Sep 17 00:00:00 2001 From: hyungi Date: Sun, 24 May 2026 09:48:03 +0000 Subject: [PATCH] fix(search): correct large-doc manifest wording after commit 4 drop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-DocSrv-LargeDoc-Split-Markdown-1 follow-up (plan brisk-paging-quokka.md). commit 4(marker_section→document_chunks) 드롭으로, split md_content/manifest 의 「권위 검색본 = document_chunks (source_type=marker_section)」 문구가 실제와 불일치. 실제 = 검색 인덱스는 기존 document_chunks(extracted_text long_pdf window chunks), marker_section chunk 부재, md_content 는 Markdown 렌더링 preview. - _build_large_md_content 헤더: 「검색 인덱스 = 기존 document_chunks long_pdf/ extracted_text window chunks. 아래는 Markdown 렌더링 preview.」 - _split_manifest: canonical_storage(marker_section) → search_index(legacy/extracted_text) - 상수 주석 + _process_split docstring: commit 4 드롭/이중적재 회피 반영 뷰어에 없는 source_type 으로 디버깅 오도 방지. 이미 처리된 5 docs 의 md_content 는 즉시 재처리 X — 자연 reprocess 시 갱신(사용자 결정). Co-Authored-By: Claude Opus 4.7 (1M context) --- app/workers/marker_worker.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/workers/marker_worker.py b/app/workers/marker_worker.py index 05ff158..3d7fc66 100644 --- a/app/workers/marker_worker.py +++ b/app/workers/marker_worker.py @@ -44,8 +44,9 @@ MAX_PAGES = 200 # 소형 1-shot 경로 /convert max_page # LargeDoc split (PR-DocSrv-LargeDoc-Split-Markdown-1, plan brisk-paging-quokka.md): # >SPLIT_THRESHOLD_PAGES PDF 는 통째 skip 대신 BATCH_PAGES 윈도우로 page-range 분할 변환. -# 각 batch /convert 호출 < MARKER_TIMEOUT 보장 + queue 폭주 회피. 권위 검색본(섹션 chunks)은 -# commit 4 에서 document_chunks(source_type=marker_section) 에 적재 (본 commit 3 미포함). +# 각 batch /convert 호출 < MARKER_TIMEOUT 보장 + queue 폭주 회피. 목적 = md_content(Markdown +# 렌더링) 복구. 검색 인덱스는 기존 document_chunks(extracted_text window chunks)가 담당 +# (commit 4 marker_section 적재는 이중 적재 회피로 드롭 — 별 PR retrieval 비교 후보). SPLIT_THRESHOLD_PAGES = int(os.getenv("MARKER_SPLIT_THRESHOLD_PAGES", "120")) BATCH_PAGES = int(os.getenv("MARKER_BATCH_PAGES", "40")) MAX_SPLIT_PAGES = int(os.getenv("MARKER_MAX_SPLIT_PAGES", "5000")) # 초과 = skipped_too_large 안전상태 @@ -377,9 +378,9 @@ async def _process_split( """대형 PDF page-range 분할 변환. BATCH_PAGES 윈도우로 순차 /convert (각 호출 < MARKER_TIMEOUT). batch 단위로 - 이미지 persist + ref rewrite 후 stitch. md_content = head+manifest (full blob 미저장, - canonical 검색본 = document_chunks, commit 4). 결과: 전부 성공=success / 일부=partial / - 전부 실패=failed. + 이미지 persist + ref rewrite 후 stitch. md_content = head+manifest (full blob 미저장). + 검색 인덱스는 기존 document_chunks(extracted_text window)가 담당 (marker_section 적재 + = commit 4 드롭). 결과: 전부 성공=success / 일부=partial / 전부 실패=failed. invariant: page numbering = 1-based inclusive (batch1: 1..BATCH_PAGES, ...). marker slug(`_page_0_*`) 는 batch 마다 재시작 → batch 별 rewrite 후 stitch (충돌 회피). @@ -547,7 +548,7 @@ def _split_manifest( {"start_page": f["start_page"], "end_page": f["end_page"], "error": f["error"]} for f in failed ], - "canonical_storage": "document_chunks(source_type=marker_section)", + "search_index": "document_chunks(legacy/extracted_text window chunks)", } @@ -561,7 +562,8 @@ def _build_large_md_content(head: str, manifest: dict[str, Any]) -> str: f"failed={failed_n} -->\n" f"> 📄 **대형 문서 분할 변환** — 총 {manifest['total_pages']}p · " f"{manifest['batch_count']} batch (batch_pages={manifest['batch_pages']}) · 상태 **{badge}**\n" - f"> 권위 검색본 = `document_chunks` (source_type=marker_section). 아래는 head preview.\n\n" + f"> 검색 인덱스 = 기존 `document_chunks` long_pdf/extracted_text window chunks. " + f"아래는 Markdown 렌더링 preview.\n\n" ) return header + head