13.5.1 마스터 데이터(Master Data) 연동을 통한 실재성 검증

13.5.1 마스터 데이터(Master Data) 연동을 통한 실재성 검증

거대 언어 모델(LLM)이 비전 인식(OCR)을 통해 거친 화질의 영수증 이미지로부터 공급자명(vendor_name)을 ’Apple Store’로, 그리고 구매한 품목 코드(item_code)를 ’MQD83ZP/A’로 완벽한 String 타입의 JSON으로 군더더기 없이 추출해 냈다고 가정해 보자.
자, 앞서 우리가 피땀 흘려 구축했던 1단계 구문 오라클(타입과 포맷 검사 유효)과 2단계 의미론 오라클(산술 계산 일치)은 이 데이터를 당연히 한 치의 의심도 없이 정상적인 우량 모범 데이터로 판별하고 하위 파이프라인으로 무사 통과시킬 것이다.

그러나 만약, 이 트랜잭션을 수행하려는 해당 기업의 ERP 데이터베이스(DB)에는 수년간 단 한 번도 ’Apple Store’라는 벤더가 거래처로 정식 등록된 적이조차 없고, ’MQD83ZP/A’라는 부품 코드도 사내 자산 및 재고 마스터(Master) 상에 전혀 등재되어 있지 않은 미지의 문자열이라면 어떻게 될까?
이 LLM이 추출한 완벽하고 정교한 텍스트 데이터는, 회계 원장(General Ledger) 데이터베이스에 레코드로 INSERT 되려 하는 그 순간, 조인(JOIN) 할 부모 테이블을 잃어버린 **‘고립된 고아 레코드(Orphan Record)’**가 되어버린다. 이는 곧 RDBMS의 가장 신성한 룰인 참조 무결성 제약 조건(Referential Integrity Constraint)을 산산조각 내며 엄청난 DB 에러 백트레이스를 뿜어내게 만든다.

이 지점이 바로, 통제되지 않는 ’비정형 데이터의 무한한 변동성’과 고도로 정규화(Normalization) 된 ‘정형 데이터의 엄격함’ 사이에서 벌어지는 가장 깊고 아찔한 데스 밸리(Death Valley)다.
LLM은 그저 눈에 보이는 이미지의 광학적 잉크 자국을 얕은 수준의 자연어 텍스트로 치환해 주었을 뿐, 기업이 수십 년간 엄격하게 통제해 온 ’사내 시스템의 거시적 문맥(Context)’과 ’마스터 권한(Master Authority)’을 텔레파시처럼 소유하고 있지 않기 때문이다.

따라서 3단계 오라클은 파이썬 객체로 추출이 갓 끝나자마자, 이 추출된 값을 외래 키(Foreign Key)로 쥐고 사내 **마스터 데이터 저장소(RDBMS, Redis Cache, SAP 등)**에 가장 무자비한 SQL 쿼리나 네트워크 API 요청을 때려, 이 텍스트 토큰이 문서 바깥의 현실 거대 시스템에 실제로 **‘서식(Existence)하는 합법적인 엔티티(Entity)’**인지 반드시 냉혹하게 검문소에서 신원조회를 거쳐야만 한다.

1. 런타임 에이전트: 마스터 데이터 룩업(Lookup) 오라클 구현

마찬가지로 이 철벽같은 시스템 실재성 조회 로직 역시 Pydantic의 심장부인 @model_validator 내부에서 비동기(Asynchronous) 혹은 동기적 DB 룩업 네트워크 함수를 런타임에 강제로 호출하여 완전 자동화할 수 있다.

from pydantic import BaseModel, model_validator
import httpx # 사내 내부 API 서버 조회를 위한 고속 HTTP 클라이언트 라이브러리

