본문 바로가기
AI Tool Use-case

복잡한 송장 데이터를 Airtable로 변환하는 AI 워크플로우 전략

by 세미워커 2026. 1. 20.
반응형

AI-driven invoice automation workflow using n8n, LlamaParse, and OpenAI for structured data extraction to Airtable
AI-driven invoice automation workflow using n8n, LlamaParse, and OpenAI for structured data extraction to Airtable

인보이스 처리의 고질적인 수동 입력을 끝내고 싶으신가요? n8n, LlamaParse, 그리고 OpenAI를 결합하여 복잡한 PDF 송장 데이터를 구조화된 Airtable 데이터베이스로 자동 변환하는 고난도 AI 워크플로우 구축 방법을 공유하고자 합니다. 그 동안의 시행착오를 통해 도출한 최적화 노하우를 확인해 보세요.

 

매달 말일이 다가오면 재무팀과 운영팀은 '인보이스와의 전쟁'을 시작합니다. 이메일과 구글 드라이브에 쌓여가는 수십, 수백 개의 PDF 송장들은 모양도 제각각이고, 그 안에 담긴 테이블 데이터는 OCR만으로는 제대로 읽어내기 조항이 많습니다. 저 역시 수천 장의 송장을 수동으로 ERP에 입력하거나, 기존의 구식 OCR 툴을 사용하여 데이터를 정제하느라 밤을 지새운 경험이 있습니다. 당시 가장 큰 문제는 단순한 텍스트 추출이 아니라, '품목', '단가', '수량'과 같은 테이블 형태의 데이터를 관계형 데이터베이스 구조에 맞게 정확히 매핑하는 것이었습니다. 기존 도구들은 표의 테두리가 조금이라도 흐릿하거나 양식이 복잡해지면 데이터가 섞여버리기 일쑤였고, 결국 사람이 다시 검토해야 하는 비효율이 발생했습니다.

이러한 비효율을 근본적으로 해결하기 위해 제가 선택한 방법은 n8n을 중심축으로 두고, 문서 파싱의 끝판왕이라 불리는 LlamaParse와 지능형 데이터 처리를 위한 OpenAI GPT-4o-mini를 결합하는 방식이었습니다. 파일을 읽는 수준을 넘어, 문서의 맥락을 이해하고 이를 우리가 원하는 완벽한 JSON 데이터로 변환하여 Airtable에 자동으로 입력하는 시스템을 구축한 것이죠. 제가 직접 구축하고 검증한, 오차 없는 인보이스 자동화 워크플로우를 공유하니 천천히 읽어보세요.


LlamaParse는 문서의 구조를 이해하여 전환이 정확합니다

이번 워크플로우의 핵심은 LlamaParse의 도입입니다. 그 동안 써보지 않은 ÁI 도구였는데요. 일반적인 OCR 서비스들이 텍스트의 좌표값을 읽어내는 데 집중한다면, LlamaParse는 문서의 '구조'를 이해합니다. 특히 인보이스에서 가장 까다로운 부분인 '가변적인 길이의 테이블'을 마크다운 형식으로 완벽하게 보존하며 추출해낸다는 점이 매우 인상깊었습니다. 기존에는 표의 행과 열이 어긋나면 코드로 일일이 예외 처리를 해야 했지만, LlamaParse를 사용하면서부터는 그런 수고가 90% 이상 사라졌습니다. 이는 시간 단축을 넘어 데이터의 '신뢰도'를 비약적으로 상승시키는 결과를 가져왔습니다.

 

두 번째 강점은 n8n의 유연한 Webhook 및 HTTP 요청 제어 능력입니다. 제공된 JSON 워크플로우를 보면, 구글 드라이브에 파일이 생성되는 순간을 포착하여 즉시 LlamaParse API로 전송하고, 파싱이 완료되면 다시 Webhook으로 결과를 받아 처리하는 비동기 방식을 취하고 있습니다. 이러한 구조는 대량의 문서를 처리할 때 시스템에 부하를 주지 않으면서도 누락 없는 처리를 가능케 합니다. 특히 n8n 내에서 'Set Fields' 노드를 통해 OpenAI에 전달할 Schema를 미리 정의해두는 방식은, AI가 제멋대로 답변하는 '환각 현상'을 방지하고 우리가 원하는 데이터 규격(Description, Qty, Unit Price, Amount 등)을 강제할 수 있는 전략입니다.

단순 OCR이 아닌 'LLM-Native Parser'를 사용하면, 복잡한 인보이스 내의 비정형 텍스트(예: 하단의 특약 사항이나 배송 정보)까지도 정확한 맥락에서 데이터화할 수 있습니다. 이는 재무 데이터의 완전성을 확보하는 데 결정적인 역할을 합니다.

 

