귀찮은 서류 대조 작업을 어떻게 자동화할까?
먼저 우리의 목표는 이 예시에서, 서류의 극단값과 중앙값을 잘 찾아서 분석하고자 하는 상황에 대해서 서술한다. 서류의 특정 지점 1개를 짚어서 별도 API가 없는 임의 웹 서비스에 올라간 실제 서류 PDF 혹은 이미지를 보면서 서류 처리 결과가 실제 눈으로 봤을 때의 서류와 일치하는지 확인하여야 한다. 이 때에, 서류의 개수는 50만 건, 분류해야 할 가짓수는 228건이다. 이 228건을 일일이 도는 것은 사람의 한계를 넘는 일이다. 그렇기 때문에 전략을 세우는 것은 매우 중요하다.
시나리오
- 문서 제목(소분류)
- 문서 코드(대분류)
- 웹 상의 실제 문서
- 날짜
실제 문서와 대조 작업을 수행하기 위해서 문서 제목과 코드 리스트 중에 “2026년 4월 23일” 직전까지 처리된 임의의 데이터를 뽑아서 특정 유형의 요청에 대한 중앙값, 그리고 극단값이 있어야 한다.
데이터베이스에는 아래와 같은 추가 정보가 주어진다.
- 문서의 용량
- 문서의 실제 파일명+확장자
우선 이 업무의 핵심은 공공기관 등에서 민원인으로부터 발생하는 각 서류 건에 대하여 ‘정상 서류’, ‘잘못된 서류’, ‘부분 캡처’ 등의 케이스를 보편 조건으로 환원하여 극단값과 중앙값을 뽑아 대조하여, 각 항목 별로 2000건이 넘는 분량을 고작 5-10건의 문서로 줄이는 것이다.
도출된 것
전략을 구조적으로 수립하자. 우선 전략에서 중요한 것은 ‘어떻게 내 일을 줄일 것인가’에 있다.
- 파일 포맷은
png,bmp등의 이미지와 pdf임 - 이미지 포맷은 모두 낱장 첨부임
- 서류 포맷은 용량이 클 수록 쪽 수가 많음
- 서류 유형은 ‘내부 처리’, ‘정상 서류’, ‘잘못된 서류’, ‘부분 캡처’임
- 다른 문서 코드 대분류 안에서도 같은 문서가 존재한다(예: A->증적C, B->증적C)
이것에서 부분 캡처 이미지, 대용량 pdf 등을 구분할 수 있는 단서는 문서의 용량이다.
필터링 조건은 문서 제목(소분류), 문서 코드(대분류), 날짜이다.
전체 용량의 분포가 정규 분포를 따른다고 가정하고, P1, P25, P50, P75, P99 지점에서 샘플을 뽑는다.
정렬 조건은 백분위 N에 대한 퍼센타일과 그 차가 적을수록 먼저 둔다.
전략 수립
위 조건을 그대로 SQL문으로 옮긴다. 유사한 패턴을 다른 DB, 혹은 다른 SQL DB 구현체에 대해 사용할 수 있기 때문에, PostgreSQL 외의 다른 SQL계열 RDBMS에 이식이 편하게 표준 구문 위주로 쓰고, 변수를 따로 빼서 재사용성을 극대화한다.
각 로직은 단계적으로 상위-하위 단계로 분리되어 실행되게 하여 작성자의 의도를 누구나 읽고 쓸 수 있게 하며, 내부의 DB명, 컬럼명만 변경 시에 그대로 로직을 따라갈 수 있게 한다.
-- [[함수]] DB에서 파일 크기가 백분위 p(n)에 가장 가까운 m개를 가져옴
WITH vars AS (
SELECT
'test' AS t_title, -- 문서 제목
'1234' AS t_code, -- 문서 코드
0.5 AS t_pval, -- p(n) 값에 들어갈 퍼센티지(n)
1 AS t_list_len -- 가져올 파일의 개수(m)
)
SELECT d.* FROM db d, vars v -- db의 별칭은 d, vars의 별칭은 v
WHERE d.title = v.t_title
AND d.code = v.t_code
-- p(n) 백분위 값과 차를 구한 후 차이가 적은 순으로 정렬
ORDER BY ABS(
d.size - (
SELECT PERCENTILE_CONT((SELECT t_pval from vars) WITHIN GROUP (ORDER BY d.size)
FROM db d, vars v
WHERE d.title = v.t_title
AND d.code = v.t_code
)
)
-- 첫 1개만을 가져 오면서 중앙값에 해당하는 문서를 가져 옴
LIMIT (SELECT t_list_len from vars);
결과
백분위 값만 넣으면 해당 지점의 데이터를 가져오기 때문에 특정 지표에 따라 검증 데이터의 특성을 간접적으로 추론할 수 있는 경우 오류값 검츨이 쉽다.
상식적으로 58만 건의 학습 데이터를 모두 하나하나 검증한다는 것은 불가능한 일이다. 그러나 이런 쿼리들을 작성해서 작업하면 그 모든 작업을 5 영업일 내에 끝낼 수가 있다.
모두가 야근에서 해방될 수 있게 효율적인 일을 위해 고민하는 시대가 돴으면 좋겠다고 생각한다. 파견 온 부서에서는 야근이 덜 심해서 조금 편안한 차에, 파견 센터 사수님의 조언대로 학습 내용과 실무 시 적용한 팁들을 기록하는 시간을 약 1달 간 가잘 것 같다.