- nlm-ingestor는 llmsherpa API가 연결해 쓰는 서비스 코드로, RAG에 맞춘 PDF·HTML·Text·DOCX·PPTX 등 문서 파서를 제공함
- PDF 파서는 nlmatics 수정판 Tika에서 얻은 텍스트 좌표, 그래픽, 폰트 데이터를 사용하며, 스캔 페이지가 있으면
apply_ocr옵션으로 OCR을 자동 적용할 수 있음 - PDF 처리 기능에는 섹션·하위 섹션 수준, 문단 병합, 섹션-문단 연결, 표, 중첩 목록, 페이지 간 콘텐츠 결합, 반복 헤더·푸터 제거, 워터마크 제거, OCR 바운딩 박스가 포함됨
- 모델 기반 비전 파서와 비교해 규칙 기반 파서는 PDF 페이지 이미지를 만들 필요가 없어 100배 빠르다고 설명하며, OCR이 아닌 텍스트 레이어 PDF와 수백 페이지 문서에서 더 실용적이라고 봄
- 개발용 서버는 Docker 또는 직접 실행으로 띄울 수 있고, 운영 환경에서는 nginx나 클라우드 게이트웨이 같은 보안 게이트웨이 뒤에서 실행하는 구성이 권장됨
nlm-ingestor가 제공하는 문서 파서
- nlm-ingestor는 llmsherpa API가 연결할 수 있는 서비스 코드 저장소임
- RAG(retrieval augmented generation)에 맞춘 커스텀 파서를 여러 파일 형식에 제공함
-
PDF
-
HTML
-
Text
- DOCX, PPTX, Apache Tika가 지원하는 기타 형식
-
PDF 파서의 동작 방식과 기능
- PDF 파서는 규칙 기반이며, nlmatics 수정판 nlm-tika에서 얻은 텍스트 좌표, 그래픽, 폰트 데이터를 사용함
- PDF 텍스트 레이어를 기반으로 동작하며,
apply_ocr옵션을 통해 PDF에 스캔 페이지가 있으면 OCR을 자동 적용할 수 있음 - OCR 기능은 내부적으로 tesseract를 사용하는 nlmatics 수정판 Tika에 기반함
- PDF 파서를 직접 실험할 수 있는 노트북으로 pdf_visual_ingestor_step_by_step이 제공됨
- PDF 파서 기능은 다음과 같음
- 섹션과 하위 섹션 및 각 레벨 식별
- 여러 줄을 합쳐 문단 구성
- 섹션과 문단 사이의 연결 생성
- 표와 표가 발견된 섹션 식별
- 목록과 중첩 목록 처리
- 페이지를 넘나드는 콘텐츠 결합
- 반복되는 헤더와 푸터 제거
- 워터마크 제거
- OCR 결과에 대한 바운딩 박스 제공
HTML·Text·Office 문서 처리
- HTML 파서는 RAG 성능을 높이기 위해 더 품질 좋은 청크를 만들도록 레이아웃 인식 블록을 생성함
- Text 파서는 시각 정보, 폰트 정보, 바운딩 박스 없이 텍스트만 보고 목록, 표, 헤더 등을 추정함
- DOCX, PPTX 및 Apache Tika가 지원하는 다른 형식은 Tika의 HTML 출력을 사용한 뒤 HTML 파서로 처리함
실행과 API 사용
- 직접 실행 절차는 Java 설치, Tika 서버 실행,
nlm-ingestor설치, ingestor 실행으로 구성됨- Tika 서버 실행:
java -jar <path_to_nlm_ingestor>/jars/tika-server-standard-nlm-modified-2.9.2_v2.jar - 설치:
pip install nlm-ingestor - 실행:
python -m nlm_ingestor.ingestion_daemon
- Tika 서버 실행:
- 공개 GitHub Container Registry에 Docker 이미지가 제공됨
- 이미지 받기:
docker pull ghcr.io/nlmatics/nlm-ingestor:latest - 실행 예:
docker run -p 5010:5001 ghcr.io/nlmatics/nlm-ingestor:latest-<version>
- 이미지 받기:
- 서버 실행 후 llmsherpa API 라이브러리로 청크를 받아 LLM 프로젝트에 사용할 수 있음
llmsherpa_url예시는http://localhost:5010/api/parseDocument?renderFormat=all임- OCR 적용:
&applyOcr=yes - 헤더 레벨 할당에 다른 알고리듬을 쓰는 새 indent 파서 사용:
&useNewIndentParser=yes
- OCR 적용:
- 개발용 서버로는 사용할 수 있지만, 운영 환경에서는 nginx나 클라우드 게이트웨이 같은 보안 게이트웨이 뒤에서 실행하는 구성이 권장됨
- llmsherpa 파서로 서버를 테스트하는 샘플 코드는 test_llmsherpa_api 노트북에 있음
규칙 기반 파서를 선택한 이유
- nlmatics 팀은 4년 동안 Tom Liu와 Yi Zhang이 개발한 YOLO 기반 비전 파서를 포함해 여러 선택지를 평가한 뒤 규칙 기반 파서를 선택함
- 규칙 기반 파서는 어떤 비전 파서보다 상당히 빠르며, 저장소 설명은 이를 100배 빠름으로 표현함
- 비전 파서는 텍스트 레이어가 있는 PDF라도 모든 페이지 이미지를 만들어야 함
- 비전 파서는 텍스트 레이어가 없는 OCR PDF나 폼 데이터로 구성된 작은 PDF에는 더 나은 선택지일 수 있음
- 수백 페이지에 걸친 큰 텍스트 레이어 PDF에는 규칙 기반 파서가 더 실용적이라고 봄
- PDF OCR 기능을 쓰지 않는다면 특수 하드웨어가 필요 없음
- 저장소 설명은 2000년대 초반 하드웨어에서도 실행할 수 있다고 밝힘
- 비전 파서를 포함한 모든 파서는 오류가 생길 수 있으며, 모델 기반 파서의 오류 수정 방식은 만족스럽지 않았다고 설명함
- 학습 세트에 예시를 더 추가하면 이전 학습의 정확도가 떨어지고 기존에 동작하던 코드가 불확실해질 수 있음
- 모델 기반 파서 문제를 규칙 기반 아이디어로 고치면 다시 많은 규칙을 작성하게 됨
nlmatics 수정판 Tika
- nlmatics 수정판 Tika는 2.4.1-nlm 브랜치에 있음
- 편의를 위해 컴파일된 jar 파일이 저장소의
jars/폴더에 포함됨 - 일부 PDF는 Java 서버에서 오류가 날 수 있으며, 이 경우 해당 코드를 수정하고 jar 파일을 다시 컴파일해야 함
- 수정된 파일은 PDF 텍스트 요소마다 폰트와 좌표를 추가하고 워터마크를 제거함
PDF2XHTML.javaAbstractPDF2XHTML.java
GraphicsStreamProcessor.java변경은 표 탐지에 도움이 될 수 있는 선과 사각형을 추가하기 위한 것임- 변경의 영향은 pdf_visual_ingestor_step_by_step 노트북 앞부분에서 확인할 수 있음
- 향후 작업 아이디어는 다음과 같음
- pdfbox 위에 자체 래퍼를 작성해 Tika 변경 의존성을 제거
- 최신 Tika 버전으로 업그레이드
- 반환되는 HTML 형식을 더 CSS 친화적으로 정리