Quant Trading Bot Devlog

Read in English

온도를 처음으로 진짜 바꿔봤더니 - 사전등록 규칙이 "기각"이라 했는데 내가 뒤집은 이유

몇 주 동안 "논의했다"고 믿었던 샘플링 온도 실험이 사실은 한 번도 실행된 적이 없었습니다

프로덕션에서 돌리는 로컬 LLM의 샘플링 온도를 두고 A/B 실험을 했습니다. 결과부터 말하면, 미리 정해둔 판정 규칙은 "지금 세팅을 기각하라"고 나왔는데 저는 그 규칙을 집행하지 않았습니다.

이 글은 그 판단이 옳았다는 얘기가 아닙니다. 어떤 근거로 규칙을 뒤집었고, 그 사실을 어떻게 기록해뒀는지를 남겨두려는 글입니다.

온도를 바꿔본 적이 한 번도 없었다

이 프로젝트에는 로컬 LLM이 종목을 분석하는 파이프라인(새 창)이 있습니다. 지난달, 이 모델의 샘플링 세팅을 비교하는 A/B 실험을 한 번 했다고 기록해뒀습니다.

그런데 이번에 그 기록을 다시 뜯어보니, 그 실험은 A와 A를 비교한 것이었습니다. 클라이언트 코드가 온도 파라미터를 서버에 전달하지 않고 버리고 있어서, B팔에도 온도가 실리지 않았던 겁니다. (원인 추적은 별도 postmortem(새 창)에 정리했습니다.)

"논의는 했는데 검증이 무효였다"가 아니라, "온도를 실제로 바꿔본 적이 한 번도 없었다"가 실체였습니다.

프로덕션이 엉뚱한 모드의 값으로 돌고 있었다

온도를 처음 제대로 들여다보다가 더 큰 걸 발견했습니다. 프로덕션은 추론(thinking) 기능을 끈 상태로 돌고 있었는데, 샘플링 값은 아무것도 지정하지 않아서 모델 파일에 박힌 기본값이 그대로 쓰이고 있었습니다.

그 기본값이 하필 추론을 켠 모드용 권장값이었습니다. 모드와 값이 서로 안 맞는 채로 몇 주를 돈 셈입니다.

그날 밤 벤더가 추론 끈 모드에 권장하는 값으로 바꿨습니다. (그날의 개발일지(새 창)) 그 시점엔 "판정이 끝나기 전에는 프로덕션 변경 금지"라는 제 규칙이 있었는데, 그걸 알면서 직접 예외로 두고 진행했습니다.

좋아진 것처럼 보였던 숫자의 정체

바꾸고 사흘 동안은 좋아 보이는 숫자가 나왔습니다. 같은 입력을 두 번 돌렸을 때 등급이 일치하는 비율이 올라갔습니다. 재현성이 좋아진 것처럼 보였습니다.

그런데 같은 기간 Hold 등급의 비중도 함께 올라가 있었습니다. 한 등급에 결과가 몰리면 일치율은 저절로 올라갑니다. 독립적으로 뽑아도 우연히 겹칠 확률이 커지기 때문입니다.

그래서 이 일치율 상승은 "재현성이 좋아졌다"는 증거가 아니라 "Hold로 쏠렸다"는 사실의 다른 표현일 수 있었습니다. 그 순간 "이상 없음"이라고 적어둔 첫 판독을 경보로 격상했습니다.

사전등록으로 다시 확인했다

의심이 생겼으니 확인 실험을 설계했습니다. 데이터를 보고 세운 가설이라, 결과를 보기 전에 판정 규칙을 문서로 먼저 못 박았습니다.

실제로 A팔 첫 런이 게이트에서 걸렸습니다. 형식 파싱 실패와 잘린 응답이 기준을 넘어서, 그 런은 버리고 교체 런을 돌렸습니다. 폐기한 런의 수치는 참고로만 남겼습니다.

규칙의 답은 "기각"이었다

결과는 이랬습니다.

