이메일로 온 세금계산서·영수증, LLM으로 텍스트 추출해 구글 시트에 자동 기록하는 파이프라인 구축기

매월 말이나 분기별 부가가치세 신고 기간이 다가오면 개인사업자의 업무 공간은 종이 영수증과 이메일로 발송된 전자세금계산서 PDF 파일로 마비되곤 합니다. 홈택스에서 자동 수집되는 내역도 있지만, 메일로 직접 받아 처리해야 하는 수입 세금계산서, 종이로 받아 사진을 찍어둔 간이영수증, 플랫폼별 매출 증빙 등은 일일이 열어보고 금액과 일자를 확인해 수기로 정리해야 합니다.

이 반복적이고 소모적인 작업을 자동화할 수는 없을까요? 단순히 이미지에서 글자를 읽어내는 기존 OCR(광학 문자 인식) 기술은 세금계산서의 복잡한 표 구조나 다양한 사설 영수증의 포맷을 제대로 인식하지 못해 결국 사람이 다시 확인해야 하는 한계가 있었습니다.

하지만 멀티모달 LLM(대형 언어 모델)의 등장으로 판도가 바뀌었습니다. 이 글에서는 이메일로 수신된 세금계산서와 영수증 첨부파일을 감지하고, LLM을 통해 필요한 텍스트만 정확하게 추출하여 구글 시트에 자동으로 기록하는 파이프라인 구축 과정을 상세히 공유합니다.


1. 기존 OCR 방식 vs LLM 기반 자동 분류 비교

정형화된 템플릿에 의존하는 기존 OCR 방식과 컨텍스트(맥락)를 이해하는 LLM 기반의 방식은 근본적인 차이가 있습니다. 세금계산서 및 영수증 처리에 있어 두 방식이 어떻게 다른지 비교해 보았습니다.

비교 항목 기존 Rule-based OCR (예: Tesseract, 정규표현식 기반 커스텀 파서) LLM 기반 추출 (예: GPT-5.1, Claude Sonnet 4.5)
포맷 유연성 템플릿의 위치 구조가 조금만 달라져도 인식 오류 발생 확률이 매우 높음. 영수증의 형태, 표의 레이아웃, 줄바꿈에 관계없이 유연하게 맥락 파악.
노이즈 및 필기체 구겨진 종이 영수증, 저화질 사진, 그림자가 진 이미지에서 텍스트 인식률 급감. 문맥을 고려하여 오타를 교정하거나 흐릿한 글자도 앞뒤 맥락으로 유추해 인식.
데이터 구조화 단순 텍스트 나열에 그쳐, ’공급가액’과 ’세액’을 분리하기 위해 정규표현식(Regex)을 복잡하게 짜야 함. “공급가액과 세액을 구분하여 JSON 형태로 출력해줘”라는 자연어 명령어(프롬프트) 하나로 해결.
도입 및 유지보수 비용 초기 템플릿 좌표 설정 작업 필요, 양식이 바뀔 때마다 개발자 리소스 소모. API 연동과 프롬프트 수정만으로 유연한 대처 가능. 호출당 소모 비용 발생.

참고: 네이버 CLOVA OCR처럼 딥러닝 기반의 상용 OCR 서비스도 있습니다. 이런 서비스는 순수 Rule-based 방식보다 인식률이 높지만, 문서 종류별로 사전 학습된 모델을 선택해야 하는 등 LLM 기반 추출만큼 자유로운 자연어 지시로 동작하지는 않는다는 차이가 있습니다.


2. 세금계산서 자동 분류 파이프라인 아키텍처

우리가 구축할 자동화 파이프라인의 전체적인 데이터 흐름은 다음과 같습니다. 복잡한 코딩 없이 노코드 툴인 **Make(구 Integromat)**나 Google Apps Script를 활용해 구현할 수 있습니다.

[이메일 수신 (Gmail)] 
       ↓ (필터링: '세금계산서', '영수증' 키워드 및 첨부파일 존재 여부)
[첨부파일 다운로드 (PDF/Image)] 
       ↓ 
[LLM 비전 API 호출 (GPT-5.1 / Claude Sonnet 4.5)] 
       ↓ (프롬프트 전달 및 JSON 형태로 데이터 추출)
[구글 시트 (Google Sheets) 연동] 
       ↓ (일자, 공급자, 공급가액, 세액, 합계, 분류 항목 자동 기입)
[슬랙 / 카카오톡 알림 (선택)] 

