생성이 끝없이 폭주하던 문제부터, 아침에 고친 게 저녁에 조용히 속도를 반토막 낸 것까지

주말을 끼고 지난 며칠 사이 발견된 것들을 정리하고 마무리한 하루였습니다. 공통점이 하나 있었는데, 셋 다 "겉으로는 티가 안 나게 조용히" 잘못되고 있었다는 겁니다.

사고 1: 답변 하나가 끝없이 길어져서 프로덕션이 멈췄다

야간 분석 작업 중 하나가 이상하게 정체돼 있는 걸 발견했습니다. 원인을 보니, 로컬 LLM을 돌리는 서버 쪽에 "답변은 최대 이 정도 길이까지만" 하는 상한선이 빠져 있었습니다. 보통은 답변 하나가 짧게 끝나는데, 어쩌다 한 번 모델이 같은 말을 반복하며 멈추지 않고 계속 답변을 만들어내면 수만 토큰, 수십 분까지 폭주할 수 있었던 겁니다. 그동안 감시 체계가 이런 경우를 못 잡고 있었던 게 더 큰 문제였습니다 — 사람이 "왜 이렇게 느리지?" 하고 물어봐야 겨우 알아채는 구조였습니다.

일단 상한선을 걸어서 폭주 자체는 막았고, 그 김에 진짜 필요했던 진행 상태 감시 장치도 새로 설계했습니다. 여기서 재미있는 설계 아이디어가 하나 나왔는데, "지금 몇 분째 진행 중인가"가 아니라 "마지막으로 뭔가 기록된 지 몇 분이 지났는가"를 기준으로 삼는 겁니다. 원래는 종목마다 평균 소요 시간을 기준 삼아 "평균의 몇 배 넘으면 이상하다"는 식을 생각했는데, 이러면 원래 오래 걸리는 큰 종목을 잘못 죽이거나, 반대로 작은 종목이 멈춘 걸 못 잡는 문제가 있었습니다. 대신 "침묵" 자체를 신호로 삼으면, 종목 크기와 상관없이 일관되게 판단할 수 있고 별도의 튜닝도 필요 없어집니다. 지금은 경보만 울리는 관찰 모드로 며칠 지켜보고, 오탐이 없는 걸 확인한 뒤에 실제로 멈춰 세우는 기능까지 켤 예정입니다.