규칙은 제가 세운 가설을 정확히 검출했습니다. 규칙이 틀린 게 아니었습니다.

그래도 나는 B를 유지했다

다른 AI에게 자문을 구했더니, 처음엔 "옛 세팅으로 원복"을 권했습니다. 사전 규칙이 기각이라고 했고, 유지의 근거가 될 재현성 이득도 증거가 없다는 이유였습니다.

그런데 저는 두 가지를 짚었습니다.

첫째, 옛 세팅을 "검증된 구 체제"라고 부를 수 없습니다. 이 모델을 실제로 프로덕션에 쓴 게 열흘 남짓이고, 옛 세팅은 추론 모드용 기본값이 우연히 적용된 값이었습니다. 개발사가 권장하는 값은 제가 몇 밤 돌려본 것보다 훨씬 많은 사용으로 검증됐을 겁니다.

둘째, 제 투자에서는 Hold가 많다는 게 곧 나쁜 건 아닙니다. 그걸 손실로 본 건 실험 설계 시점에 제가 검증 없이 종점에 넣은 전제였습니다.

이 두 전제를 전해주자 자문 결과가 하루 만에 뒤집혔습니다. 전날 "원복"을 권하던 쪽이 "유지"로 바뀌었습니다. 데이터가 바뀐 게 아니라 제가 준 전제가 바뀐 겁니다. 그래서 이 결정은 "실험이 B를 지지했다"가 아니라 "사전 규칙을 사후의 전제로 뒤집었다"라고 부르는 게 맞습니다.

뒤집은 사실을 기록으로 남겼다

규칙을 뒤집는 건 가능하지만, 조용히 뒤집으면 안 됩니다. 그래서 실험 문서에 네 가지를 적어뒀습니다.

조건도 걸었습니다. Hold 쏠림이 심해지면 알리는 비차단 경보를 켰고, 다음 재검토 날짜까지는 어떤 결과가 나와도 샘플링을 바꾸지 않기로 했습니다. 재검토는 아래 사실을 반영한 뒤에 합니다.

입력 자체가 부실했다

실험 뒤에 더 곤란한 걸 알게 됐습니다. 외부 데이터 소스 두 군데가 며칠 전부터 조용히 죽어서, 프롬프트에 들어가는 뉴스가 거의 없고 종목 이름조차 코드로 대체되고 있었습니다.

이 A/B의 동결 입력이 하필 그 결손 상태의 날이었습니다. 그러니 결과는 "뉴스 없는 입력"이라는 조건이 붙은 결과입니다. Hold 쏠림이 특히 커진 날이 뉴스가 사라진 첫날과 겹치기도 해서, 쏠림을 새 세팅 탓이라고 단정할 수도 없게 됐습니다.

입력을 복구하고, 이 결손 기간은 판정 문서에 경계로 병기했습니다. 재검토는 정상 입력에서 다시 합니다.

정리하면

파라미터를 바꿨다고 믿는 것과 서버에 실제로 도달했다고 확인하는 것은 다른 일입니다. 이제 실험 런마다 서버 기동 커맨드에 플래그가 찍혀 있어야 유효로 칩니다. 증거가 없으면 그 런은 무효입니다.

좋아 보이는 지표가 분포의 산술일 수 있습니다. 일치율이 올랐다면, 먼저 결과가 한쪽에 몰리지 않았는지부터 봐야 합니다.

사전등록 규칙을 뒤집을 때는 규칙이 틀렸는지, 전제가 틀렸는지를 구분해서 적어야 합니다. 이번엔 규칙은 맞았고 규칙에 들어간 전제가 검증되지 않은 것이었습니다.

자문 결과는 내가 준 전제에 따라 달라집니다. 결론이 바뀌었다면 무엇이 바뀌었는지, 데이터인지 전제인지를 기록해야 나중에 이 결정을 다시 볼 수 있습니다.

아직 풀리지 않은 것도 남아 있습니다. Hold 쏠림이 실제로 손해인지, 정상 입력에서도 같은 쏠림이 나오는지는 다음 재검토 때 봐야 합니다.