Phase 4 · 데이터 자동화 완성

장부를 넘어 PDF 계약서와 증빙 서류 검증하기

회계감사와 기장 업무의 꽃은 "전표(엑셀) 데이터가 실제 세금계산서, 계약서와 일치하는가?"를 확인하는 것입니다.
파이썬으로 PDF 텍스트를 추출하고, AI를 이용해 금액과 날짜를 가져온 뒤, 장부와 Cross-Check하는 궁극의 시스템을 알아봅니다.

예상 학습 시간 : 180분
난이도 : ★★★★★
사전 단계 : 자동 파일 정제 시스템 (Step 18)
다음 단계 : 다중 데이터 소스 융합 분석 (예정)
01

왜 PDF 분석이 필요한가? (RAG 개요)

18단계까지는 엑셀, ERP DB 등 표 형태로 정리된 정형 데이터(Structured Data)만 다루었습니다. 하지만 현실의 회계자료 절반 이상은 비정형 데이터(계약서 PDF, 영수증 스캔본)입니다.

이런 방대한 서류를 AI가 읽고 이해하게 만드는 기술이 바로 RAG(검색 증강 생성) 시스템입니다.

PDF 계약서
텍스트 추출 (PyMuPDF / OCR)
데이터 쪼개기 (Chunking)
자연어 질문
벡터 DB 검색 매칭
AI 요약 및 파이썬 크로스체크
02

PyMuPDF로 PDF 파일 텍스트 추출하기

파이썬에서 PDF를 읽는 가장 빠르고 강력한 라이브러리는 PyMuPDF (fitz) 입니다. 터미널에서 pip install pymupdf 로 설치합니다.

📝 pdf_reader.py
import fitz  # PyMuPDF 모듈 이름

def extract_pdf_text(filename):
    doc = fitz.open(filename)
    text = ""
    
    for page in doc:
        text += page.get_text() + "\n"
        
    return text

# 실행
contract_text = extract_pdf_text("ABC상사_계약서.pdf")
print(contract_text)
주의: 이미지로 된 PDF

스캐너로 스캔해서 올린 PDF는 글자 영역이 없고 단순 이미지로 인식되어 위 코드를 돌려도 빈 칸만 나옵니다. 이 경우에는 Tesseract 등의 OCR(광학 문자 인식) 모듈을 추가로 거쳐야 합니다.

03

문서 쪼개기 (Chunking)

100페이지짜리 계약서 전문을 그대로 AI(LLM)에게 던지면 AI가 뻗거나 핵심 내용을 놓칩니다(할루시네이션). 질문과 관련된 단락만 찾아내기 위해 먼저 텍스트를 적당한 크기로 쪼갭니다.

# 가장 기초적인 글자 수 기반 청킹 (1000자씩 자르기)
def split_text(text, chunk_size=1000):
    chunks = []
    for i in range(0, len(text), chunk_size):
        chunks.append( text[i : i + chunk_size] )
    return chunks

이후에는 임베딩(Embedding) 모델을 거쳐 이 조각들을 벡터 DB(Chroma 등)에 저장하고, 사용자가 "계약금액은?" 하고 물어보면 그 문장과 벡터값이 가장 유사한 청크 조각만 검색해서 빼옵니다.

04

AI에게 핵심 정보 JSON으로 추출 시키기

검색된 계약서나 세금계산서 단락을 AI에게 넘겨주면서 반드시 JSON(딕셔너리) 형태로 답하라고 명령합니다. 그래야 파이썬이 금액을 숫자로 가져와 장부와 비교할 수 있습니다.

prompt = f"""
다음 계약서 내용에서 필수 정보를 추출하세요.
무조건 아래 JSON 양식으로만 답변하세요. 부연설명은 금지합니다.

계약서 내용: {found_chunk_text}

[출력 JSON 형식]
{{
  "거래처명": "문자열",
  "계약금액": 숫자(int),
  "시작일자": "YYYY-MM-DD"
}}
"""

# AI가 리턴한 텍스트를 파이썬 딕셔너리로 변환 (json.loads 활용)
05

문서(증빙) vs 엑셀(장부) 크로스체크 설계 원칙

19단계에서 가장 강조하는 업무 아키텍처 원칙입니다. 두 금액이 같은지 계산하는 일을 절대 AI에게 맡기지 마세요!

회계 AI의 올바른 역할 분담

AI의 역할 : PDF에서 "계약금액"이라는 글자를 찾고 100000000 이라는 숫자로 추출하기.
파이썬의 역할 : if contract_amount == excel_amount: 수식을 통해 정확히 계산하고 3% 오차가 있는지 비율(Rate) 연산하기.
회계사의 역할 : 파이썬이 계산해준 3% 오차 경고를 보고 최종적으로 수용할지 거부할지 판단하기.

06

최종 실무: 증빙 자동 검증 시스템 구축

장부 데이터와 방금 AI가 PDF에서 추출한 JSON 데이터를 파이썬 코드로 비교하는 종합 검증 로직입니다.

Cross-Check Verification
장부 엑셀 vs PDF 증빙 비교 알고리즘
def verify_transaction(excel_data, pdf_json):
    result_report = {}
    
    # 1. 거래처 비교
    if excel_data['거래처'] == pdf_json['거래처명']:
        result_report['거래처매칭'] = "✅ 일치"
    else:
        result_report['거래처매칭'] = "❌ 불일치"
        
    # 2. 금액 비교 및 차이율(Rate) 계산
    excel_amt = float(excel_data['금액'])
    pdf_amt = float(pdf_json['계약금액'])
    
    diff = abs(excel_amt - pdf_amt)
    diff_rate = (diff / pdf_amt) * 100
    
    if diff == 0:
        result_report['금액매칭'] = "✅ 완벽 일치"
    elif diff_rate < 1.0:
        result_report['금액매칭'] = f"⚠️ 미세 오차 ({diff_rate:.1f}%)"
    else:
        result_report['금액매칭'] = f"🚨 중대 불일치 (차액 {diff:,.0f}원)"
        
    return result_report
ABC상사 거래 증빙 검토 리포트
장부 엑셀 금액 100,000,000 원
세금계산서 PDF 금액 103,500,000 원
계약기간 검증 ✅ 정상 (기간 내)
종합 판정 🚨 중대 불일치 (차액 3,500,000원, 차이율 3.5%)
20단계 예고: 다중 데이터 소스 융합 분석

이번 장에서는 장부 1개와 PDF 1개를 대조했습니다. 하지만 실무에서는 "특정 거래처의 1년치 장부" vs "그와 관련된 계약서 3개, 세금계산서 52개, 통장내역 61개"를 통째로 묶어서 검사해야 합니다.

대망의 20단계에서는 이 모든 서류를 '거래처'와 '사건(Project)' 단위로 그룹핑하고, 거미줄처럼 엮인 자료망 안에서 입금 누락이나 허위 세금계산서를 잡아내는 궁극의 감찰 플랫폼 아키텍처를 다룹니다.