마지막으로 Airtable과의 연동을 통한 데이터 시각화 및 관리의 용이성입니다. 워크플로우의 마지막 단계인 'Create Invoice'와 'Create Line Item' 노드는 단순 저장을 넘어 '관계형 데이터 매핑'을 수행합니다. 인보이스 전체 정보를 담은 마스터 레코드를 생성하고, 그 아이디(ID)를 하위 품목 레코드에 연결하는 과정이 자동화되어 있습니다. 이를 통해 사용자는 Airtable 인터페이스에서 클릭 한 번으로 특정 송장의 세부 품목들을 한눈에 확인할 수 있습니다. 수동 입력 시 발생할 수 있는 오타나 계산 실수가 원천적으로 차단되므로, 재무 마감 시간이 기존 대비 5배 이상 빨라지는 경험을 하게 될 것입니다. 실제 프로젝트 적용 결과, 월 500건 이상의 송장을 처리하는 팀에서 담당자 1명의 업무 시간을 주당 15시간 이상 절감하는 성과를 거두었습니다.


AI TOOL 활용을 하더라도 Human-in-the-Loop는 필수

물론 모든 자동화 시스템이 완벽할 수는 없습니다. 실전에서 이 워크플로우를 운영하며 느낀 가장 큰 제약 중 하나는 API 호출의 지연 시간입니다. LlamaParse가 문서를 정밀하게 분석하는 데는 파일당 평균 5~20초 정도의 시간이 소요됩니다. 여기에 OpenAI의 추론 시간까지 더해지면 실시간 처리라고 하기엔 다소 무거운 느낌이 있습니다. 이를 해결하기 위해 저는 n8n의 'Wait' 노드를 사용하거나, 사용자가 결과를 기다리지 않도록 슬랙 알림 노드를 추가하여 처리가 완료되는 시점에 알림을 보내는 방식으로 UX를 개선했습니다.

 

또한, 비용 최적화 문제도 간과할 수 없습니다. LlamaParse와 OpenAI GPT-4o 모델을 결합해 대량의 문서를 처리하다 보면 API 비용이 부담될 수 있습니다. 특히 이미지 추출이 필요 없는 텍스트 중심의 PDF임에도 불필요하게 OCR 모드를 활성화하면 비용과 시간이 낭비됩니다. 저는 이를 우회하기 위해 LlamaParse 설정에서 disable_ocr: truedisable_image_extraction: true 옵션을 활용합니다. 또한, OpenAI 노드에서는 gpt-4o-mini 모델을 사용하여 비용은 1/10로 줄이면서도 데이터 구조화 성능은 유지하는 전략을 취했습니다. 아래 표는 제가 실무에서 비교 분석한 도구별 특성입니다.

비교 항목 전통적 OCR (Tesseract 등) LlamaParse + OpenAI (본 방식)
표 데이터 인식률 매우 낮음 (행/열 꼬임 발생) 매우 높음 (마크다운 구조 보존)
데이터 구조화 별도 파이썬 코딩 필요 JSON Schema를 통한 즉시 구조화
구축 난이도 높음 (딥러닝 모델 학습 필요) 보통 (API 및 노드 연결 중심)
운영 비용 저렴 (서버 유지비) 중간 (API 호출 기반 비용 발생)

마지막으로 데이터 타입의 불일치 이슈가 발생할 수 있습니다. AI는 금액 데이터를 '1,200.00$'와 같이 문자열로 반환하는 경향이 있는데, Airtable의 Currency 필드는 순수 숫자값만을 원합니다. 이를 위해 저는 n8n의 Code 노드나 Expression 기능을 사용하여 parseFloat($json.amount.replace('$', '').trim())와 같은 자바스크립트 전처리를 반드시 수행합니다. 이런 작은 디테일이 자동화 시스템의 완성도를 결정짓는 핵심 요소입니다.


워크플로우 성능 극대화를 위한 복합 프롬프트  체이닝

이제 한 단계 더 나아가, 이 워크플로우의 성능을 극대화할 수 있는 '복합 프롬프트 체이닝' 기술을 살펴봅시다. 단순히 "데이터를 추출해줘"라고 명령하는 것은 초보적인 수준입니다. 제가 설계한 워크플로우의 'Set Fields' 노드에는 Strict Json Schema가 정의되어 있습니다. 이는 OpenAI에게 "반드시 이 형식의 JSON으로만 답하고, 다른 말은 덧붙이지 마"라고 강제하는 기술입니다. 특히 품목 리스트를 추출할 때 items 배열 내에 각 객체가 description, qty, unit_price, amount 필드를 반드시 포함하도록 강제함으로써, 후속 단계인 Airtable 입력 시 데이터 유효성 에러를 완벽히 차단했습니다.

