검증을 통한 송장 필드 추출: 무엇은 자동 기록하고 무엇은 사람에게 전달할 것인가?
요약
본 글은 OCR 텍스트에서 송장 필드(송장 번호, 총액 등)를 추출하는 방법을 다룹니다. 단순 신뢰도 점수 대신 패턴 기반 후보군 생성과 로지스틱 회귀 모델을 사용해 문맥적 정확도를 높입니다. 특히 IBAN 같은 민감한 데이터는 ISO 체크섬 검증을 통해 자동화와 수동 검토의 경계를 설정합니다.
핵심 포인트
- IBAN 등은 신뢰도보다 ISO 13616 체크섬과 같은 강력한 유효성 검증이 필수적입니다.
- 총액처럼 복잡한 필드는 단순 숫자 크기보다 주변 단어와 위치를 고려하는 문맥 분석이 중요합니다.
- 시스템 설계 시, 모든 필드를 자동화하기보다 사람의 개입(Human-in-the-loop)이 필요한 영역을 구분해야 합니다.
텍스트에서 송장 번호나 총액을 뽑아내는 것은 작업의 쉬운 부분입니다. 유용한 부분은 모든 문서의 모든 필드를 가지고, 그것이 회계 시스템에 바로 들어갈지 아니면 담당자의 책상 위에 놓일지를 결정하는 것입니다. 여기서는 작은 데모가 이를 처리하는 방법을 보여줍니다. 아래 내용은 클라이언트 결과가 아닌 공개 합성 데이터셋에서 가져온 테스트 데이터입니다.
데모의 기능
입력: 송장의 OCR 텍스트. 출력: 신뢰도(confidence)와 함께 송장 번호, 날짜, IBAN, 총액을 각각 제공합니다. 신뢰도가 낮은 필드는 기록되는 대신 사람에게 전달됩니다.
데이터는 mychen76/invoices-and-receipts_ocr_v1입니다: OCR 텍스트와 정답(ground-truth) 필드. 이 송장들은 고정된 레이아웃을 가진 합성 데이터이며, 송장 유형 문서만 사용되었습니다 (약 2,200개 중 484개; 나머지는 스키마가 다른 영수증입니다).
후보군 생성 후 순위 지정(Candidates first, then a ranker)
코드의 각 필드는 패턴을 사용하여 후보군(candidates)을 생성한 다음, 작은 로지스틱 회귀(logistic regression) 모델이 주변 단어, 위치, 형식 등 문맥을 이용하여 올바른 것을 선택합니다. 이는 총액에 가장 중요합니다. 왜냐하면 송장에는 많은 금액(순액, 세금, 품목별 항목, 총액)이 포함되어 있고, '가장 큰 숫자'가 정답이 아니기 때문입니다.
IBAN의 경우 신뢰도보다 검증이 중요하다 (Validation beats confidence for IBANs)
IBAN의 경우 데모는 점수(score)를 전혀 신뢰하지 않습니다. ISO 13616 체크섬을 검증합니다. 만약 OCR이 한 글자만 혼동했고(S를 5로, O를 0으로, 또는 문자가 누락되거나 두 번 반복된 경우), 정확히 하나의 수정만으로 체크섬이 통과한다면, 그 수정을 적용합니다. 고유한 유효 값이 존재하지 않으면 해당 필드는 사람에게 전달됩니다.
def iban_ok(s: str) -> bool:
s = s.replace(" ", "").upper()
rearranged = s[4:] + s[:4]
...
체크섬은 모델이 말로 우회할 수 없는 강력한 관문입니다.

74개의 비사용 문서(테스트 데이터)에 대한 결과
| 필드 | 점수화된 문서 수 | 자동화 시 정확도 | 자동 공유 비율 |
|---|---|---|---|
| Invoice number | 74 | 100% | 97.3% |
| ... |
깨끗한(정상적인) 문서의 96.4%는 완전히 자동화되었으며 (네 필드 모두), 그중 98.2%는 모든 필드가 정확했습니다. 임계값은 98% 목표를 위해 검증 분할(validation split)에서 조정되었으며, 제외된 세트(held-out set)는 보고용으로만 사용되었습니다.
솔직한 주의사항 (Honest caveats)
- 고정된 합성 레이아웃을 가진 74개의 문서는 작고 친근한 테스트입니다. 실제의 다양한 인보이스는 점수가 낮게 나올 것이며, 파일럿은 고객 자체 샘플에 대한 측정부터 시작해야 합니다.
- 74개 문서 중 18개에서 데이터셋의 IBAN 레이블 자체가 OCR 텍스트가 통과하는 체크섬(checksum)을 만족하지 못하여 레이블이 손상되었습니다. 이들은 IBAN 점수 계산에서 제외되며
results.json에 별도로 카운트됩니다. 모델을 비난하기 전에 여러분의 정답 데이터(ground truth)를 확인하세요. - 입력은 OCR 텍스트입니다. 스캔본이나 PDF를 해당 텍스트로 변환하는 것은 별도의, 대체 가능한 단계입니다.
핵심 시사점 (Takeaways)
- 필드별로 무엇이 자동 기록(auto-post)될 수 있는지 결정하고, 그 기준을 숫자로 만드세요.
- 가능한 모든 곳에서 결정론적 검증(deterministic validation: 체크섬, 날짜 범위, 합계 검사 등)을 사용하세요.
- 검증할 수 없는 것은 사람에게 라우팅하고, 이 과정의 비용을 낮추세요.
- 측정하기 전에 레이블을 감사하세요 (Audit your labels).
코드 및 숫자: ai-invoice-extraction-demo. 포트폴리오 및 연락처: @Kotenev01_bot.
저는 비즈니스를 위한 실질적이고 측정 가능한 AI 도입에 대해 글을 씁니다: 테스트 데이터 기반의 데모, 꾸며낸 사례 연구는 없습니다. 텔레그램 채널: @kotenev01_en
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기