단계별 흐름 제어의 핵심 포인트

  1. 트리거(Trigger): 특정 메일함(예: ‘세금계산서’ 라벨)에 새 메일이 들어오거나, 메일 제목에 ‘세금계산서’, ‘영수증’, ’Invoice’가 포함되어 있고 PDF나 이미지 파일이 첨부되어 있을 때만 파이프라인이 작동하도록 필터링을 꼼꼼하게 설정합니다.
  2. 컨버터(Converter): 세금계산서는 보통 PDF 형식으로 많이 옵니다. 일부 LLM API는 PDF 직접 입력을 지원하지만, 비용 절감과 호환성을 위해 PDF의 첫 페이지를 이미지(PNG/JPEG)로 변환하여 LLM 비전 엔진에 전달하는 것이 안정적입니다.
  3. 구조화된 출력(Structured Outputs): LLM이 구글 시트에 바로 기록할 수 있도록 줄글이 아닌 JSON 포맷으로 답변을 반환하도록 강제해야 합니다.

3. LLM의 핵심: 구조화 추출을 위한 프롬프트 엔지니어링

LLM이 영수증 이미지를 보고 정확한 키-값(Key-Value) 형태로 데이터를 뽑아내도록 만들기 위해서는 시스템 프롬프트(System Prompt) 작성이 가장 중요합니다. 아래는 실제 프로덕션 환경에서 유용하게 사용할 수 있는 프롬프트 템플릿 예시입니다.

[System Prompt]
너는 개인사업자의 비용 처리를 돕는 전문 회계 비서야. 
주어지는 세금계산서 또는 영수증 이미지에서 아래의 정보를 정확히 추출해줘.

출력은 반드시 다른 설명 없이 오직 순수한 JSON 오브젝트 형태로만 반환해야 해. Markdown 코드 블록(```json ... ```)도 포함하지 마.

{
  "date": "YYYY-MM-DD 형식의 작성일자 또는 발급일자",
  "supplier_name": "공급자 상호명 또는 가맹점명",
  "supplier_number": "공급자 사업자등록번호 (하이픈 제거)",
  "supply_value": "공급가액 (숫자만)",
  "tax_value": "부가가치세 세액 (면세인 경우 0, 숫자만)",
  "total_amount": "합계금액 (숫자만)",
  "category": "아래 분류 기준 중 가장 적절한 카테고리 하나 선택 (매입세금계산서, 카드영수증, 현금영수증, 간이영수증, 기타)"
}

[주의사항]
1. 금액 필드에는 쉼표(,)나 원(원) 표시를 제외하고 오직 순수 숫자(Integer)만 기입해줘.
2. 판독이 불가능한 항목은 공백("")으로 처리해줘.

이렇게 response_format을 JSON으로 지정하고 상세한 가이드를 주면, 일관된 포맷의 데이터를 얻을 수 있어 구글 시트 연동 시 파싱 에러를 획기적으로 줄일 수 있습니다.


4. 실측 데이터로 보는 자동화 효율 분석

이 파이프라인을 실제 비즈니스 운영 환경에 도입했을 때, 과연 수작업 대비 얼마나 이득일까요? 실제 수집된 운영 데이터를 기반으로 비용 효율성과 정확도를 정리해 보았습니다.


5. 안정적인 운영을 위한 주의사항과 예외 처리 전략

아무리 뛰어난 LLM이라도 100% 완벽할 수는 없습니다. 실제 비즈니스에 자동 분류 파이프라인을 올릴 때 반드시 고려해야 할 세 가지 예외 처리 방안을 소개합니다.

1) Human-in-the-Loop (인간의 최종 검토 단계) 도입

LLM이 입력한 데이터를 맹신하여 국세청 신고 자료로 바로 사용하는 것은 위험합니다. 이를 보완하기 위해 구글 시트에 ‘검증 여부(Status)’ 열을 추가하는 것을 권장합니다.

2) 데이터 보안 및 프라이버시 설정

세금계산서에는 사업자등록번호, 주소, 대표자 성명, 이메일, 거래 단가 등 민감한 비즈니스 정보가 가득합니다.

3) 비밀번호가 걸린 PDF 처리

간혹 대기업이나 공공기관에서 발송하는 세금계산서 중 사업자등록번호 뒤 5자리 등으로 암호화된 PDF 파일이 있습니다. 이 경우 일반적인 파이프라인에서는 파일 열기 실패 오류가 발생합니다.


개인사업자에게 시간은 곧 자산이자 경쟁력입니다. 매월 반복되는 영수증 분류와 타이핑 작업에 소중한 시간을 빼앗기고 있었다면, 이메일과 LLM, 그리고 구글 시트를 엮은 자동화 파이프라인은 훌륭한 해답이 될 수 있습니다. 초기에 파이프라인을 구축하는 데 약간의 시행착오가 따르겠지만, 한 번 세팅해 두면 매달 몇 시간씩 집중해야 했던 단순 반복 업무에서 완전히 해방되는 경험을 하시게 될 것입니다. 지금 아주 간단한 이메일 전달 트리거부터 하나씩 테스트해 보며 비즈니스의 자동화 수준을 한 단계 끌어올려 보시기 바랍니다.