잘못된 자는 자가 없는 것보다 나쁘다: 당신이 신뢰하는 체크(Checks)를 검증하기
요약
결정론적 규칙(deterministic rules)이 확률론적 모델의 판단을 무시하고 권위를 가질 때 발생할 수 있는 위험성을 경고합니다. 잘못된 체크가 확신을 가지고 오답을 강제할 경우, 시스템의 신뢰성이 심각하게 훼손될 수 있음을 지적합니다.
핵심 포인트
- 결정론적 수치는 그라운드 트루스로 오인되기 쉬운 함정이 있음
- 잘못된 권위적 신호는 단순 노이즈보다 훨씬 위험함
- 규칙이 확률론적 판단을 거부(veto)하기 전 검증이 필수적임
- 결정론적 시스템의 오류는 감사(audit)하기 매우 어려움
내가 체크(check)가 누락된 것보다 더 두려워하게 된 실패 모드가 하나 있습니다.
어떤 것에 대한 체크가 없는 시스템은 적어도 그 사실에 대해 정직합니다. 공백은 눈에 보이고, 불확실성은 실재하며, 하류(downstream)의 모든 사람은 그 부분에 의존하지 말아야 한다는 것을 알고 있습니다. 하지만 동일한 것에 대해 잘못된 체크를 가진 시스템은 더 나쁘며, 이는 특정한 위험한 방식으로 더 나쁩니다. 그것은 확신을 가지고 대답합니다. 실제로 옳았던 신호들을 무시(overrule)해 버립니다. 그리고 이 모든 일을 아무도 의심하지 않는 하나의 배지를 달고 수행합니다. '그것은 결정론적(deterministic)이므로, 반드시 옳을 것이다.'
권위를 가진 잘못된 체크는 체크가 전혀 없는 것보다 더 나쁩니다. 체크가 없으면 정직하게 불확실한 상태로 남지만, 권위 있는 잘못된 체크는 당신을 확신에 찬 오답 상태로 만들며, 그것이 무시한 올바른 신호를 침묵시킵니다.
이 글의 두 동반 게시물은 모두 같은 방향을 지향합니다: 시스템의 가능한 많은 부분을 결정론적인 토대 위에 두는 것과 규칙이 결정할 수 있는 곳에서는 규칙이 결정하게 하는 것입니다. 나는 여전히 그 모든 말에 동의합니다. 하지만 두 표준 모두 내가 밝히고 싶은 조용한 가정을 내포하고 있습니다. 그들이 _규칙 우선(rules first)_을 말할 때, 특히 결정론적인 규칙이 확률론적인 판단자(probabilistic judge)를 _무시(overrule)_할 수 있다고 말할 때, 그들은 규칙이 옳다는 것을 가정합니다. 이 글은 규칙이 옳지 않을 때 어떤 일이 발생하는지, 그리고 규칙이 거부권(veto)을 행사하도록 허용하기 전에 어떻게 그것이 옳음을 보장할 수 있는지에 관한 것입니다.
아무도 확인하지 않는 배지
결정론적인 수치는 그라운드 트루스(ground truth)로 읽힙니다. 그것은 결정론적 수치의 큰 장점이자 숨겨진 함정입니다. 지표(metric)가 0이나 47 또는 false를 출력할 때, 그것은 의견처럼 들리지 않고 사실처럼 들리며, 우리는 그것에 사실로서의 지위를 부여합니다. 규칙 우선(rules-first) 아키텍처에서 우리는 더 나아갑니다. 우리는 결정론적 계층에 _확률론적 계층에 대한 권위(authority over the probabilistic one)_를 부여합니다. 규칙이 출력을 제어합니다. 규칙이 판단자를 거부(veto)합니다. 그것이 올바른 설계입니다. 판결을 환각(hallucinate)하는 유창한 모델은 파서(parser)가 해결할 수 있는 스키마 체크(schema check)를 무시해서는 안 됩니다.
하지만 그러한 권위가 오류의 비용에 어떤 영향을 미치는지 보십시오. 잘못된 권고 신호(advisory signal)는 노이즈(noise)일 뿐입니다. 즉, 무시할 수 있습니다. 하지만 잘못된 권위적(authoritative) 신호는 노이즈가 아닙니다. 그것은 스스로를 강제할 수 있는 힘을 가진 잘못된 정답입니다. 그리고 "이것은 틀릴 리 없다, 그저 산술적일 뿐이다"라는 조용한 확신, 즉 결정론(determinism)의 징표는 바로 그 누구도 이를 감사(audit)하지 못하게 만드는 원인이 됩니다. 당신이 가장 신뢰하는 체크(check)는, 그것이 결정론적이고 당신의 것이기 때문에, 역설적으로 당신이 그 오류를 잡아낼 준비가 가장 되어 있지 않은 체크입니다. 당신은 그것이 믿어지도록 만들었기 때문입니다.
거짓말을 한 지표
여기에 저에게 교훈을 준 사례가 있습니다.
모델이 섹션별로 초안을 작성하는 방식인, 생성된 장문 문서(long-form documents)를 위한 평가기(evaluator)를 상상해 보십시오. 품질 체크 항목 중 하나는 게으른 반복(lazy repetition)을 찾는 것입니다. 단순히 같은 단락을 수십 번 되풀이하는 문서는 실제로 내용을 전개하는 문서보다 나쁩니다. 측정하기에 합리적인 요소입니다. 구현 방식은 각 단락을 시그니처(signature), 즉 정규화된 텍스트의 해시(hash)로 변환하였고, 너무 많은 시그니처가 동일하게 나타나면 해당 문서에 플래그(flag)를 표시했습니다.
해시는 비용이 저렴했지만, 결함이 있었습니다. 해시 충돌(collision)이 발생하여, 실제로 다른 단락들이 때때로 동일한 시그니처를 생성했습니다. 또한 사소한 편집에도 취약하여, 두 단어가 바뀌거나 문장 순서가 바뀐 동일한 단락도 새로운 해시를 생성했습니다. 결과적으로 이 지표는 표면적인 형태가 바뀌었을 때 유사 문서를 놓치기도 하고, 때로는 내용이 실제로 다름에도 불구하고 동일하다고 잘못 판단하는 결과를 낳았습니다.
그 자체만 놓고 본다면, 버그가 있는 지표는 무시하는 법을 배울 수 있는 단순한 노이즈에 불과합니다. 하지만 이 지표에는 권위가 부여되어 있었습니다. 모델 판사(model judge)가 문서를 읽고 "이 섹션들은 서로 유사한 중복(near-duplicates)입니다"라고 올바르게 말했을 때, 반복 지표는 다음과 같이 불만을 _거부(veto)_할 수 있었습니다: "시그니처가 일치하지 않으므로, 판사가 환각(imagining)을 일으키고 있는 것입니다." 그리고 거부권이 승리했습니다. 점수는 깨끗하게 나왔습니다.
그 파이프라인이 해당 측면에서 무엇을 하고 있었는지 살펴보십시오. 그것은 자체 로직을 거꾸로 실행하고 있었습니다. 즉, _옳은 주관적 신호 (correct subjective signal)_를 _잘못된 결정론적 신호 (wrong deterministic signal)_로 무효화한 뒤, 그 문제에 대해 더 나은 점수를 보고하고 있었던 것입니다. 판사는 옳았습니다. 규칙이 판사를 침묵시킨 것입니다. 그리고 그 침묵이 결정론적 체크 (deterministic check)로부터 비롯되었기에, 그것은 확신이라는 낙인이 찍힌 채 전달되었고, 모든 부풀려진 점수는 마치 정당하게 얻은 것처럼 보였습니다. 산술적으로 이미 결정된 숫자를 다시 재심리하러 가는 사람은 아무도 없습니다. 그것이 바로 함정이 닫히는 순간입니다.
이 실패는 오류로서 나타나지 않았습니다. 그것은 _더 깨끗한 결과 (cleaner results)_의 형태로 나타났습니다. 이는 실패가 취할 수 있는 가장 위험한 형태입니다. 왜냐하면 깨끗한 결과는 모두가 바랐던 것이기 때문입니다.
왜 '틀리면서 권위적인 것'이 최악의 사분면인가
이를 2x2 매트릭스로 배치해 봅시다. 체크 (check)는 옳거나 틀리며, 권위를 갖거나 단순히 권고 사항일 뿐입니다. 이 중 세 개의 셀은 괜찮습니다. 권위를 가진 옳은 체크는 이 분야의 핵심 목적입니다. 권고 사항일 뿐인 옳은 체크는 약간의 낭비입니다. 권고 사항일 뿐인 틀린 체크는 무시해도 되는 소음입니다. 문제가 되는 것은 네 번째 셀인 틀리면서 권위적인 (wrong and authoritative) 경우입니다. 이것은 좋은 체크의 열등한 버전이 아니라 능동적인 부채(liability)이며, 체크가 아예 존재하지 않는 빈 셀보다 더 나쁩니다.
두 경우를 직접 비교해 보십시오. 반복 체크 (repetition check)가 없다면, 당신은 현재 반복을 측정할 수 없다는 사실을 알고 있습니다. 그 공백은 지도상에 표시되어 있으며, 반복적인 문서는 당신이 측정 도구를 갖추지 않은 다른 것들과 마찬가지로 아무런 언급 없이 통과됩니다. 하지만 판사의 결정을 거부하는 틀린 반복 체크가 있다면, 반복적인 문서가 통과될 뿐만 아니라, 이를 정확히 잡아낸 유일한 신호가 무효화되고, 최종 점수는 상승하며, 이 모든 과정이 누구도 의심하지 못하게 만드는 배지를 달고 진행됩니다. 누락된 체크는 당신이 알고 있는 사각지대를 초래할 뿐이지만, 틀린 체크는 당신이 이미 가지고 있던 정답을 앗아갈 뿐만 아니라, 더 이상 살펴볼 필요가 없다는 거짓된 확신까지 심어줍니다.
이것에서 제가 얻은 가장 유용한 습관은 바로 이것입니다: 지표(metric) 자체를 의심하세요. 결정론적 체크가 세심한 인간이나 역량 있는 모델이 할 만한 관찰을 반박할 때, 기본 비율(base rate)은 그 체크의 편에 있지 않습니다. 수동으로 만든 해시(hash)는 유창하게 읽는 사람이 문서에서 눈에 띄게 중복되는 내용에 대해
그 해결책은 첫 번째 규칙의 해결책과 궤를 같이합니다: 숫자가 신뢰를 얻기 전까지는 그 숫자를 믿지 마십시오. 주관적인 축(axis)의 경우, 이는 앵커(anchors, 기준점)와 비교하여 점수를 매기라는 것을 의미합니다. 즉, 무엇이 '좋음'이고 '우수함'인지 실제로 정의하는 라벨링된 참조 예시 세트를 활용하여, 자유로운 소수점 수치를 내뱉는 대신 새로운 출력물을 이들과 비교하여 순위를 매기는 것입니다. 그리고 판사(judge)가 인간과 일치한다는 사실을 믿기 전에, 인간들이 서로 얼마나 잘 일치하는지를 측정하십시오. 그 평가자 간 일치도 상한선(inter-rater ceiling)은 어떤 판사라도 정직하게 지향할 수 있는 최선의 점수입니다. 만약 두 명의 신중한 검토자가 특정 축에 대해 열 번 중 일곱 번만 일치한다면, 그보다 높은 확신에 찬 수치를 보고하는 판사는 인간을 능가하는 것이 아니라, 인간들이 정직하게 드러낸 불일치를 숨기고 있는 것입니다. 이러한 상한선 없이 판사의 수치를 보고하는 것은 영점(zero-point)이 없는 또 하나의 측정일 뿐입니다. 표시된 영점도 없고 고정된 단위도 없는 자는 엄격한 자가 아닙니다. 그것은 자를 들고 있는 확신에 찬 추측일 뿐입니다.
체크(check)가 권위를 얻는 방법
따라서 여기서의 규율은 "더 많은 체크를 추가하라"가 아닙니다. 그것은 더 좁고 더 까다롭습니다: 어떤 체크라도 출력을 제한하거나 다른 신호를 무시하도록 허용되기 전에, 그 체크가 침묵시키고자 하는 주장만큼이나 엄격하게 체크 자체를 검증하십시오. 실제로 이는 네 가지 단계로 이루어집니다.
-
두 번째의 독립적인 방식으로 재계산하십시오 (Recompute it a second, independent way). 다른 방법을 통해 동일한 수치를 도출하고 두 결과가 일치하는지 확인하십시오. 만약 반복 점수 (repetition score)를 해싱 (hashing)으로도 계산할 수 있고 직접 비교 (direct comparison)로도 계산할 수 있다면, 두 가지 모두 수행하십시오. 두 결과가 일치하지 않는다면 둘 중 하나에 버그 (bug)가 있는 것이며, 여러분은 이를 실제 운영 환경에서 미스터리하게 깨끗한 점수로 발견하는 것이 아니라 테스트 단계에서 찾아내야 합니다.
-
양방향으로 회귀 테스트 (Regression-test)를 수행하십시오. 반복적이라고 알고 있는 사례는 반드시 체크를 작동시켜야 하며, 다양하다고 알고 있는 사례는 작동시키지 않아야 합니다. 평소 작동하는 방향으로만 검증된 지표 (metric)는 절반만 테스트된 것이며, 테스트되지 않은 나머지 절반이 바로 잘못된 거부 (false veto)가 숨어 있는 곳입니다. 그리고 '틀렸다'는 것이 단지 버그만을 의미하지는 않습니다. 산술은 정확하지만 임계값 (threshold) 설정이 잘못된 체크 역시 동일한 방식으로 틀린 것이며, 동일하게 테스트되지 않은 방향에 숨어 있습니다. 따라서 여러분이 선택하는 사례들은 단순히 명확한 중간 지점만이 아니라 경계선 (boundary)을 고정할 수 있는 것이어야 합니다.
-
게이트 (gate) 역할을 하기 전에 섀도우 모드 (shadow)로 실행하십시오. 이를 운영 환경에 배치하여 판정 (verdicts)을 계산하게 하되, 아무것도 변경하지는 못하게 하십시오. 결국 무효화하게 될 신호 (signal)와 나란히 두고 대규모 환경에서 관찰하십시오. 잘못된 지표는 명백히 올바른 관측값들에 대해 지속적으로 거부 (vetoes)를 내뱉음으로써 여기서 스스로를 드러내며, 이는 단 하나의 실제 판정조차 내리기 _전_에 일어납니다. 섀도우 우선 (Shadow-first) 방식은 단순히 조심하기 위한 것이 아닙니다. 이는 자신 있게 틀린 체크가 피해를 전혀 입히지 않는 상태에서 스스로를 드러낼 수 있는 유일한 장소입니다.
-
거부 (veto)를 허가증이 아닌 하나의 주장 (claim)으로 취급하십시오. 규칙이 판정관 (judge)의 결정을 뒤집을 때, 그것은
여기에 명명할 가치가 있는 비대칭성 (asymmetry)이 존재하며, 이것이 바로 이러한 실패가 지속되는 근본적인 이유입니다. 우리는 이미 모델에 대해 이 네 가지를 모두 수행하고 있습니다. 우리는 플래그 (flag) 뒤에 새로운 모델을 배치하고, 판정관 (judge)이 인간과 일치할 때까지 유보하며, 확률적인 대상에 의존하기 전에 그것을 증명해야 한다고 가정합니다. 하지만 우리는 규칙 (rule)에 대해서는 거의 결코 동일한 의심을 확장하지 않는데, 그 이유는 규칙이 그것을 검증할 필요가 없다고 말하는 배지를 달고 있기 때문입니다. 그 비대칭성이 바로 버그 (bug)입니다. 결정론적 계층 (deterministic layer)은 가장 큰 권한을 부여받으면서도 가장 적은 검증을 받으며, 아무도 그것을 확인해야 할 것이라고 예상하지 않기 때문에 정확히 그 이유로 권한을 부여받습니다.
이 네 가지 아래에는 이미 훌륭한 팀들이 타인의 수치에 적용하고 있는 습관이 자리 잡고 있습니다. 결과가 너무 깔끔하거나, 너무 균일하거나, 의심스러울 정도로 편리하게 나올 때, 당신은 그것을 축하하지 않습니다. 당신은 그것을 반복하기 전에 소스 (source)를 대조하여 검증합니다. 이 섹션은 바로 그 동일한 회의론을 내부로 돌려, 당신이 게이트 (gate)나 거부권 (veto)을 부여한 그 어떤 지표 (metric)를 향해 가장 날카롭게 겨누는 것입니다. 외부 결과는 아첨할 수 있기 때문에 정밀 조사를 받습니다. 당신 자신의 권위 있는 체크 (checks)는 아첨할 뿐만 아니라 당신이 그것을 신뢰하기 때문에 더 많은 조사를 받을 자격이 있습니다.
대략적인 체크가 괜찮은 경우
모든 표준에는 경계가 필요하므로, 이 규칙의 경계는 다음과 같습니다: 위험은 오류가 아니라 권위입니다. 대략적이고 때로는 틀릴 수 있는 신호는 그것이 자문 (advisory) 역할에 머무는 한, 단순히 용인될 수 있는 수준을 넘어 유용합니다. 사람이 훑어볼 수 있도록 문서를 표시하는 휴리스틱 (heuristic), 리뷰 대기열을 분류하는 저렴한 지표 (metric), 잠재적인 문제로 주의를 유도하는 냄새 테스트 (smell test) 등은 각각 상당한 비율로 틀릴 수 있음에도 불구하고 여전히 제값을 합니다. 왜냐하면 잘못된 자문 신호의 비용은 단지 낭비된 시선이기 때문입니다.
어떤 지표가 권위(authority)를 얻는 순간, 즉 빌드(build)를 실패시키거나, 출력을 차단하거나, 항소(appeal) 없이 다른 신호를 무효화할 수 있는 순간에 선은 넘어집니다. 그 즉시 해당 지표의 오류에 대한 허용치는 0에 가깝게 떨어집니다. 왜냐하면 그 오류는 더 이상 단순히 한 번 훑어보는 비용에 그치지 않고, 해당 지표가 이제 우선순위를 갖게 된 올바른 신호를 희생시키는 비용을 발생시키기 때문입니다. 따라서 기준은 "모든 체크를 완벽하게 검증하라"가 아닙니다. 그렇게 하면 작업이 마비될 것입니다. 기준은 "검증의 수준을 그 권위에 맞추라"입니다. 권고용 신호(Advisory signals)는 거칠어도 유용할 수 있습니다. 거부권(veto)을 가진 모든 것은 판결을 바꾸기 전에, 양방향 모두에서 공개적으로 그 권위를 획득해야 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기