DEV Community

finaltype
finaltype

Posted on Originally published at finaltype.github.io

"[260914~260920] 측정·검증 도구 자체의 결함을 연달아 찾은 한 주"

유니버스 오염 사고로 시작해, 랭킹 로직·AI 샘플링 설정·벤치마크 도구까지 검증 자체가 잘못돼 있던 지점을 하나씩 찾아 고쳤습니다.

이번 주는 월요일 데이터 오염 사고로 시작해서, 이후로도 계속 "만든 도구가 실제로 제대로 재고 있는가"를 의심하고 확인하는 흐름으로 이어졌습니다.

랭킹 로직, AI 모델 설정, 새로 만든 벤치마크 도구까지 차례로 같은 유형의 문제가 드러났습니다. 겉으로는 그럴듯한 숫자가 나오고 있었지만, 근거를 한 겹 더 파보면 검증 자체가 무효였던 경우가 많았습니다.

월요일, 유니버스가 통째로 오염됐다

외부 시세 데이터 제공처가 시가총액 값을 전부 빈 값으로 돌려주는 장애가 있었습니다. 이 빈 값을 시스템이 그냥 통과시키면서, 원본 목록 순서(알파벳순)가 "시가총액 상위 N종목"인 것처럼 오인됐습니다.

발견 경위는 낯선 종목 하나를 실계좌가 매수한 걸 보고 의문을 품은 것이었습니다. 다행히 코스피는 아침 확정 캐시 덕분에 무사했고, 오염은 코스닥 슬라이스에서만 발생했습니다.

거래를 즉시 중단시키고 전날 상태로 복구한 뒤, 데이터 소스·갱신 로직·최종 확정이라는 서로 다른 세 지점에서 같은 오염을 잡아내는 3중 방어층을 새로 넣었습니다.

화요일, 랭킹 로직이 기각되고 즉시 교체됐다

며칠 전 도입해둔 동점 처리 방식이 사전에 정한 판정 기준을 통과하지 못해 기각됐습니다. AI에게 원인을 다시 자문한 결과, 문제는 "실시간성 부족"이 아니라 순위를 매기는 원재료 점수 자체가 하루 사이 거의 무작위로 흔들린다는 데 있었습니다.

그날그날 점수를 바로 쓰는 대신 최근 며칠 치를 평균 내는 방식으로 즉시 교체했습니다. 같은 날 진행한 대규모 코드 리뷰에서는 계좌 간 이관분이 원금 계산에서 빠지고 평가금액에만 반영돼 수익률이 수백 퍼센트로 부풀어 보이던 버그, 테스트 코드가 운영 텔레그램으로 잘못 경보를 쏘던 버그를 함께 찾아 고쳤습니다.

브로커 쪽 보유 종목 조회가 일부 페이지만 조용히 실패해도 "정상 완료"로 돌려주던 계약도 이날 뜯어고쳐, 조회 실패를 명시적인 오류로 승격시켰습니다. 이런 주문 실행과 안전장치 계층(새 창)은 종목 선별 로직과 달리 설계 취지를 비교적 자세히 공개해두고 있습니다.

수요일, 몇 주째 의도와 다른 설정으로 돌고 있었다

"이 설정, 우리가 제대로 논의하고 정한 적이 있었나?"라는 질문에서 출발해, AI 리포트용 모델의 샘플링 설정을 다시 들여다봤습니다. 확인 결과 몇 주 전 진행했던 비교 실험 자체가 설정값을 중간에서 버리는 코드 때문에 무효였다는 게 드러났습니다.

더 근본적으로는, 프로덕션에서 "생각 모드"를 꺼둔 채 쓰는 메인 모델에 그 모드가 켜져 있을 때를 가정한 기본값이 그대로 걸려 있었습니다. 모델 제공사의 공식 권장값으로 바로잡고 관측 전용 모델에도 같은 값을 맞췄습니다.

목요일, 어제 고친 설정이 새 도구엔 하나도 안 들어가고 있었다

같은 모델 처리 속도를 재는 새 벤치마크 도구(perf-harness)의 첫 검증을 준비하다가, 전날 고친 설정이 이 도구에는 전혀 반영되지 않고 있다는 걸 발견했습니다.

한 번 의심하고 나니 같은 유형의 누수가 세 군데서 더 나왔습니다. 서버 시작 설정을 오히려 덮어쓰던 경우, 파이프라인을 그대로 재생하는 측정 경로에서도 값이 안 실리던 경우였습니다. "값이 있으면 주입하고 없으면 기존 방식 유지"라는 동일한 원칙으로 하나씩 고쳤습니다.