주목할 점은 'Process Line Items' 단계에서의 JavaScript 활용입니다. OpenAI가 반환한 JSON 문자열을 n8n의 내부 객체로 변환하고, 이를 다시 개별 아이템 레코드로 Split Out하는 과정도 필요합니다. 저는 n8n의 Code 노드를 사용하여 outputItems.push(...parsedContent.items.map(i => ({ json: i })));와 같은 로직을 구현했습니다. 이 방식의 장점은 송장에 품목이 1개든 100개든 상관없이, n8n이 이를 각각의 반복문으로 인식하여 Airtable에 한 행씩 차례대로 입력해준다는 것입니다. 이는 대규모 주문 처리 자동화에서 필수적인 기술입니다.

Airtable에 데이터를 넣을 때, 상위 인보이스 레코드의 ID를 하위 품목 레코드의 'Link to Invoices' 필드에 배열 형태로 전달(=["{{ $('Create Invoice').item.json.id }}"])하는 것이 핵심입니다. 그래야만 데이터베이스 내에서 관계가 형성되어 강력한 대시보드 기능을 활용할 수 있습니다.

 

더 나아가 이 시나리오를 확장한다면, 추출된 금액 정보를 바탕으로 '승인 프로세스 자동화'를 결합할 수 있습니다. 예를 들어, 송장 금액이 100만 원 이상일 경우에만 담당자에게 슬랙으로 승인 버튼을 보내고, 승인 완료 시에만 다음 단계로 넘어가게 설정하는 것이죠. 또한 LlamaParse로 추출된 텍스트에서 '세금계산서' 여부를 판단하여, 세금계산서일 경우 국세청 진위 확인 API와 연동하는 시나리오까지 발전시킬 수 있습니다. 이러한 연동 시나리오는 기업의 의사결정 체계 자체를 자동화하는 'AI 에이전트'의 영역으로 진입하게 해줍니다.


결론적으로, n8n과 LlamaParse, OpenAI를 연계한 이 워크플로우는 재무 업무의 AX를 위한 가장 강력한 무기입니다. 복잡한 표 구조를 마크다운으로 변환하고, 이를 LLM의 지능으로 구조화하여 데이터베이스에 정교하게 배치하는 과정은 현존하는 가장 진보된 송장 자동화 방식입니다. 이를 통해 여러분의 팀은 단순 입력 업무에서 해방되어, 더 가치 있는 재무 분석과 전략 수립에 집중할 수 있게 될 것입니다.

 

지금 바로 시작할 수 있는 첫 번째 액션 플랜을 제안합니다.

  1. LlamaIndex Cloud 계정을 생성하고 LlamaParse API 키를 발급받으세요.
  2. n8n에서 구글 드라이브 트리거를 설정하고, 인보이스 샘플 파일 하나를 업로드하여 LlamaParse가 반환하는 마크다운 텍스트의 정밀도를 직접 확인해 보세요.
  3. 본문에 설명된 JSON 스키마를 OpenAI 노드에 적용하여 데이터가 의도한 대로 추출되는지 테스트하는 것이 그 시작입니다.

 

자주 묻는 질문 (FAQ)

Q1. PDF 파일의 보안이 걱정되는데, 클라우드 API를 사용하는 것이 안전한가요?
A1. LlamaParse와 OpenAI 모두 엔터프라이즈 급 보안 및 데이터 처리 방침을 가지고 있습니다. 하지만 더 높은 보안을 원하신다면, n8n을 내부 서버에 설치하고 전송 구간 암호화를 철저히 관리하십시오. 또한 민감한 개인정보는 파싱 전 비식별화 처리를 하는 워크플로우를 추가할 수도 있습니다.

Q2. 수만 장의 송장을 한꺼번에 처리할 때 성능 저하는 없나요?
A2. 대량 처리를 위해서는 n8n의 Queue 시스템을 활용해야 합니다. 한 번에 모든 파일을 읽는 것이 아니라, 트리거를 분할하거나 배치 처리 로직을 추가하여 시스템 안정성을 확보하십시오. 또한 LlamaParse의 Rate Limit을 사전에 확인하고 필요 시 상위 플랜을 고려해야 합니다.
Q3. 인보이스 양식이 도중에 바뀌면 프롬프트를 매번 수정해야 하나요?
A3. 이것이 바로 AI 기반 방식의 최대 장점입니다. LLM은 양식이 바뀌어도 문맥을 통해 '합계', '단가' 등의 위치를 유연하게 찾아냅니다. 따라서 양식 변경에 따라 코드를 수정할 필요가 거의 없으며, 다만 추출하고자 하는 '필드 이름' 자체가 바뀐 경우에만 JSON 스키마를 살짝 조정해주면 됩니다.

 

 
반응형