13.11.3 복잡한 테이블/차트 데이터 추출 시 VLM의 환각을 포착하는 행/열 무결성 테스트

13.11.3 복잡한 테이블/차트 데이터 추출 시 VLM의 환각을 포착하는 행/열 무결성 테스트

글자들이 줄글로 느슨하게 흩어져 있는 일반적인 영수증을 넘어, 엔터프라이즈 환경의 기업 재무 제표(Financial Statement)나 대형 병원의 환자 투약 기록지 같이 수십 개의 행(Row)과 열(Column)이 표 여백 하나 없이 빽빽하게 교차하는 초고밀도 그리드(Grid) 테이블 이미지는, 현재 인류가 보유한 가장 위대한 최고 수준의 VLM(Vision LLM)에게도 가장 가혹하고 잔인한 지옥의 테스트 베드다.
기계 모델이 작은 픽셀 테이블의 선을 따라가며 읽다가 시선의 축(Attention Mechanism)이 단 1도, 혹은 단 1픽셀만 어긋나 비틀어지면, 그 즉시 모든 숫자의 배열 매핑이 대각선으로 무참히 밀려 적히는 치명적인 집단적 **‘이동 환각(Shift Error 혹은 Alignment Hallucination)’**이 폭발적으로 발생하기 때문이다.

1. 2차원 매트릭스 ’이동 환각(Shift Error)’의 소름 끼치는 공포

우리가 VLM 봇에게 *“이 결산서 이미지에서 각 월별(Column) 부서별(Row) 매출액을 완벽한 2차원 JSON 배열로 뽑아줘”*라고 오라클 프롬프트를 하달했다.
모델이 첫 번째 행(영업부)의 1월, 2월, 3월 픽셀 데이터를 숨죽여 잘 읽어 내려가다가, 하필 4월 데이터 픽셀 칸에 누군가 펜으로 줄을 그어 놓아 숫자가 완전히 지워진 것을 발견한다.
정상적인 시스템이라면 이 칸에 "NULL"이나 0을 넣어야 한다. 하지만 창의력이 과도하게 발달한 똑똑한 VLM은 자신이 숫자를 잃어버렸다는 수치심을 감추기 위해, 아주 자연스럽고 뻔뻔하게 바로 밑에 있는 행(마케팅부)의 4월 숫자를 몰래 훔쳐와 영업부 4월 빈칸에 채워 넣어 버린다.
이 단 한 번의 어텐션 일탈을 기점으로, 그 뒷단에 위치한 모든 마케팅부와 개발부의 5월, 6월, 12월 셀(Cell) 값들이 연쇄적으로 지그재그 한 칸씩 엇갈리게 배정되어 버리는, 거대한 2차원 매트릭스의 대붕괴가 일어난다.

이러한 악의적 군집 환각은 “각 숫자가 float 타입이 맞는가?” 혹은 *“포맷이 달러($) 기호를 가지고 있는가?”*와 같은 1차원적 구문 오라클로는 절대 잡아낼 수 없다. VLM이 밀려치기로 짜 맞춰 넣은 그 숫자들의 형태와 데이터 타입 자체는 개별적으로 보면 너무나 완벽히 정상 코스프레를 하고 있기 때문이다.

2. 십자포화(Cross-fire): 매트릭스 크로스체크(Matrix Cross-check) 오라클망

이 치명적인 2차원 테이블 이동 환각을 단칼에 방어하기 위해, 오라클 설계자는 Pydantic의 최상위 루트 배열(Array) 객체 검증부에 **‘행-열 직교 무결성(Row-Column Orthogonal Integrity)’**이라는 하드코어 수학적 검증 로직을 반드시 삽입해야 한다.

이것은 인류의 회계사들이 수백 년간 사용해 온 엑셀 복식 부기의 ’좌우 상하 대차평균 검산 수식’과 완전히 동일한 오라클 철학이다.

  1. [가로축(행, Row) 합계 텐서 분리 추출]: VLM에게 영수증의 각 부서별 12개월 치 매출을 뽑게 명령할 때, 테이블 맨 우측 끝단에 인쇄되어 있는 ‘당해 연도 부서 인쇄 총합(Row Total Value)’ 픽셀 값도 반드시 독립적인 스키마 변수로 분리하여 강제 추출하게 만든다.
  2. [세로축(열, Column) 합계 텐서 분리 추출]: 동시에, 테이블 맨 밑바닥 여백에 적혀 있는 ‘각 월별 전사 인쇄 총합(Column Total Value)’ 픽셀 값 역시 모델이 놓치지 않고 추출하도록 스키마로 강제한다.
  3. [오라클의 재판 격발 (Runtime Cross-check)]: 데이터가 파이썬 런타임 메모리에 안착하면 Pydantic @model_validator 가 즉시 깨어난다. VLM이 훔쳐서 뽑아낸 개별 12개의 셀 값 배열을 메모리에서 가로로 모두 sum() 더한 값이, 사전에 추출된 우측단의 인쇄 총합(Row Total)과 1원짜리 하나 틀림없이 정교하게 일치하는지, 그리고 세로로 배열을 sum() 더한 값이 하단의 인쇄 총합(Column Total)과 완벽히 교차 일치하는지를 2차원의 행렬(Matrix) 구조로 무자비하게 크로스체크 연산한다.

만약 모델이 앞선 예시처럼 픽셀 해독의 시선을 잃고 4월의 매출 값을 위아래로 단 한 칸이라도 밀려 적어내는 환각을 부렸다면, 이 수학적 ’십자포화(Cross-fire) 합계 검산망’을 절대로, 결단코 무사히 벗어날 수 없다. 숫자의 대차(Balance)가 그 즉시 무너지기 때문이다.
오라클은 즉시 ValidationError: 2차원 매트릭스 이동 환각 발생 - [마케팅부]의 데이터가 밀려 가로축/세로축 합계 연산 모순이 격발됨 이라는 치명적인 레드 알람(Exception)을 격발시키며 즉시 파이프라인의 자동화 셔터를 내동댕이쳐 닫아버린다. 그리고 그 오염된 거대한 테이블 해독 트랜잭션 전체를 통째로 묶어 인간 최상급 심사관(HITL Auditor)의 대시보드로 격리 이관시킨다.

우리는 기계 생태계에서 VLM의 화려한 지능과 번지르르한 생성 확률을 단 1%도 맹신해서는 안 된다.
오직 우리가 수학과 Pydantic으로 차갑고 촘촘하게 짜 놓은 이 **[2차원의 직교하는 오라클 가시밭길]**을 스스로의 증명을 통해 상처 하나 없이 통과해 낸 JSON 텐서 구조체만을, 기업의 마스터 DB가 받아들여야 할 절대적이고 유일한 ’진실(Truth)’로 인정할 뿐이다.