ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 한 번 정한 임계값은 언제 다시 재야 하는가: 기각 게이트 0.4와 분리되지 않는 두 변수

    MEMENTO 2026. 11. 10. 09:02
    반응형

    검색 시스템에는 숫자 하나로 결정이 갈리는 지점이 있다. 오픈소스 에이전트 기억 서버 Memento에서는 기각 게이트가 그렇다. 질의가 들어오면 후보 기억 상위 10개를 작은 판정 모델(Jev)이 읽고 점수를 매긴다. 최고 점수가 0.4에 못 미치면 질의 전체를 "이 저장소에는 답이 없다"로 처리하고 아무것도 돌려주지 않는다. 0.4는 직관으로 찍은 값이 아니다. 2026년 10월 중순에 임계값을 0.20에서 0.60까지 0.05 간격으로 훑는 sweep을 돌려 정했다. 한 달 가까이 지난 11월 9일, 같은 sweep을 다시 돌렸다. 이 글은 그 재측정이 무엇을 알려줬고 무엇을 끝내 알려주지 못했는지에 관한 기록이다. 임계값을 한 번 정한 모든 시스템이 언젠가 같은 질문을 만난다.

    요약

    • 기각 게이트는 "최고 점수가 임계값 미만이면 전부 기각"하는 구조라, 저장소가 커질수록 무관한 질의도 문턱을 넘기 쉬워진다. 최고 점수는 후보가 많을수록 오르기 때문이다.
    • 10월 sweep에서 0.4는 관련 질의 7건 중 1건을 잘못 기각하고 무관 질의 28건 중 23건을 거절하는 지점이었다. 0.45는 오기각이 3건으로 늘었다.
    • 11월에 같은 라벨 후보를 현재 판정 모델로 다시 채점하자 곡선의 무릎이 0.40에서 약 0.50으로 옮겨 갔다. 그런데 0.40 자체는 오기각 0/7, 무관 거절 25/28로 10월보다 나았다.
    • 저장소를 현재 상태로 두고 다시 검색하는 방식은 버렸다. 라벨을 만든 뒤에 쌓인 기억이 상위를 차지해 저장소 크기 효과를 분리할 수 없었다.
    • 결론은 0.4 유지다. 다음 재측정은 저장소가 약 22,000건이 되거나 라벨이 늘었을 때 한다.

    임계값이 하나의 점인 이유

    기각 게이트의 구조부터 짚어야 한다. 검색은 두 겹으로 돈다. 첫 겹은 벡터 유사도 0.38 같은 고정 문턱으로 후보를 거른다. 이 겹은 "말할지"를 정하지 않고 후보만 정한다. 둘째 겹이 후보 상위 10개를 판정 모델에 읽혀 최고 점수를 낸다. 이 점수가 0.4 미만이면 후보가 아무리 많아도 빈 결과를 돌려준다.

    이런 구조는 거짓 경보를 막으려는 장치다. 에이전트에게 관련 없는 기억을 건네면 컨텍스트 토큰을 쓰고 잘못된 판단을 유도한다. 아무것도 안 주는 쪽이 낫다. 반대편에는 비용이 있다. 임계값을 높이면 진짜 관련 있는 기억도 같이 기각된다. 두 오류는 임계값 하나를 사이에 두고 맞교환된다. 그래서 임계값은 "좋은 값"이 아니라 "어느 오류를 얼마나 감수할지에 대한 합의"에 가깝다. 합의는 측정 위에서만 선다.

    10월 sweep은 라벨이 붙은 질의 집합 위에서 임계값마다 두 숫자를 기록했다. 관련 질의를 잘못 기각한 횟수(FRR)와 무관 질의를 제대로 거절한 횟수다. 0.35에서 0.40으로 올리면 오기각은 1/7로 그대로이고 무관 거절은 21건에서 23건으로 늘었다. 0.40에서 0.45로 더 올리면 오기각이 1건에서 3건으로 뛰었다. 얻는 것이 없는데 잃는 것만 늘어나는 구간이 0.40 바로 위에서 시작됐다. 0.4는 그 직전, 곡선이 꺾이기 전의 마지막 점이다.

    점수를 한 번만 계산해 캐시하고 임계값별 곡선은 그 점수에서 뽑게 만든 덕에 이 sweep은 쌌다. 처음 채점에는 212초가 걸렸고 캐시를 쓴 재실행은 2.2초였다. 곡선을 그리는 비용이 거의 없으니 다시 재는 일의 문턱도 낮아졌다. 임계값을 재측정하는 습관은 재측정 비용에서 갈린다.

    숫자는 왜 낡는가

    그런데 0.4가 정답이라는 보장은 라벨을 만든 그 시점의 저장소 위에서만 성립한다. 두 가지가 변한다.

    하나는 저장소 크기다. 최고 점수 하나로 말할지를 정하는 게이트는 사실상 다중 검정이다. 후보가 N개면 그중 어느 하나가 우연히 문턱을 넘을 확률은 N이 클수록 커진다. 최근 arXiv에 올라온 "The Price of Scale in Proactive Memory Recall"(2610.34507)이 이를 이론과 실험으로 보인다. 거짓 경보율을 α로 지키려면 항목당 거짓 양성률이 대략 −ln(1−α)/N 이어야 하는데, 고정된 코사인 임계값은 N이 커지는 동안 그대로다. 저자들이 보고한 숫자로는 N=8에서 5%로 맞춘 고정 임계값이 N=2048에서 87%가 된다. 판정 모델이 상위 후보를 읽는 방식(LLM judge)은 이보다 훨씬 덜 무너지지만 공짜는 아니다. 거짓 경보가 ln N에 대략 비례해 늘어난다고 한다. 다만 이 연구의 N은 2,048까지이고 영어 벤치마크이며, 쓰인 질의도 실제 사용자 메시지가 아니라 모델이 만든 단서다. Memento의 저장소는 이 범위의 6배를 넘는다. 논문 숫자를 그대로 옮기면 외삽이 되고, 이 글도 외삽을 근거로 삼지 않았다. 논문이 준 것은 "N이 두 배가 되면 다시 재라"는 주기의 직관이었다.

    다른 하나는 판정 모델이다. Jev 같은 모델은 점수의 분포가 버전과 입력에 따라 움직인다. 같은 문장을 같은 모델이 다음 달에도 같은 점수로 채점한다는 보장이 없다. 저장소는 불어나고 채점자는 달라지는데 임계값만 가만히 있다. 이 상태가 길어지면 처음 합의했던 오류 맞교환 비율이 슬그머니 다른 비율로 바뀐다.

    10월 18일 라벨 당시 저장소는 약 11,121건이었다. 11월 9일에는 13,296건이다. 20% 정도 커졌다. 운영 로그에서는 11월 들어 기각률이 24%에서 52%로 뛰었다. 이 숫자는 불안하다. 임계값이 너무 높아졌다는 신호일 수도, 질의 성격이 바뀌어 정당하게 더 많이 거절하는 것일 수도, 판정 모델이 흔들린 것일 수도 있다. 숫자 하나가 세 가설을 동시에 지지한다.

    재채점은 무엇을 보여줬나

    재측정 계획은 단순했다. 10월과 같은 라벨 질의, 같은 후보 기억을 현재의 Jev로 다시 채점해 곡선을 새로 그린다. 후보를 고정하면 저장소가 커진 효과는 빠지고 채점자가 바뀐 효과만 남는다. 라벨 팩 후보는 관련 7건과 무관 28건이었다.

    곡선의 무릎은 0.40에서 약 0.50으로 옮겨 갔다. 같은 질의를 같은 후보로 채점했는데 점수가 전반적으로 올랐다는 뜻이다. 판정 모델이 예전보다 후하게 점수를 준다고 읽을 수 있다. 이 사실 하나는 값지다. 채점자가 움직인다는 것이 숫자로 확인됐다.

    그렇다고 임계값을 0.50으로 올려야 하는 것은 아니었다. 현재 채점으로 0.40에서 읽은 성적은 오기각 0/7, 무관 거절 25/28이었다. 10월의 1/7, 23/28보다 둘 다 낫다. 판정 모델이 후하게 매겨 무릎이 올라갔어도 0.40에서 얻는 결과는 손상되지 않았다. 0.50으로 옮기면 관련 질의를 하나 더 놓치는 대신 무관 질의 두 건을 더 거절하는 정도의 차이가 난다. 표본이 관련 7건이라 이 차이를 믿을 근거가 없다. 7건 중 1건의 오기각률에 95% Wilson 구간을 씌우면 대략 3%에서 51%까지 펼쳐진다. 0건이어도 상한이 35% 안팎이다. 0.40과 0.50의 구간은 거의 완전히 겹친다. 표본 크기가 이 결정을 내리지 못하게 막고 있었다.

    버린 측정

    재채점만으로는 "무릎이 이동했다"까지만 알 수 있다. 저장소가 불어난 효과를 보려면 현재 저장소에서 질의를 다시 던져 봐야 한다. 그 측정도 시도했고 버렸다.

    이유는 간단하다. 라벨을 만든 뒤 두 주 동안 기억이 새로 쌓였다. 라벨 질의 중 상당수는 최근 작업과 닿아 있고, 그 최근 작업을 설명하는 새 기억이 이제 검색 상위를 차지했다. 정답으로 라벨된 기억이 아니라 새 기억이 1위에 오르면 "N이 커져서 정답이 밀렸다"와 "더 좋은 후보가 생겼다"를 구별할 수 없다. 두 현상이 같은 숫자로 나타난다. 측정이 비교하고자 한 변수와 다른 변수에 오염된 것이다. 이럴 때 숫자를 억지로 해석하느니 폐기하는 편이 정직하다.

    그래서 11월 기각률 상승의 원인도 가려내지 못했다. 질의가 바뀐 탓인지 저장소가 커진 탓인지 채점자가 변한 탓인지, 이번 재채점은 마지막 가설에만 증거를 주고 나머지 둘은 열어 둔 채 끝났다. 이 한계는 결과를 보고하는 문장 안에 그대로 적었다.

    결정과 다음 조건

    결정은 0.4 유지였다. 운영 환경 변수는 건드리지 않았다. 근거는 세 가지로 모인다. 현재 채점에서도 0.40의 성적이 10월보다 낫다. 0.50이 더 낫다는 증거는 표본 크기 때문에 없다. 임계값을 바꾸는 비용은 작지만 되돌리는 비용을 알 수 없고, 바꿔서 얻을 것은 측정되지 않았다. 측정되지 않은 이득을 위해 측정된 상태를 바꾸지 않는다.

    다음 재측정 조건은 둘로 정했다. 저장소가 약 22,000건, 곧 라벨 당시의 두 배가 되면 다시 돈다. 또는 라벨 질의를 늘리는 쪽이 먼저 오면 그때 돈다. 이번에 막혔던 지점도 고친다. 라벨을 만든 시점의 코퍼스를 고정해 두면 재검색 측정을 오염 없이 할 수 있다. 라벨 당시의 스냅샷에서 N만 인위적으로 늘려 가며 질의를 던지면 N 효과가 따로 보인다.

    남는 교훈

    임계값 하나를 다시 재는 일에서 일반화할 만한 것은 많지 않지만, 되풀이해 만나는 모양은 있다.

    첫째, 점수의 절댓값은 약속이 아니다. 채점자가 바뀌면 같은 입력의 점수가 바뀐다. 임계값을 숫자로만 기록하면 어느 채점자, 어느 저장소 크기에서 정한 숫자인지가 사라진다. 임계값 옆에 측정 당시의 N과 모델 버전을 함께 남겨 둬야 재측정을 언제 할지 판단할 수 있다.

    둘째, 표본이 작으면 방향은 보여도 크기는 못 정한다. 관련 질의 7건으로는 "대략 괜찮다"까지만 말할 수 있다. 이번 재측정이 성공한 부분은 곡선 위에서 무릎이 움직인다는 사실이고, 실패한 부분은 그 움직임이 결정을 바꿀 만큼 큰지 판별하는 일이었다. 두 가지를 같은 문단에서 섞어 보고하면 독자는 확신의 정도를 오해한다.

    셋째, 변수가 둘이면 측정도 둘이어야 한다. 채점자 변화와 저장소 증가는 서로 다른 실험으로만 분리된다. 하나의 실험에서 둘이 같이 변하면 어느 쪽 탓이라고 말할 수 없다. 이번에 한 변수만 고정한 재채점은 성공했고, 두 변수가 같이 움직인 재검색은 실패했다. 대조군을 세우는 것은 학술 논문만의 일이 아니다. 임계값 하나를 재는 데도 필요하다.

    넷째, 재측정을 하고도 아무것도 바꾸지 않는 결과는 실패가 아니다. 숫자가 그대로라는 사실, 그리고 그 사실이 얼마나 단단한지를 기록한 것이 산출물이다. 다음 사람은 이 기록을 읽고 0.4를 의심할 때와 믿을 때를 가려낼 수 있다.

    저장소가 22,000건에 이르면 같은 질문이 다시 온다. 그때는 라벨이 더 많고, 코퍼스가 고정돼 있고, 임계값 옆에 측정 조건이 적혀 있어야 한다.

    반응형
Designed by Tistory.