AI 송장 OCR 설명: 로컬 AI가 PDF를 읽는 방법
요약
로컬 환경에서 PDFjs와 Qwen2.5 모델을 활용하여 송장 데이터를 추출하는 OCR 시스템 구축 방법을 설명합니다. pdfjs-dist로 텍스트를 추출하고 llama.cpp를 통해 경량화된 LLM을 실행하여 구조화된 JSON 데이터를 생성하는 2단계 프로세스를 다룹니다.
핵심 포인트
- pdfjs-dist를 사용하여 디지털 PDF에서 유니코드 텍스트를 추출하거나 비트맵 렌더링을 수행합니다.
- llama.cpp와 Qwen2.5 1.5B 모델을 결합하여 저사양 로컬 환경에서도 빠른 추론이 가능합니다.
- 정교한 시스템 프롬프트와 낮은 Temperature 설정을 통해 JSON 출력의 정확도를 높입니다.
- 스캔된 문서의 경우 OCR 레이어를 거치는 2단계 접근 방식을 사용합니다.
1단계 심층 분석: pdfjs-dist
pdfjs-dist는 Mozilla의 PDF 렌더링 라이브러리로, Firefox의 내장 PDF 뷰어를 구동하는 것과 동일한 엔진입니다. jaklens.ai에서는 (Electron의 메인 프로세스를 통해) Node.js 프로세스 내에서 실행되어 송장의 각 페이지에서 텍스트 콘텐츠를 추출합니다.
Stripe, PayPal, CRM 또는 송장 소프트웨어에 의해 생성된 일반적인 디지털 송장 PDF의 경우, pdfjs는 줄 구조를 보존하는 깨끗한 Unicode 텍스트를 생성합니다. 출력 결과는 다음과 같은 형태입니다:
INVOICE (송장)
Invoice #: INV-2024-0891 (송장 번호)
Date: 15 March 2025 (날짜)
Due Date: 15 April 2025 (지불 기한)
Bill To: (청구 대상)
Acme Corp Ltd
123 Business Street
Item (항목) Qty (수량) Unit Price (단가) Amount (금액)
Design work (디자인 작업) 10 $150.00 $1,500.00
Hosting fee (호스팅 비용) 1 $50.00 $50.00
Subtotal (소계) $1,550.00
Tax (15%) (세금) $232.50
TOTAL (합계) $1,782.50
스캔된 PDF(사진을 찍었거나 인쇄 후 스캔한 송장)의 경우, pdfjs는 페이지를 비트맵(bitmap)으로 렌더링하며, 이는 텍스트가 LLM(대규모 언어 모델)에 도달하기 전에 OCR (광학 문자 인식) 레이어에 의해 처리됩니다. 이러한 2단계 접근 방식(two-pass approach)은 대부분의 실제 송장 형식을 처리할 수 있습니다.
2단계 심층 분석: llama.cpp를 통한 Qwen2.5 1.5B
Qwen2.5는 Alibaba DAMO Academy의 언어 모델 제품군입니다. 1.5B 파라미터 변형 모델은 4-bit GGUF 형식으로 양자화(quantized)될 경우 약 1.2 GB의 RAM에 여유롭게 들어가며, 일반 소비자용 CPU에서도 빠른 응답을 생성합니다.
jaklens.ai는 llama.cpp를 위한 고품질 Node.js 바인딩인 node-llama-cpp를 사용합니다. llama.cpp는 GGUF 모델을 로컬에서 실행하기 위한 업계 표준 C++ 추론 엔진(inference engine)으로, AVX2/AVX512 CPU 가속, NVIDIA CUDA, AMD ROCm 및 Vulkan을 지원합니다.
모델에 전달되는 프롬프트(prompt)는 추출 정확도를 극대화하기 위해 정교하게 구조화되었습니다:
시스템 프롬프트 (System prompt): 모델이 송장 데이터 추출기 (invoice data extractor)로서 동작하고 유효한 JSON만을 반환하도록 지시합니다.
사용자 메시지 (User message): pdfjs에서 추출된 원문 텍스트와 함께, 예상되는 출력 필드에 대한 스키마 (schema)를 전달합니다.
온도 (Temperature): 환각 (hallucination)을 줄이고 일관성을 극대화하기 위해 낮게 (0.1–0.2) 설정합니다.
최대 토큰 (Max tokens): 과도한 출력을 방지하기 위해 제한합니다.
모델은 다음과 유사한 구조화된 JSON을 반환합니다:
{
"vendor": "Design Studio Ltd",
"invoice_number": "INV-2024-0891",
"date": "2025-03-15",
"due_date": "2025-04-15",
"currency": "USD",
"subtotal": 1550.00,
"tax": 232.50,
"total": 1782.50,
"line_items": [
{ "description": "Design work", "qty": 10, "unit": 150.00, "amount": 1500.00 },
{ "description": "Hosting fee", "qty": 1, "unit": 50.00, "amount": 50.00 }
]
}
이 모든 추론 (inference)은 사용자의 하드웨어에서 수행됩니다. 일반적인 응답 시간은 최신 8코어 CPU에서 3~8초 사이이며, GPU 가속 (GPU acceleration)을 사용하면 2초 미만입니다.
왜 송장 처리에 Qwen2.5를 사용하는가?
여러 요인이 Qwen2.5 1.5B를 송장 파싱 (parsing)에 적합하게 만듭니다:
다국어 지원 (Multilingual).
영어와 아랍어 송장 텍스트를 기본적으로 처리합니다 — 중동 시장에서 중요합니다.
작지만 강력함 (Small but capable).
4-bit GGUF 형식의 1.5B 파라미터는 약 1.2 GB이며, 저가형 하드웨어에도 적합합니다.
JSON 지시 이행 (JSON instruction following).
Qwen2.5는 구조화된 출력 (structured output) 작업을 위해 특별히 학습되었습니다.
무료 (Free).
오픈 웨이트 (Open-weight) 모델로, API 비용, 속도 제한 (rate limits), 사용량 추적이 없습니다.
정확도 및 한계
완벽한 OCR 시스템은 없습니다. 현재 파이프라인 (pipeline)의 알려진 한계는 다음과 같습니다:
저품질 스캔:
심하게 기울어지거나, 흐릿하거나, 저해상도(low-DPI)인 스캔본은 텍스트 추출 성능을 저하시켜 파싱 (parsing) 정확도를 떨어뜨립니다.
특이한 레이아웃:
표준적이지 않은 구조(이미지 내의 표, 회전된 텍스트, 워터마크 등)를 가진 송장은 필드를 놓칠 수 있습니다.
통화 모호성:
다중 통화가 포함된 송장은 수동 수정이 필요할 수 있습니다.
환각 (Hallucination) 위험:
모든 LLM과 마찬가지로, Qwen2.5는 때때로 원문에 없는 필드를 만들어낼 수 있습니다. 최종 확정 전에는 항상 중요한 합계 금액을 검증하십시오.
jaklens.ai는 저장하기 전에 모든 추출된 필드를 편집 가능한 검토 화면에 표시함으로써 이 문제를 해결합니다. 사용자가 AI의 추출 내용을 확인, 수정 또는 거부할 수 있어 데이터에 대한 인간의 통제권을 유지합니다.
로컬 추론 (local inference)의 개인정보 보호 이점
송장 텍스트는 귀하의 기기를 절대 벗어나지 않습니다. PDF에서 CPU를 거쳐 SQLite 데이터베이스로 이동하며, 이 모든 과정은 완전히 귀하의 Windows 사용자 세션 내에서 이루어집니다.
클라우드 송장 OCR 서비스(Google Document AI, AWS Textract 및 회계 소프트웨어의 AI 기능 포함)는 문서를 원격 API로 전송합니다. 이는 귀하의 공급업체, 금액, 날짜 및 재무 관계가 타인의 인프라에서 처리됨을 의미합니다. 로컬 llama.cpp 추론을 사용하면 이러한 경로 자체가 존재하지 않습니다.
송장 OCR AI — 자주 묻는 질문 (FAQ)
송장 OCR AI란 무엇인가요?
송장 OCR AI는 광학 문자 인식 (OCR)을 인공지능(일반적으로 대규모 언어 모델, LLM)과 결합하여 송장 문서로부터 공급업체, 금액, 날짜, 품목(line items)과 같은 구조화된 데이터를 자동으로 추출하는 기술입니다. 현대적인 송장 OCR AI는 취약한 정규 표현식 (regex) 템플릿 대신 컴퓨터 비전 (computer vision)과 머신러닝 (machine learning)을 사용합니다.
송장 OCR 머신러닝 (machine learning)은 어떻게 작동하나요?
송장 OCR 머신러닝 (machine learning) 파이프라인 (pipeline)은 세 단계로 구성됩니다. 첫째, pdfjs-dist와 같은 PDF 파서 (parser)가 문서에서 원시 텍스트 (raw text)를 추출합니다. 둘째, Qwen2.5와 같은 언어 모델 (language model)이 해당 텍스트를 읽고 어떤 단어가 "공급업체 (vendor)", "합계 (total)", "송장 번호 (invoice number)" 등을 의미하는지 식별합니다. 셋째, 구조화된 JSON 출력 (output)이 데이터베이스 (database)에 저장됩니다. jaklens.ai는 llama.cpp를 사용하여 이 세 단계를 모두 로컬 (locally)에서 실행합니다.
Node.js로 송장 OCR을 실행할 수 있나요?
네. 텍스트 추출을 위한 pdfjs-dist (Mozilla의 Node용 PDF 파서)와 오픈 소스 LLM을 로컬에서 실행하기 위한 node-llama-cpp와 같은 라이브러리를 사용하여 Node OCR 송장 처리가 가능합니다. 이것이 바로 jaklens.ai가 사용하는 스택 (stack)입니다. 외부 API 호출이 없는 순수 JavaScript/Node 파이프라인 (pipeline)입니다.
컴퓨터 비전 (computer vision) 송장 추출이란 무엇인가요?
컴퓨터 비전 (computer vision) 송장 추출은 디지털 PDF 대신 스캔된 이미지 송장 (JPEG, PNG, 사진)을 읽는 OCR 시스템을 의미합니다. 이러한 파이프라인 (pipeline)은 일반적으로 Tesseract, PaddleOCR 또는 시각-언어 모델 (VLMs)과 같은 모델을 사용하여 픽셀 (pixels)을 텍스트로 변환한 다음, 해당 텍스트를 언어 모델 (language model)에 입력하여 필드 추출 (field extraction)을 수행합니다.
송장 OCR 딥러닝 (deep learning)이 규칙 기반 (rule-based) 시스템보다 더 정확한가요?
네, 상당히 그렇습니다. 규칙 기반 (rule-based) 송장 OCR은 공급업체가 송장 레이아웃 (layout)을 변경하는 순간 깨집니다. Qwen2.5와 같은 송장 OCR 딥러닝 (deep learning) 모델은 문맥 (context)을 이해합니다. 즉, "지불 금액 (Amount Due)", "총계 (Grand Total)", 또는 "지불 가능 총액 (Total Payable)"이라고 표시되어 있더라도 합계를 식별할 수 있습니다. 트레이드오프 (tradeoff)는 가끔 발생하는 환각 (hallucination) 현상이며, 이 때문에 jaklens.ai는 항상 추출된 필드를 편집 가능한 검토 화면에 표시합니다.
2026년 송장 OCR에 가장 적합한 AI 모델은 무엇인가요?
로컬 송장 OCR 처리 AI (AI)를 위해서는 현재 Qwen2.5 1.5B가 크기, 속도 및 정확도 사이에서 가장 좋은 균형을 보여줍니다. 이 모델은 llama.cpp를 통해 소비자용 CPU에서 실행되며, 4-bit GGUF 형식으로 약 1.2 GB의 용량을 차지하고, JSON 출력 (output) 지침을 안정적으로 따르며, 영어와 아랍어를 모두 지원합니다. Qwen2.5 7B 또는 Llama 3.1 8B와 같은 더 큰 모델은 더 정확하지만 더 많은 RAM을 필요로 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기