적대적 검증(Adversarial Verification)에 관한 6가지 실험 — 그리고 움직이지 않는 75%의 벽
요약
LLM이 에이전트의 결과물을 검토할 때 발생하는 75%의 미검출(False-negative) 한계를 분석한 연구입니다. 프롬프트 수정이나 다수결 투표와 같은 표준적인 방법으로는 모델의 체계적인 편향인 '벽'을 극복할 수 없음을 실험으로 증명합니다.
핵심 포인트
- LLM 리뷰어는 유효한 출력의 75%를 거부하는 체계적 한계(벽)를 가짐
- 다수결 투표는 노이즈를 줄일 뿐 모델의 근본적인 편향을 수정하지 못함
- 프롬프트 문구 교정은 특정 테스트 세트에서만 효과가 있는 착시를 일으킴
- 리뷰어의 역할은 경계를 긋는 것이며, 이 경계는 모델의 구조적 특성에 기인함
한 줄 요약: 리뷰어는 선을 긋는 메커니즘입니다. 모든 수정 사항은 그 선을 이동시키지만, 선을 없앨 수는 없습니다. 왜냐하면 선은 여러 방어 가능한 경계가 교차하는 3차원 표면 위에 존재하기 때문입니다. 따라서 75%의 미검출(False-negative) 벽은 움직이지 않으며, 실질적인 해결책은 그 벽을 옮기려는 시도를 멈추는 것입니다.
1. 벽 (The wall)
설정은 간단했습니다. LLM이 AI 에이전트가 생성한 결과물을 검토하고, 그것이 과업을 충족하는지 판단하게 했습니다. 출력물은 명백한 쓰레기(예: "나는 작은 오리입니다, 꽥꽥", "。」, TODO 플레이스홀더, 수집된 테스트 0개)와 정당한 작업물(연구 요약, 초안 문서, 통과된 테스트 실행, 코드, 번역)이 섞여 있었습니다. 첫 번째 라운드에서는 8개의 시나리오를 사용했고, 두 번째 라운드에서는 30개로 확장했습니다.
리뷰어가 모든 쓰레기를 잡아낼 만큼 날카로워지면, 미검출(False-negative, FN) 75%와 오검출(False-positive, FP) 0% 지점에 도달합니다. 즉, 유효한 출력물 4개 중 3개가 거부되는 것입니다. 이것이 바로 '벽'입니다. GLM-5.2와 deepseek-v4-flash 모두 이 벽에 부딪혔습니다. 더 작은 모델들(qwen3:0.5b는 약 25% FN, gemma3:4.3b는 약 50% FN)은 곡선의 더 앞부분에 위치합니다. 즉, 일부 쓰레기를 통과시키고 유효한 작업을 덜 거부합니다. 이 모델들이 더 나은 것이 아니라, 단지 동일한 곡선상의 다른 작동 지점(Operating point)에 있을 뿐입니다.
저는 이 벽에서 벗어나기 위해 세 가지 표준적인 시도를 했습니다.
동일한 프롬프트로 재실행 후 다수결 투표(Majority-vote). 시나리오당 N=10번 재실행했습니다. 유효한 호출이 충분했던 모든 시나리오에서 판결은 만장일치였습니다. 75%라는 수치는 무작위가 아니라 체계적(Systematic)입니다. 모델은 매번 동일한 잘못된 판결을 내립니다. 변하지 않는 판결은 투표로도 바꿀 수 없습니다.
서로 다른 프롬프트 간의 투표. 엄격한(Strict), 균형 잡힌(Balanced), 관대한(Lenient) 프롬프트가 각 시나리오를 판단했습니다. 분산된 투표 결과는 유용한 신호가 됩니다. 즉, 테스트 세트 자체가 논쟁의 여지가 있는 시나리오를 식별해 줍니다. 하지만 다수결 투표는 여전히 75%의 미검출(False-negative)에 도달합니다. 세 프롬프트 모두 동일한 편향(Bias) 방향을 공유하기 때문입니다. 왜 그럴까요? 그 답은 섹션 2에 있습니다. 모델의 경계는 안정적입니다. 프롬프트의 문구는 선을 표시할 뿐, 선을 이동시키지는 못합니다. 투표는 노이즈를 완화할 뿐, 편향을 수정하지는 않습니다.
프롬프트 문구 교정 (Calibrate the prompt wording). "균형 잡힌" 프롬프트 (v3)는 8개의 Phase Gate 시나리오에서 100%의 정확도를 기록했습니다. 표준적인 "프롬프트를 교정하라"는 조언이 효과가 있는 것처럼 보였습니다. 이를 30개의 시나리오로 확장했을 때, v3와 엄격한 v2는 모든 유효한 호출(valid call)에서 동일한 판결을 내렸습니다. 8개 시나리오에서의 개선은 테스트 세트 구성의 편향 (test-set composition bias) 때문이었습니다. 즉, 원래의 시나리오들이 우연히 v3의 관대함에 유리하게 작용했던 것입니다.
벽은 실재합니다. 그 어떤 표준적인 레버(levers)로도 벽을 움직일 수 없었습니다.
2. 벽이 움직이지 않는 이유
검토자 (Reviewer)란 선을 긋기 위한 메커니즘입니다. 그 선은 "충분한 출력 (sufficient output)"과 "불충분한 출력 (insufficient output)"을 구분하며, 그것이 검토자의 유일한 임무입니다. 형식적 검사 (Formal checks), LLM 판단, 프롬프트 문구 등은 모두 그 선을 어디에, 어떻게 그을 것인가에 대한 선택들입니다.
여기서 중요한 속성이 있습니다. 선이 더 날카로워질수록 더 많은 쓰레기를 잡아내고, 경계선에 있는 유효한 출력 (marginal-valid output)을 더 많이 거부합니다. 날카로움은 동일하지만, 두 가지 오류 유형에 미치는 영향은 정반대입니다. 선을 날카롭게 만들면 거짓 양성 (false positives)은 줄어들지만 거짓 음성 (false negatives)은 증가합니다. 선을 무디게 만들면 그 반대가 됩니다. 정밀도-재현율 트레이드오프 (precision-recall tradeoff)는 모델의 결함이 아닙니다. 이는 불완전한 식별력으로 선을 그을 때 발생하는 기하학적 특성입니다. 완벽한 검토자라면 이러한 트레이드오프가 없겠지만, 검토자들은 경계가 어디에 위치해야 하는지에 대한 의견을 가지고 있으며, 그 의견들은 노이즈가 섞여 있습니다.
여섯 가지 실험은 세 가지 다른 방식으로 경계선을 그었습니다. Phase Gate(단계 게이트)는 내용과 무관한 형식(file exists, exit code 0)에 경계를 두었습니다. 네 개의 쓰레기 데이터("I am a little duck", "。」, TODO placeholder, 수집된 테스트 0개)가 이를 통과했습니다. 거짓 양성(False positives): 50%. 적대적 검증(Adversarial verification)은 LLM을 사용하여 의미론(Semantics)에 경계를 두었습니다. 훨씬 더 날카로웠습니다. 모든 쓰레기 데이터를 잡아냈고(거짓 양성 → 0%), 동일한 날카로움으로 경계선에 걸쳐 있는 유효한 출력물 4개 중 3개를 거절했습니다(거짓 음성(False negatives) → 75%). 프롬프트 교정(Prompt calibration)은 문구(strict vs. balanced vs. lenient)를 변경하여 경계선을 이동시키려 시도했습니다. 30가지 시나리오에서 v2와 v3는 모든 유효한 호출에 대해 동일한 판결을 내렸습니다. 경계선은 움직이지 않았습니다. 문구는 경계선을 그리는 것이 아니라, 경계선에 라벨을 붙이는 것이기 때문입니다. 세 번째 시도는 대체(substitution) 접근 방식의 한계입니다. 모델이 이미 그어놓은 경계선을 옮기기 위해 단어를 사용하기 시작한다면, 그것은 더 이상 대체가 아닙니다. 그것은 장식(decorating)입니다.
그렇다면 왜 유효한 작업물을 태워버리지 않으면서 쓰레기를 잡아낼 수 있는 더 날카로운 경계선, 혹은 다른 종류의 경계선을 찾지 않는 걸까요? 그 이유는 경계선이 1차원 공간에 존재하지 않기 때문입니다.
"충분함(sufficient)"과 "불충분함(insufficient)" 사이의 경계는 최소한 세 가지 독립적인 질문에 달려 있습니다. 출력을 누가 소비하는가 — 액면 그대로 받아들이는 주니어 엔지니어인가, 아니면 엣지 케이스(edge cases)를 잡아낼 시니어 리뷰어인가? 어디에 배포되는가 — 다음 주에 버려질 프로토타입인가, 아니면 수년간 실행될 프로덕션(production)인가? 잘못되었을 때 무엇이 실패하는가 — 회의에서 당신을 당황하게 만들 데모인가, 아니면 서비스를 중단시키는 배포인가?
이 세 가지 차원은 완벽하게 직교(orthogonal)하지는 않지만, 대부분 독립적입니다. 이들은 서로 상관관계가 있습니다. 예를 들어 소비자 유형(consumer type)은 배포 맥락(deployment context)에 대한 약한 힌트를 제공하지만, 하나의 축으로 축소될 만큼 충분하지는 않습니다. 소비자를 안다고 해서 배포 방식이 결정되는 것은 아닙니다. 배포 방식을 안다고 해서 실패 비용(cost of failure)이 결정되는 것도 아닙니다. 따라서 경계는 1차원 공간의 한 점이 아니라, 3차원 공간의 하나의 곡면(surface)입니다. 그리고 대부분의 실제 출력값은 여러 방어 가능한 경계(defensible boundaries)가 교차하는 내부 어딘가에 위치합니다.
"이 출력이 충분한가?"라는 질문에는 단 하나의 정답이 없습니다. 왜냐하면 그 질문 자체가 불충분하게 정의(underspecified)되어 있기 때문입니다. 서로 다른 소비자, 맥락, 그리고 비용은 서로 다른 방어 가능한 답변을 만들어냅니다. 이러한 모호함(fuzziness)은 약한 모델의 특성이 아닙니다. 그것은 질문 자체의 특성입니다.
실질적인 결론은 이러한 기하학적 구조에서 도출됩니다. 만약 모호함이 질문에 내재되어 있다면, 어떤 모델도 이를 제거할 수 없습니다. 어떤 프롬프트(prompt)도 이를 제거할 수 없습니다. 어떤 투표 방식(voting scheme)도 이를 제거할 수 없습니다. 그들은 단지 동일한 곡면 위의 서로 다른 위치에 선을 그을 뿐입니다. 75%라는 수치가 네 가지 모델을 거치면서도 움직이지 않은 이유는, 이동할 곳이 없기 때문입니다. 곡면을 따라 운영 지점(operating point)을 이동하면 위양성(FP, False Positive)과 위음성(FN, False Negative) 사이의 트레이드오프(trade-off)가 발생할 뿐, 곡면 자체가 사라지지는 않습니다.
우리는 적절한 기술(trick)을 찾는 데 실패한 것이 아니었습니다. 우리는 존재하지 않는 기술을 찾고 있었던 것입니다.
3. 벽을 중심으로 설계하기 (Design around the wall)
그러니 벽을 중심으로 설계하십시오. 핵심은 "벽을 고치는 것"이 아닙니다. 핵심은 "벽을 고치려는 시도를 멈추는 것"이며, 그러한 수용이 설계를 변화시킵니다.
만약 그 75%가 구조적인 문제라면, 당신은 규칙(rules)이 잡아낼 수 있는 쓰레기(예: 키워드 매칭으로 "I am a little duck"을 잡아내거나, 길이 체크로 "。"를 잡아내는 것)에 LLM 호출(LLM calls)을 낭비하는 것을 멈추게 됩니다. 시스템적인 편향(systematic bias)을 투표(vote)로 해결하려는 시도를 멈추게 됩니다. 프롬프트 문구(prompt wording)를 미세 조정하며 모델의 경계(boundary)가 따라올 것이라고 가장하는 일을 멈추게 됩니다. 대신, 규칙이 작동하는 곳에는 규칙을 배치하고, 의미론(semantics)이 실제로 중요한 곳에는 미세 조정된 하나의 LLM을 배치하며, 3D 경계 표면(boundary surface)이 모호해지는 곳에는 인간을 배치합니다. 섹션 2의 차원 논증(dimension argument)에서 설명했듯이, 그곳이 바로 모델들이 의견을 달리하는 지점입니다. 실제 적용 시: 저렴한 결정론적 체크(deterministic checks)(길이, 키워드, 형식)가 명백한 쓰레기를 잡아내고, 미세 조정된 하나의 LLM 호출이 요구사항별 의미론적 잔차(semantic residual)를 판단하며, 판단이 갈리는 경우(split verdict) 인간에게 에스컬레이션(escalate)합니다. LLM은 규칙이 처리할 수 있는 케이스는 절대 보지 않습니다. 오직 규칙이 처리할 수 없는 것만을 봅니다.
그러고 나서 당신은 벽의 한쪽 면을 선택해야 합니다. 이것은 '할 일(TODO)'이 아닙니다. 이것은 나머지 설계가 구현하게 될 하중을 견디는 결정(load-bearing decision)입니다. 더 많은 거짓 양성(false positives)은 의심스러운 것으로 분류된 유효한 작업에 대해 검토자의 주의력을 더 많이 소모하게 만듭니다. 더 많은 거짓 음성(false negatives)은 더 많은 결함이 있는 작업이 배포됨을 의미합니다. 이 트레이드오프(tradeoff)는 구조적입니다. 유일한 실수는 당신이 선택할 필요가 없는 척하는 것입니다.
4. 계속해서 움직이는 환상
이 시리즈의 제목은 "에이전트 결정론의 환상(Agent Determinism Illusions)"입니다. 6가지 실험 전반에 걸쳐, 환상은 계속해서 움직였습니다.
그것은 출력 결정론(output determinism)에서 시작되었습니다. temp=0 설정이 일관성을 보장할 것으로 예상되었으나, 그렇지 않았습니다 (구조화된 작업에서 동일한 리스팅에 대해 20개의 서로 다른 버전이 생성됨). 이 환상이 포착되자, 다음은 검토 표준(review standards)으로 옮겨갔습니다. 형식적 검사(formal checks)가 품질을 보장할 것으로 예상되었으나, 그렇지 않았습니다 ("file exists"라는 검사가 "I am a little duck, quack quack"를 통과함). 다시 한번 포착되자, 환상은 솔루션 복잡성(solution complexity)으로 이동했습니다. 분명 멀티 모델 투표(multi-model voting), 보정된 프롬프트(calibrated prompts), 또는 계층화된 파이프라인(layered pipelines)이 도움이 될 것이라 믿었습니다. 하지만 그렇지 않았습니다, 정말로 그렇지 않았습니다. 각 계층은 동일한 벽을 그대로 물려받습니다. 세 번째로 포착되었을 때, 환상은 기술적 가정 속에 숨어 있는 것을 멈추고 한 단계 더 높은 곳으로 이동했습니다. 즉, 충분한 실험을 수행하면 깔끔한 결론이 나올 것이라는 메타적 기대(meta-expectation)로 이동한 것입니다. 실험들은 깔끔한 결론이 없다는 결론을 도출할 뿐입니다.
환상이 계속 움직이는 이유는 우리가 그것을 계속 쫓고 있기 때문입니다. 우리의 과업은 환상을 포착하는 것이 아닙니다. 우리의 과업은 환상이 가만히 서 있을 것이라는 기대를 멈추는 것입니다.
실험 코드: agent-determinism-illusions/scripts/phasegate-formalism-test.py, adversarial-verify-p1.py, consistency-test-p2.py, multi-perspective-vote-p3.py, prompt-calibration-p3b.py, p4-expanded-test.py__이전 글: LLM 품질 게이트의 대안: 결정론적 라우팅 + 샘플링__시리즈 시작: 나는 네 가지 실험을 통해 '결정론적 에이전트 루프' 주장을 테스트했습니다. 내 해결책을 포함하여 모두 실패했습니다."*전체 시리즈: [GitHub
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기