표본 방식도 매번 새로 뽑던 걸 특정 날짜 기준으로 고정해, 앞으로는 "설정이 달라진 것"과 "표본이 달라진 것"이 섞이지 않게 했습니다. 이 김에 11일째 방치돼 있던 안전장치 개선 항목들도 전부 다시 자문받아 유효성을 확인하고 반영했습니다.

금요일, 측정 도구 자체가 계측 오류를 두 건 내고 있었다

벤치마크가 처음 돌자 이상한 숫자가 나왔습니다. 트라이얼 하나가 하루 GPU 한도의 80%를 혼자 다 쓴 걸로 기록돼 있었는데, "그 숫자가 어디서 나온 계산이야?"라고 되짚어보니 여러 종목을 동시 처리한 시간을 순차 처리한 것처럼 그냥 다 더해서 기록하고 있었습니다. 실측 대비 3배 넘게 과다 청구된 셈이었습니다.

회계를 고친 뒤 설정 변형을 비교해봤더니 이번엔 순위가 이상했습니다. 서버 로그를 다시 확인하니, 응답을 기다리는 시간제한이 실제 운영 환경보다 훨씬 짧게 잡혀 있어서 정상 진행 중인 요청을 실패로 잘못 집계하고 있었습니다.

시간제한을 운영 환경과 맞추자 순위가 뒤집혔습니다. 느리다고 판단했던 설정이 사실은 더 빨랐던 겁니다. 같은 날 별도로, 종목 분석 작업 한 갈래가 응답 시간제한 없이 9시간 넘게 멈춰 있던 것도 발견해 고쳤습니다.

토요일, 자동 재개가 권한 벽에 막혔다

정정된 측정 도구를 새벽에 자동으로 재개하도록 걸어뒀는데, 첫 트라이얼만 뜨고 조용히 멈췄습니다. 원인은 자동화 스킬이 부여받는 명령 실행 권한이 스킬을 연 턴에만 유효한 구조였다는 것이었습니다.

백그라운드 작업이 다음 턴으로 넘어가는 순간 권한이 사라져, 사람 없는 새벽 자동 재개에서는 그대로 막다른 길이 됐습니다. GPU는 47분 동안 정리되지 않은 채 자리만 차지했고, 아침에 사람이 직접 대화로 재개해 라운드를 마무리했습니다.

검토하던 새 설정은 처리량 이득이 잡음 수준과 겹쳐 뚜렷하지 않았고, 현재 설정을 그대로 유지하기로 했습니다. 자동 재개는 구조적 한계를 풀 방법을 정하기 전까지 당분간 쓰지 않고 사람이 대화로만 재개하기로 했습니다.

일요일, 온도 실험 판정은 다시 사람 손으로

이틀째 이어온 AI 응답 무작위성(온도) 설정 비교 실험이 본 비교까지 끝났습니다. 방향은 뚜렷했지만 "문제 삼을 만큼 큰가"는 실험 데이터만으로 단정하기 어려웠습니다.

무관한 다른 AI에게 원자료를 넘겨 독립적으로 재계산을 맡겼는데도 같은 결론이었습니다. 방향은 확실해도 크기는 확정할 수 없다는 것이었고, 추천은 예전 설정으로 되돌려 당분간 고정해두자는 쪽이었습니다. 최종 결정은 사람이 직접 내리기로 하고 다음 날 저녁까지 미뤄뒀습니다. (이후 결정 과정은 별도 글(새 창)에 정리했습니다.)

이와 별개로 벤치마크 도구에 밀려있던 자잘한 수선들도 이날 한 번에 정리했습니다. 로그 해석 규칙이 실제 출력 형식과 애초에 안 맞아 사실상 한 번도 제대로 작동한 적이 없었던 부분, 주말·휴장일 시간대 제한 오류, 결과 보고서 설치 경로 문제까지 전부 고쳤습니다.


한 주를 돌아보면 새 기능을 추가하기보다는, 이미 돌고 있던 도구들이 실제로 맞게 재고 있는지를 계속 되물은 한 주였습니다. 유니버스 오염, 랭킹 로직, 모델 설정, 벤치마크 회계, 시간제한까지 — 하나를 고치면 그 아래에서 같은 유형의 문제가 또 나왔습니다.

다행히 매번 "그 숫자가 어디서 나온 거야"라는 질문에서 막힌 지점을 되짚어 찾아냈습니다. 다음 주엔 온도 설정 최종 결정과, 새로 정비된 벤치마크 도구가 실제로 안정적으로 도는지부터 확인하게 될 것 같습니다.

Top comments (0)