class EnterpriseMasterDataOracle(BaseModel):
    # LLM이 이미지에서 글자로 읽어낸 추출 텐서
    vendor_registration_id: str 
    item_catalog_code: str
    
    # 컴파일 타임에 환경 변수(env)나 DI로 주입될 사내 폐쇄망 마스터 ERP 조회 API 엔드포인트
    _MASTER_ERP_API_URL = "http://internal-erp.corp.network:8080/api/v1/master/lookup_oracle"
    
    @model_validator(mode='after')
    def verify_entity_existence_in_realworld(self):
        """ 
        LLM이 뱉은 가상의 텍스트 데이터가, 사내 마스터 DB에 실동하는 데이터인지 
        네트워크 핑(Ping)을 때려 무결한 일치 여부를 증명(Verify)한다. 
        """
        
        try:
            # 1. 시스템 통신(Network I/O)을 통해 사내 DB에 진실의 쿼리(Ground Truth Query)를 날림
            # (현업 MSA 환경에서는 asyncio를 사용하여 스레드 블로킹 없이 초고속으로 처리한다)
            response = httpx.post(
                self._MASTER_ERP_API_URL, 
                json={
                    "vendor_rgno": self.vendor_registration_id, 
                    "item_code": self.item_catalog_code
                },
                timeout=2.0 # 성능 병목 방지를 위한 타임아웃
            )
            response.raise_for_status()
            lookup_result = response.json()
            
        except httpx.RequestError as e:
            raise ValueError(f"[인프라 장애] 마스터 ERP 시스템 연결 실패로 오라클 검증이 중단됨: {e}")

        # 2. 공급자(Vendor) 실재성 무결성 심판
        if not lookup_result.get("vendor_exists", False):
             raise ValueError(
                f"[마스터 DB 외래 참조 모순] 문서에서 추출된 공급자 번호({self.vendor_registration_id})는, "
                f"당사 ERP 마스터 시스템에 단 한 번도 등록된 적이 없는 가상의 유령(Ghost Vendor)입니다."
            )
             
        # 3. 구매 품목(Item) 실재성 무결성 심판
        if not lookup_result.get("item_code_exists", False):
             raise ValueError(
                f"[마스터 DB 외래 참조 모순] 추출된 부품 카탈로그 코드({self.item_catalog_code})는, "
                f"당사 자산 마스터에 존재하지 않거나 이미 폐기/스왑된 허위 코드 패턴입니다."
            )
             
        return self # 현실 시스템 상에 그 존재가 완전히 증명된 실체적 텐서만을 반환한다.

2. 닫힌 우주를 열어젖히는 3단계 Ground Truth 오라클의 위대함

이 사내 마스터 데이터 연동 오라클 구조는, 비정형 처리 파이프라인의 공학적 무게중심과 관점을 완전히 뒤집어 놓는다.
지난 1, 2단계까지의 내부 검증 작업이 오로지 *“LLM이 입력 이미지를 똑바로 꼼꼼히 잘 읽어냈는가?”*를 자신만의 닫힌 구문(Syntax) 논리로 내부 평가하는 ’내성적 판독기’에 머물렀다면, 마스터 룩업을 구동시킨 3단계 오라클은 비로소 **“LLM이 읽어낸 그 결과가 우리 기업의 수백만 짜리 시스템 생태계 안에서 다른 테이블과 당당히 결합(Join) 될 지위를 가졌는가?”**를 심문하는 무시무시한 거버넌스(Governance) 레벨의 심판자로 수직 진화하게 된다.

만약 이 마스터 검색 방어선이 실패하여 트랜잭션이 튕겨 나간다면, 그것은 벤더가 진짜로 처음 거래를 터서 마스터에 아직 없는 신규 벤더(New Vendor)이거나, 아니면 인간/기계 중 누군가가 문서 상의 글자를 조작/환각하여 오타를 써넣은 것이다.
3단계 오라클은 이를 데이터베이스 참조 오류로 터지기 직전 메모리상에서 재빠르게 요격하여, 조용히 수동 심사(HITL, Human-in-the-Loop) 큐(Queue)로 넘기거나, 아니면 “ERP 벤더 신규 등록 파이프라인“으로 트랜잭션을 매우 안전하고 부드럽게 스위칭시킬 수 있는 가장 결정적이고 우아한 **비즈니스 분기점(Microservice Routing Milestone)**을 아키텍트에게 쥐여주는 것이다.