본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 02. 17:10

취약한 정규표현식(Regex) 작성을 멈추고 AI로 지저분한 데이터를 파싱하게 된 방법

요약

정규표현식과 기존 라이브러리로 해결하기 어려운 비정형 PDF 데이터 추출 문제를 LLM을 활용해 해결하는 방법을 소개합니다. 텍스트를 마크다운으로 변환한 뒤 프롬프트를 통해 JSON 형식으로 구조화된 데이터를 추출하는 워크플로우를 제안합니다.

핵심 포인트

  • 정규표현식 대신 LLM을 사용하여 레이아웃 변화에 유연하게 대응
  • 문서를 텍스트/마크다운으로 변환 후 JSON 출력을 유도하는 프롬프트 활용
  • GPT-4와 같은 고성능 모델이 환각 현상 방지에 유리함
  • 보안이 중요한 경우 Ollama와 Llama 3를 통한 로컬 구축 가능

몇 달 전, 저는 수백 개의 PDF에서 구조화된 데이터를 추출해야 했습니다. 각 PDF는 동일한 종류의 정보(날짜, 이름, 금액)를 담고 있었지만, 문서마다 레이아웃이 조금씩 달랐습니다. 저의 첫 번째 본능은? 정규표현식 (Regex)이었습니다. 두 번째는? BeautifulSoup이었습니다. 결과는 둘 다 처참한 실패였습니다.

저를 분노하게 만든 문제

저는 다양한 공급업체의 인보이스(invoices)를 수집하는 클라이언트 프로젝트를 진행하고 있었습니다. 사람의 눈에는 모두 비슷해 보였지만, 컴퓨터 파서(parsers)에게는? 악몽이었습니다.

  • 어떤 테이블은 테두리가 있었고, 어떤 것은 없었습니다.
  • 어떤 것은 "Total"을 오른쪽 하단에 배치했고, 어떤 것은 왼쪽 하단에 배치했습니다.
  • 몇몇 PDF는 텍스트 레이어가 없는 단순 스캔 이미지였습니다.

저는 다음과 같은 것들을 시도했습니다:

  • PyPDF2 / pdfplumber: 깔끔한 PDF에서는 작동했지만, 스캔된 문서나 일관되지 않은 간격에서는 실패했습니다.
  • Regex (정규표현식): 새로운 공급업체가 등장할 때마다 깨져버리는 패턴을 만드느라 며칠을 허비했습니다.
  • PaddleOCR: 텍스트를 추출하는 데는 성공했지만, 결국 그 텍스트를 다시 파싱해야 했습니다.

저는 클라이언트에게 이 정도 규모에서는 불가능하다고 말하려던 참이었습니다.

처음부터 시작했어야 했던 접근 방식

사람들이 추출 작업에 대규모 언어 모델 (LLMs)을 어떻게 사용하는지에 대해 읽은 후, 저는 시도해 보기로 했습니다. 아이디어는 간단합니다. 데이터가 어디에 있는지 찾기 위한 규칙을 작성하는 대신, 데이터가 무엇인지 평이한 영어로 설명하고 AI가 이를 추출하게 하는 것입니다.

이것은 새로운 아이디어는 아니지만, 마치 치팅(cheating)처럼 느껴졌습니다. 그리고 솔직히 말하면, 좋은 의미에서 어느 정도 치팅이 맞습니다.

핵심 기술은 다음과 같습니다:

  1. 각 문서를 일반 텍스트(또는 구조가 중요하다면 마크다운 (markdown))로 변환합니다.
  2. 특정 필드를 JSON 형식으로 요청하는 프롬프트 (prompt)를 작성합니다.
  3. 텍스트와 프롬프트를 LLM (GPT-4 또는 로컬 모델 등)에 보냅니다.
  4. JSON 응답을 파싱합니다.

더 이상 정규표현식 (regex) 유지보수도, 레이아웃에 대한 가정도 필요 없습니다.

(거의) 그대로 복사해서 붙여넣을 수 있는 코드

아래는 제가 작성한 Python 함수입니다. 이 함수는 원시 텍스트(PDF, HTML, OCR을 통한 이미지 등 모든 소스)를 입력받아 구조화된 딕셔너리 (dictionary)를 반환합니다.

import json
import os
from openai import OpenAI
...

content = response.choices[0].message.content
if "\n\n\njson" in content:
content = content.split("\n\n```\n")[0].strip()
return json.loads(content)
...


**사용 예시 (Usage example):**

