LLM 평가 파이프라인 설계 - 프롬프트를 어떻게 테스트하는가
문제 프롬프트를 수정할 때마다 “이번 수정이 전체적으로 더 나아졌는가?”를 판단하기 어렵다. 특정 케이스에서 좋아지면 다른 케이스에서 나빠지기도 한다. 전통적인 소프트웨어는 유닛 테스트로 회귀를 잡을 수 있지만, LLM 출력은 비결정적이다. 같은 프롬프트에 같은 입력을 넣어도 다른 출력이 나올 수 있다. 프롬프트 변경의 품질을 체계적으로 측정하는...
문제 프롬프트를 수정할 때마다 “이번 수정이 전체적으로 더 나아졌는가?”를 판단하기 어렵다. 특정 케이스에서 좋아지면 다른 케이스에서 나빠지기도 한다. 전통적인 소프트웨어는 유닛 테스트로 회귀를 잡을 수 있지만, LLM 출력은 비결정적이다. 같은 프롬프트에 같은 입력을 넣어도 다른 출력이 나올 수 있다. 프롬프트 변경의 품질을 체계적으로 측정하는...
배경 대출 심사에서 연소득은 핵심 지표다. 건강보험 납부 데이터로 연소득을 추정하는 로직이 있는데, 현실 세계의 복잡한 상황들이 이 로직을 계속 깨뜨렸다. 여신기획팀, 신용분석팀, 백엔드 엔지니어가 모여서 엣지케이스들을 하나씩 정리한 과정을 기록한다. 기본 로직 flowchart LR A["당해년도<br>건강보험 납부 내역...
배경 부동산 담보대출 비교 서비스를 위해, 외부 신용정보 기관의 데이터를 조회하고 이를 내부 심사 엔진(이하 “평가 엔진”)에 전달하는 작업을 했다. 핵심은 DSR(총부채원리금상환비율) 계산에 필요한 선순위 대출 잔액을 전달하는 것이었다. 작업 규모: 약 2개월 소요 (가장 무게감 있는 평가 엔진 연동 작업) 최초 설계: 배열 기반 순위 리스...
문제 발견 대출 심사 시스템에서 건강보험 납부 데이터를 외부 평가 엔진에 전달하는 로직에 버그가 있었다. 같은 신청 건에 대해 심사 경로(가심사/자동심사)에 따라 다른 값이 전달되고 있었다. -- 자동심사 (공공 마이데이터) "HEALTH_INSURANCE": "0,0,0,0,0,0,0,0,-56460,163070,163070,0,0,0,..." ...
사건 개요 항목 내용 장애 시간 금요일 18:30 ~ 월요일 12:53 지속 시간 약 66시간 영향 범위 외부 제휴사 대출 사전승인 요청 전체 실패 근본 원...
문제 상황 외부 기관과의 소켓 통신에서 간헐적으로 InvalidHeaderError: b''가 발생했다. 빈 바이트를 수신하는 에러로, 발생 패턴이 불규칙적이었다. 소켓 코드 분석 기본 통신 구조: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.settime...
배경 금융 기관과 파일 전문(전자문서)을 주고받는 시스템을 새로 설계했다. 기존에는 Windows 전용 프로그램을 통해 담당자가 수동으로 파일을 전송/수신하고 있었는데, 이를 24시간 자동화된 소켓 기반 시스템으로 전환하는 프로젝트였다. 요구사항과 제약조건 3가지 양방향 프로세스: 변동 데이터 수신, 선택적 수신 요청, 집중 데이터 수신 ...
배경 금융 기관에 일일 데이터를 전송하는 배치 태스크를 리팩토링했다. 금융 데이터 전송이라 정확성이 생명이고, 한 건이라도 틀리면 규제 이슈로 이어질 수 있는 시스템이다. 기존 시스템의 문제점 flowchart TD subgraph problems["기존 시스템의 6가지 문제"] A["1. 단일 함수에 모든 로직 혼재<...
배경 대출 연체 후에는 화해(합의), 워크아웃(자율 채무조정), 회생(법원 개입) 세 가지 후처리 프로세스가 있다. 이 세 프로세스의 공통점은 등록 → 상환 → 종결이라는 생명주기를 갖는다는 것이다. 문제는 이 워크플로우가 여러 도구와 팀에 분산되어 있었다는 점이다. AS-IS: 3개 도구, 2개 팀 flowchart TD subgrap...
사건 운영 중인 테이블에 90개의 nullable 컬럼을 추가하는 Django 마이그레이션을 실행했다. ACCESS EXCLUSIVE LOCK이 걸리면서 해당 테이블에 의존하는 모든 요청이 약 2분간 타임아웃됐다. gantt title 장애 타임라인 dateFormat HH:mm axisFormat %H:%M secti...