자동화 slecs

AI 분류로 자동입금 무한 재시도와 새벽 운영 알람을 잡다

목차

문제 상황

자동입금 확정 단계에서 실패 메시지가 들어오면 무조건 재시도 큐에 다시 넣고 있었음. 그러다 보니 영구 실패(잘못된 계좌·만료된 거래)도 무한 재시도 대상이 됐고, 운영팀이 새벽에 알람 받고 수동으로 끄러 들어가는 일이 반복됨.

대표적으로 들어오는 메시지가 이런 식임.

[입금알림] 거래종료 / 금액불일치 / 한도초과 / 일시오류

겉으로 보면 비슷해 보이는데 의미는 전혀 다름. 단순 정규식으로 구분하려고 했는데 결제대행사마다 문구가 미묘하게 달라서 케이스가 폭증함.

분류 기준

수동으로 케이스 정리해 보니 크게 4종류였음.

유형 재시도 후속 처리
일시 오류 O 큐 재투입
금액 불일치 X 파트너 통보
거래 만료 X 영구 실패 마킹
미식별 X 운영 큐로 격리

규칙 기반으로 짜다가 결제대행사 두 곳 추가하니 분기문이 30개를 넘김. 유지보수 가망 없다고 판단함.

AI 분류 도입

LLM에 메시지 원문 + 최소 컨텍스트만 던지고 4종 라벨 + 신뢰도만 받기로 했음.

  • 프롬프트는 짧게, 라벨은 enum으로 강제
  • 신뢰도 0.8 미만이면 미식별로 강등
  • 동일 메시지는 호출 결과 캐싱

그리고 핵심: 재시도 가능 라벨이 아니면 큐 재투입 자체를 차단. 기존엔 예외만 던지면 무조건 재시도였는데, 분류 결과를 확정 프로세스보다 먼저 통과시켜서 영구 실패는 그 자리에서 종결시킴.

parse → classify → retriable? → enqueue : terminate

이 한 줄 끼워넣은 게 사실상 패치의 본체였음.

효과

  • 새벽 운영 알람 약 70% 감소
  • 무한 재시도로 인한 중복 입금 후보 0건
  • 미식별 케이스만 운영 큐로 모여서 케이스 보강이 쉬워짐

남은 숙제

LLM 호출 비용 — 메시지 양 많을 땐 캐시 적중률이 관건임. 캐시 키를 본문 해시로 잡았는데, 의미는 같고 표현만 다른 메시지는 캐시 미스가 남. 임베딩 기반 유사 매칭으로 한 번 더 줄여볼 생각.

또 하나, 신뢰도 애매 구간(0.7~0.8)은 일단 미식별로 보내고 있음. 운영 큐에서 사람이 라벨링한 데이터가 어느 정도 쌓이면 임베딩 분류기로 갈아타서 LLM 호출 자체를 줄이는 방향으로 가려고 함. 회수 대상 메시지 통계도 같이 뽑아서 파트너별 패턴 차이를 보면 더 깎을 여지가 있을 듯.

다음

댓글 0

첫 댓글 달아줘.