#원문이 들어왔는지부터
공고 검토에서 답이 빠졌을 때 모델을 다시 부르면 나아질지 생각하게 된다. 그런데 그 전에 확인할 것이 있었다. 모델이 읽을 문서에 해당 조항이 들어왔는가.
HWP와 HWPX를 Markdown으로 옮기는 도구를 비교하며 이 차이를 봤다. 정상 입력 11개에서는 비교한 네 도구 모두 실행을 마치고 파일을 만들었다. 하지만 결과에 남은 본문과 각주, 표 구조는 같지 않았다.
| 비교 도구 | 당시 버전 | 확인 문구·주요 차이 |
|---|---|---|
| hwp-cli | 1.3.1 | 112/112, 병합 표·각주 |
| rhwp-python | 0.8.1 | 112/112, 일부 이미지 제외 |
| hwp2md | 1.0.1 | 111/112, 각주 누락 |
| pyhwp2md | 0.1.3 | 71/112, 표·본문 누락 |
이 링크들은 비교한 도구의 공개 소스다. hwp-cli는 일반 Markdown 변환의 기본 후보로 남겼다. 뒤의 공고 한 건을 복구한 경로에 새로 도입한 도구는 아니다.
확인 문구 112개가 모두 남은 경우도 문서 전체가 무손실로 변환됐다는 뜻은 아니었다. 같은 문서에서 파생한 표본이 있었고, 모든 표의 의미와 모든 쪽의 배치를 검수한 것도 아니었다.
#읽는 문서와 보는 문서
Markdown으로 보관할 때는 본문과 표의 관계가 잘 남는 직접 변환 경로를 살폈다. PDF는 원문이 어떻게 보이는지 대조하는 데 썼다. 이미 공고 처리에 연결돼 있던 rhwp 0.8.6의 PDF 변환 경로도 이 목적으로 재사용했다. 비교표의 rhwp-python 0.8.1과는 버전과 실행 경로가 다르다.
PDF를 거쳐 다시 Markdown으로 바꾸면 글자는 있어도 가상의 표 셀로 쪼개지는 경우가 있었다. 확인 문구가 연속 문자열로 검색되지 않는다고 바로 누락으로 세면 안 됐다. 반대로 PDF 화면에 보인다는 이유로 기계가 읽을 구조까지 잘 남았다고 볼 수도 없었다.
손상 입력도 따로 시험했다. 비정상 입력 7개 중에는 도구가 오류 없이 끝나면서 빈 결과를 내는 경우가 있었다. 파일 생성과 종료 코드 외에 형식과 본문을 확인할 이유가 여기에 있었다.
#변경 추적 때문에 멈춘 한 문서
이후 계약특수조건 HWP 한 건을 다시 살폈다. 기존 추출 경로는 변경 추적 설정을 보고 처리를 멈추고 있었다. 그 상태만으로 본문이 손상됐다거나 문장을 읽을 수 없다고 말하기는 어려웠다.
원본을 보존하고 텍스트와 표, 변환 PDF를 대조했다. HWP의 본문 스트림 BodyText와 표시용 스트림 ViewText를 읽으니 문단 텍스트 레코드 82개가 바이트 단위로 같았다. 텍스트는 같아도 ViewText에는 변경 영역 표시가 남아 있었다. 본문이 같다는 검사만으로 변경 수락 여부까지 결정할 수 없었다.
변경 표시는 별도로 조사한 hwp-swift의 읽기 전용 로더와 PDF 출력으로 대조했다. 당시 고정 커밋의 변경 표시 코드는 삽입·삭제 표시를 그리는 구현을 확인할 자료다. 이 라이브러리를 운영 추출기에 추가한 것은 아니다. 추적 설정을 지우거나 변경 내용을 일괄 수락하지도 않았다.
대조 과정에서 하도급 조건의 문구도 확인했다. 문장이 추출됐다는 사실과 그 변경이 공식적으로 수락돼 최종 계약에 적용되는지는 별개였다. 후자의 답을 추출 도구가 대신 정하게 하지 않았다.
#새 추출만 더하고 과거 기록은 남겼다
실제 수정은 rhwp 0.8.6 앞의 추출 허용 조건이었다. 이전에는 변경 추적 플래그가 있으면 본문을 읽기 전에 차단했다. 보완한 bounded-9에서는 ViewText가 있을 때 구역 번호·개수와 문단 텍스트가 BodyText와 모두 같은지 검사했다. 다르거나 구역이 빠졌거나 손상된 문서는 계속 차단했다. 암호·압축 검증도 유지했다.
이 경로로 저장돼 있던 원본 한 건을 재변환했다. 결과는 5쪽, 표 26셀, 본문 3,478자였다. 상태는 partial, 오류 분류는 hwp_tracked_changes로 남겼다. 실패·빈 본문에서 텍스트와 표가 있는 부분 추출로 바뀐 것이다. 본문을 확보했어도 추적 경고와 최종 적용 미확인 범위는 사라지지 않았다.
원본과 기존 추출 버전, 이전 분석, 실패 이력을 보존했다. 실패 행을 지우거나 성공으로 고치지 않고, 같은 문서·공고 버전의 후속 변환으로 해결됐다는 관계를 남겼다.
운영 화면에서는 새 변환본과 경고를 확인했다. 기존 분석은 새 근거를 반영하지 않은 이전 결과로 표시했다. 이 작업에서 추가 AI 호출과 재수집은 없었다. 추출이 바뀌었다는 이유로 예전 분석까지 최신으로 보이게 하지 않은 것이다.
#고친 것은 입력이었다
이 사례는 문서 한 건의 추출 문제를 해결한 기록이다. 모든 HWP 변환이나 계약 판단을 자동화한 결과가 아니다. 다른 형식의 표·수식·글상자, 실제 암호 문서, 전체 시각 배치에는 별도 검증이 필요하다.
공고 선별 화면의 점수를 살폈던 글에서는 모델에 무엇을 물었는지 확인했다. 이번에는 그 질문 앞에 들어가는 원문을 확인했다. 빠진 답이 있을 때 질문을 바꾸거나 모델을 다시 부르기 전에, 읽어야 할 문장이 제대로 전달됐는지부터 볼 필요가 있었다.