13.4.5 텍스트-수치 변환 검증: "Three Hundred"와 "300"의 의미적 일치 확인

13.4.5 텍스트-수치 변환 검증: “Three Hundred“와 “300“의 의미적 일치 확인

금융권의 수표(Check), 공식 납품 계약서, 그리고 고액의 B2B 영수증과 같은 민감한 재무 문서들에는 물리적 보안상의 이유로 금액을 아라비아 숫자(예: $300.00)와 자연어 텍스트 문장(예: Three Hundred Dollars And Zero Cents) 두 가지 방식으로 나란히 병기하는 관행이 수백 년 전부터 존재해 왔다. 이는 인간이 임의의 숫자 위조와 서류 조작을 시각적으로 방지하기 위해 만들어낸 원시적이지만 가장 확실한 ’다중 양식 안전장치(Redundancy)’다.

비정형 문서의 AI 데이터 추출 아키텍처에서도, 이 이중 표기 관행은 매우 훌륭한 ‘제로 트러스트 크로스 체크(Zero Trust Cross-check) 오라클’ 수단으로 재탄생하여 활용된다.
프롬프트 단계에서 LLM 에이전트에게 숫자 필드(amount_numeric)와 텍스트 필드(amount_text_written) 두 개를 모두 분리하여 능동적으로 추출하도록 지시한 뒤, 2단계 오라클 파이프라인에서 이 둘을 대수학적으로 비교 충돌시켜 문서 내의 완벽한 의미적 동치성(Semantic Equivalence)을 수학적으로 증명해 내는 것이다.

1. 자연어-수학 변환(Text-to-Number) 결정론적 파서의 도입

이때 가장 중요한 아키텍처 원칙은, 두 값이 같은지 다른지에 대한 ’의미론적 비교 심판’을 LLM 모델 스스로에게 프롬프트로 묻고 맡겨 두어서는 절대로 안 된다는 것이다.
LLM은 “두 숫자가 같은 값인가?” 라는 질문에 대답하는 그 짧은 추론의 순간에도 자기기만(Self-deception) 환각에 빠져 무조건 “Yes“라고 거짓말을 할 수 있는 언어 확률 엔진이기 때문이다.

대신, 이 심판의 권한은 신뢰할 수 있는 인간의 코드로 작성된 2단계 오라클 시스템이 가져와야 한다. 파이썬의 word2number 같은 확정적인(Deterministic) 자연어-수학 변환 파싱 라이브러리를 사용하여 문자열(String)을 직접 실수형 Float로 컴파일 변환한 뒤, 이를 비교 연산자(==)로 들이대어 심판해야 한다.

from pydantic import BaseModel, model_validator
from word2number import w2n

class DualAmountCrossOracle(BaseModel):
    # LLM이 이미지에서 아라비아 숫자 영역을 보고 추출한 텐서
    amount_numeric: float       # 예: 300.0 
    
    # LLM이 이미지의 자연어 서술 영역을 읽고 추출한 문자열 텐서
    amount_text_written: str    # 예: "Three Hundred" 
    
    @model_validator(mode='after')
    def verify_linguistic_and_numeric_equivalence(self):
        """ 숫자 금액과 텍스트 금액 간의 절대적인 의미론적 동치성을 증명한다. """
        try:
            # 1. 자연어 파서 알고리즘을 통해 인간의 글자("Three Hundred")를 기계의 300 객체로 파싱
            parsed_number_from_text = float(w2n.word_to_num(self.amount_text_written))
            
            # 2. IEEE 부동소수점 오차를 감안한 아주 타이트한 여백을 둔 논리적 동일성 비교
            if abs(self.amount_numeric - parsed_number_from_text) > 0.01:
                # 모순 발생 시 문서가 위조되었거나 LLM의 어텐션이 완전히 붕괴한 것으로 간주
                raise ValueError(
                    f"[다중 양식 모순 요격] 문서 내에 적힌 아라비아 숫자 금액({self.amount_numeric})과 "
                    f"자연어 텍스트로 병기된 금액({parsed_number_from_text})이 서로 논리적으로 대립합니다. "
                    f"문서의 악의적 위조 가능성 또는 심각한 LLM 비전 인식 환각이 검출되었습니다."
                )
        except ValueError as parsing_error:
            # word2number 라이브러리가 아예 숫자로 해석조차 할 수 없는 쓰레기 텍스트
            # (예: "알 수 없음", "서명됨")가 환각으로 들어온 경우에 대한 철벽 방어
            raise ValueError(
                f"[텍스트-수치 변환 실패] LLM이 추출한 금액 텍스트({self.amount_text_written})를 "
                f"산술 가능한 수학적 의미로 변환하는 데 실패했습니다. 파서 예외: {parsing_error}"
            )
            
        return self

2. Redundancy 설계를 통한 환각 완전 면역(Immunity) 달성

정보 이론(Information Theory) 관점에서 이 메커니즘을 뜯어보면, 동일한 목적의 정보를 두 가지 완전히 다른 모달리티(Modality: 기호화된 숫자 체계 vs 언어화된 글자 체계)로 비동기적으로 요구하여 그 일치 여부를 판별하는 이 이중 접근법은, 시스템 고유의 노이즈(LLM 환각)를 극적으로 상쇄(Cancellation) 시키는 위력을 발휘한다.

왜냐하면 LLM 내부에 내장된 Vision 인코더 모델 지능이 영수증의 구겨져 번진 픽셀을 보고 300800으로 완전히 잘못 볼 확률(시각적 공간 환각)과, 화면 반대편에 자연어 텍스트로 또렷하게 적혀있는 Three Hundred라는 글자를 어텐션하여 읽으면서 이를 엉뚱하게 Eight Hundred로 동시에 쌍둥이처럼 똑같이 잘못 해석할 확률(언어적 문맥 환각)이 하나의 문서 안에서 교집합으로 겹칠(Overlap) 가능성은 수학적 기하급수 한계로 인해 거의 0에 한없이 수렴하기 때문이다.

따라서 이 ’텍스트-수치 변환 오라클 검문소’를 무사히 통과하여 일치한다고 인정받은 결제 금액 데이터는, 99.999%의 완벽한 확률로 지류 원문에 적힌 진실(True Information)임을 시스템적으로 확신할 수 있게 된다. 우리는 이를 근거로, 뒤에 이어진 파이프라인의 백엔드 결제 스크립트로 트랜잭션을 쿨하게 넘겨버릴 수 있는 가장 거대하고 당당한 수학적 근거를 획득한 것이다.