```python
text = "Invoice #INV-2024-001 Date: 15-Jan-2024 Vendor: Office Supplies Co. Items: Paper x5 $50, Pens $10 Total: $60"
...

또한 개인정보 보호가 중요한 데이터를 위해 Ollama + Llama 3를 사용한 셀프 호스팅 (self-hosted) 옵션도 실험해 보았습니다. 작동은 했지만, 속도가 더 느리고 때때로 필드를 환각 (hallucinate) 하는 현상이 있었습니다. 많은 프로덕션 (production) 사용 사례의 경우, 특히 캐싱 (caching)을 통한 배치 처리 (batch processing) 시에는 호출당 비용을 지불하더라도 GPT-4의 신뢰성이 그만한 가치가 있다고 생각합니다.

배운 점 (Lessons learned - 고생하며 얻은 교훈)

효과적이었던 방법:

  • 프롬프트 엔지니어링 (Prompt engineering)은 매우 중요합니다. 출력 형식에 대해 명시적으로 작성하세요. 까다로운 필드의 경우 예시(few-shot)를 사용하세요.
  • 결정론적 (deterministic) 동작을 위해서는 Temperature = 0 설정이 필수적입니다.
  • 긴 문서 (10k+ 토큰)의 경우, 섹션별로 나누어 추출(chunk and extract)한 다음 병합하세요.

효과적이지 않았던 방법:

  • 문서가 클 때 한꺼번에 모든 것을 요청하는 것 – 모델이 문맥 (context)을 놓칩니다.
  • 파인튜닝 (fine-tuning) 없이 베이스 모델 (base models)을 사용하는 것 – 강력하게 유도하지 않으면 모델은 송장 (invoice) 형식을 "알지" 못합니다.
  • AI 출력물의 후처리 (post-processing)를 위해 정규표현식 (regex)에 의존하는 것 – 그냥 JSON 파싱 (parse)을 믿고 재시도 루프 (retry loop)를 추가하세요.

트레이드오프 (Trade-offs):

  • 비용 (Cost): OpenAI 호출 비용이 쌓입니다. 월 수백 건의 문서라면 저렴합니다. 수천 건이라면 로컬 모델이나 더 저렴한 API (Claude Haiku, Gemini Flash)를 고려하세요.
  • 지연 시간 (Latency): 각 호출에는 1~3초가 소요됩니다. 속도가 필요하다면 비동기 (asynchronously) 방식으로 배치 처리하세요.
  • 환각 (Hallucinations): 가끔 AI가 송장 번호를 지어냅니다. 간단한 검증(예: 날짜 형식, 품목 합계와 총액 비교)을 통해 이를 완화하세요.

다음에 다시 한다면 다르게 할 점

만약 처음부터 다시 시작해야 한다면, 저는 다음과 같이 할 것입니다:

  • 정규표현식 (Regex)에 몇 주를 소비하는 대신, 더 일찍 더 간단한 AI 접근 방식을 시도했을 것입니다.
  • 추출된 숫자들을 교차 검증하고 (예: 품목 합계가 총액과 일치하는지 확인), 불일치하는 경우 수동 검토를 위해 플래그를 지정하는 검증 레이어 (Validation layer)를 구축했을 것입니다.
  • API 키를 직접 관리하는 것을 피하기 위해 InterwestInfo의 AI 추출기(AI extractor)와 같은 도구를 사용했을 것입니다 (만약 사용 사례에 적합하다면). 하지만 솔직히 말하면, 직접 구현한 방식이 완전한 제어권을 제공했고 벤더 종속성 (Vendor lock-in)도 전혀 없었습니다.

아, 그리고 프롬프트 템플릿 (Prompt templates)을 코드처럼 문서화하여 버전 관리 (Version-controlled)가 가능하고 테스트할 수 있도록 했을 것입니다.

마치며

AI 추출은 마법이 아닙니다. 이는 초기 엔지니어링 (Upfront engineering)과 지속적인 신뢰성 (Ongoing reliability) 사이의 트레이드오프 (Trade-off)입니다. 지저분하고 가변적인 데이터의 경우, AI는 다른 대안들보다 훨씬 뛰어난 성과를 보여주었습니다. 하지만 저는 여전히 입력 텍스트를 정제하고 (헤더/푸터 제거, 공백 정규화), 변경되지 않은 문서에 대해 API를 호출하지 않도록 결과를 캐싱 (Cache)합니다.

이제 궁금합니다: 정리되지 않은 쓰레기 같은 데이터 더미에서 데이터를 추출하기 위한 여러분만의 비법은 무엇인가요? AI를 사용하시나요, 아니면 더 똑똑한 휴리스틱 (Heuristic)을 찾으셨나요?

이 기사는 저의 개인적인 경험을 바탕으로 작성되었습니다. 어떤 도구도 만능 해결책 (Silver bullet)은 아닙니다. 항상 귀하의 특정 데이터와 예산에 맞춰 평가하십시오.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0