왜 나는 레거시 오피스 파일을 위한 Pure Python 라이브러리를 만들었는가 (그리고 왜 RAG 파이프라인에 필요할까)

발행: (2025년 12월 26일 오전 06:30 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

번역할 텍스트를 제공해 주시겠어요? 내용이 포함된 본문을 알려주시면 한국어로 번역해 드리겠습니다.

레거시 파일 문제

Enterprise SharePoints는 디지털 고고학 현장과 같습니다. Marketing은 2008년에 PowerPoints를 업로드했습니다. Legal은 2005년의 Word 문서를 보유하고 있습니다. Finance는 팀원들의 대부분 경력보다 오래된 Excel 파일을 사용하고 있습니다.

These aren’t edge cases. In my experience, legacy .doc, .xls, and .ppt files make up a significant chunk of any long‑running enterprise document store. And if you’re building a system that needs to ingest all the documents, you can’t just skip them.

기존 솔루션이 나에게 맞지 않았던 이유

나는 RAG 파이프라인을 위해 AWS Lambda 함수에서 이 파일들을 처리해야 했다. 선택지는 다음과 같았다:

LibreOffice

표준 답변. LibreOffice를 설치하고 헤드리스 모드로 실행해 파일을 텍스트로 변환한다. 작동은 하지만 컨테이너 이미지에 1 GB 이상을 추가한다. Lambda는 배포 패키지에 250 MB 제한이 있고(컨테이너 이미지의 경우 10 GB이지만 여전히), 헤드리스 LibreOffice를 설정하는 것 자체가 별도의 작업이다.

Apache Tika

견고하고 널리 사용되는 도구다. 하지만 Java 런타임이 필요하고 보통 별도 서버로 실행된다. 이는 또 다른 서비스를 배포, 모니터링, 보안해야 함을 의미한다. 파이프라인의 문서 추출 단계에선 과도하게 느껴졌다.

서브프로세스를 이용한 명령줄 도구 호출

셸을 통해 호출할 수 있는 다양한 도구가 있다. 그러나 서브프로세스 호출은 보안 문제가 되고, 제한된 환경에서는 동작하지 않으며, 코드가 플랫폼에 종속적이 된다.

나는 더 간단한 것을 원했다: pip install 로 설치하고 호출할 수 있는 파이썬 라이브러리.

sharepoint-to-text 빌드하기

그래서 저는 sharepoint-to-text를 만들었습니다.

핵심 아이디어: 레거시 Office 바이너리 포맷(OLE2)과 최신 XML 기반 포맷(OOXML)을 파이썬에서 직접 파싱합니다. 외부 의존성이 없고, 서브프로세스 호출도 없습니다. 단순히 텍스트를 추출합니다.

import sharepoint2text

# 레거시 파일이든 최신 파일이든 동일하게 작동합니다
result = sharepoint2text.read_file("ancient_report.doc")
result = sharepoint2text.read_file("modern_report.docx")

지원 포맷:

  • 레거시 포맷: .doc, .xls, .ppt
  • 최신 포맷: .docx, .xlsx, .pptx
  • 그리고 .pdf와 일반 텍스트

하나의 인터페이스, 조건문 없이, 코드에 포맷 감지 보일러플레이트가 없습니다.

왜 이것이 RAG와 LLM 에이전트에 중요한가

RAG를 위한 문서 수집 시스템을 구축하고 있다면, 아마도 이질적인 입력을 다루고 있을 것입니다. 사용자는 파일을 업로드하고, 파이프라인은 문서 저장소를 크롤링합니다. 어떤 형식이 나타날지 제어할 수 없습니다.

전형적인 접근 방식은 if‑문을 연속적으로 사용하고 여러 라이브러리를 활용하는 것입니다:

# The ugly version
if path.endswith('.docx'):
    text = extract_with_python_docx(path)
elif path.endswith('.doc'):
    text = extract_with_libreoffice(path)  # hope it's installed
elif path.endswith('.xlsx'):
    text = extract_with_openpyxl(path)
# ... and so on

sharepoint-to-text를 사용하면, 다음과 같이 간단합니다:

import sharepoint2text

result = sharepoint2text.read_file(path)

이 라이브러리는 형식을 자동으로 파악하고 적절히 처리합니다.

Deployment Benefits

  • Container images stay small — LibreOffice 부피가 없습니다
  • Serverless‑friendly — Lambda, Cloud Functions, Azure Functions에서 작동합니다
  • No security concerns — 서브프로세스 호출이나 셸 실행이 없습니다
  • Cross‑platform — Windows, macOS, Linux 등 모든 환경

필요할 수 있는 경우

  • 기업 문서 저장소에 대한 RAG 파이프라인을 구축하고 있습니다
  • LLM 에이전트가 알 수 없는 연대의 사용자가 업로드한 파일을 처리해야 합니다
  • 용량 제한이 있는 서버리스 환경에 배포하고 있습니다
  • 보안 팀이 서브프로세스 실행을 허용하지 않습니다
  • 컨테이너에서 LibreOffice를 유지 관리하는 것이 지칩니다

Try It Out

pip install sharepoint-to-text

GitHub:

피드백을 주시면 감사하겠습니다. 특히 특정 파일 유형에서 엣지 케이스가 발생한다면 더욱 좋습니다. 레거시 Office 형식은 일관성이 없기로 악명 높으며, 실제 파일이 가장 좋은 테스트 사례가 됩니다.

Back to Blog

관련 글

더 보기 »