3가지 모델을 AI 에이전트 품질 검사기로 테스트해 보았습니다: 모델이 강력할수록 더 유효한 작업을 더 많이 거부합니다
요약
AI 에이전트의 출력 품질을 검증하기 위해 다양한 크기의 모델을 활용한 실험 결과를 분석합니다. 모델의 성능이 향상될수록 쓰레기 콘텐츠를 잡아내는 능력은 좋아지지만, 유효한 작업까지 거부하는 트레이드오프가 발생함을 보여줍니다.
핵심 포인트
- 모델이 강력할수록 유효한 작업을 거부하는 경향이 있음
- 단순 단계 게이트(Phase gates)는 쓰레기 콘텐츠에 대해 50%의 위양성률을 보임
- 모델 크기 증가가 위양성률을 낮추지만 완벽한 해결책은 아님
- 에이전트 설계 시 모델 성능과 검사 정확도 간의 트레이드오프 고려 필요
이전 기사(I tested the 'deterministic agent loop' claims with four experiments. They all failed — including my own fix. - DEV Community)에서, 저는 인기 있는 프로덕션 에이전트(production-agent) 기사들이 주장하는 세 가지 "결정론(determinism)" 기둥을 테스트했습니다:
- **의미론적 연속성 (semantic continuity)**의 대리 지표로서의 어휘적 중첩 (Lexical overlap) — 50%의 오분류 발생.
- 출력 일관성을 위한 Temperature 0 — 개방형 출력의 일관성이 70%에 불과함.
- "객관적인 작업 완료"로서의 단계 게이트 (Phase gates) — 쓰레기 콘텐츠(garbage content)에 대해 50%의 거짓 양성(false-positive) 비율 발생.
그리고 저는 겸손함을 담은 네 번째 실험으로 마무리했습니다. 제가 제안했던 "업그레이드" — 어휘적 중첩 임계값을 임베딩 모델 (embedding model)로 교체하는 것 — 역시 실패했습니다. Qwen3-embedding은 유의어와 반의어를 구분하지 못했습니다 (코사인 차이(cosine diff): 0.026).
제가 내린 솔직한 결론은 다음과 같습니다: 현재의 스택 하에서는, 이 문제에 대한 깔끔한 엔지니어링 해결책이 없습니다.
하지만 제가 받은 가장 흔한 반박은 이것이었습니다: "당신은 qwen3:0.5b를 사용했습니다 — 0.5B 파라미터 모델 말입니다. 당연히 실패하죠. 진짜 모델을 써보세요."
일리가 있습니다. 그래서 저는 품질 검사기로 세 가지 계층의 모델을 사용하여, 동일한 8가지 시나리오와 동일한 프롬프트 템플릿(prompt template)으로 테스트를 진행했습니다.
제가 발견한 결과는 결론을 약화시키는 것이 아니라, 오히려 더 미묘하게(nuanced) 만들었습니다. 데이터는 "그저 더 강력한 모델을 사용하라"는 말로는 해결되지 않는 트레이드오프(tradeoff)를 보여줍니다.
실험 설계
실험 3(단계 게이트 테스트)과 동일한 8가지 시나리오:
- 4가지 유효한 출력 (valid outputs) — 조사 브리프(research brief), 초안, 챕터 파일, 테스트 로그 (42개 통과)
- 4가지 쓰레기 출력 (garbage outputs) — "I am a little duck, quack quack", 마침표(.), "TODO", "0 passed (no tests collected), exit 0"
단계 게이트(문자열 수준의 체크)는 8개 모두를 통과시킵니다 — 설계상 쓰레기 콘텐츠에 대해 50%의 거짓 양성(false-positive) 비율을 가집니다.
질문은 이것입니다: 쓰레기를 잡아내기 위해 그 위에 LLM 품질 검사기를 추가할 수 있을까요? 그리고 그 비용은 얼마일까요?
저는 실험 2에서 기록된 Temperature 0 샘플링 노이즈를 완화하기 위해, 각 시나리오를 모델당 3회씩 실행했습니다 (다수결 투표 방식).
3가지 모델 계층 측정 결과
| 검사기 (Inspector) | 위양성률 (False-positive rate) | 유효한 작업의 오거부 (False rejection of valid work) | 투표 불안정성 (Vote instability) |
|---|---|---|---|
| (없음, 단계 게이트만 적용) | 50% | 0% | — |
| ... |
결과 1: 모델 크기가 커질수록 위양성률이 단조 감소함
qwen3와 gemma3 모두 25%라는 동일한 한계치에 도달했습니다. 두 모델 모두 동일한 사례인 G4에서 실패했습니다 (이는 실험 4의 임베딩 모델인 qwen3-embedding이 아니라, 채팅 모델인 qwen3:0.5b입니다):
작업(Task): 테스트 스크립트를 실행하고, 테스트가 실제로 통과하는지 확인하십시오*_
출력(Output):exit 0, 0 passed (no tests collected)
두 소형 모델 모두 "exit 0"와 "passed"를 보고 통과시킵니다. 반면 GLM-5.2는 의미론(Semantics)을 이해합니다: "No tests collected(수집된 테스트 없음)"는 실제로 실행된 테스트가 없음을 의미합니다.
이는 명백한 모델 크기에 따른 불연속성(Discontinuity)입니다. 약한 모델들은 표면적인 "passed" 신호에 속는 반면, 강력한 모델은 실제 의미를 읽어냅니다.
결과 2: 대가는 오거부(False rejections)의 급증
GLM-5.2는 위양성률(False-positive rate)을 0%로 떨어뜨립니다. 해결책처럼 들립니다.
하지만 이 모델은 완벽하게 유효한 출력 4개 중 3개를 거부했습니다.
- 연구 요약본 (유효함, 내용 포함됨) → 거부됨
- 초안 (유효함, 약 2,000단어) → 거부됨
- 챕터 파일 (유효함, 내용 포함됨) → 거부됨
- 테스트 로그 (유효함, "42 passed") → 통과됨
명시적인 통과 횟수가 포함된 테스트 로그만이 통과됩니다. 그 외의 모든 것은 "불충분함(insufficient)"으로 분류됩니다.
이것은 버그가 아닙니다. 강력한 모델이 단순히 _지시 사항을 엄격하게 따르고 있는 것_입니다. 즉, 출력이 작업 요구 사항을 충족한다는 것을 명확하게 입증해야 합니다. 스케치나 파편처럼 읽히는 모든 것은 차단됩니다.
실제로 일어나고 있는 일: 정밀도-재현율 트레이드오프 (Precision-recall tradeoff)
두 열을 함께 놓고 보면 패턴이 명확해집니다:
- 약한 모델: 쓰레기를 통과시키지만 (높은 위양성률), 정당한 작업을 과도하게 거부하지는 않음
- 강력한 모델: 모든 쓰레기를 잡아내지만 (위양성률 0%), 정당한 작업의 대부분도 거부함
이것은 해결책이 아니라 **정밀도-재현율 트레이드오프 (precision-recall tradeoff)**입니다. 모델이 의미론적 (semantic) 문제를 "해결"하는 것이 아니라, _곡선 위의 한 지점을 선택하는 것_입니다. 모든 것을 잡아내는 품질 게이트 (quality gate)는 모든 것을 거부함으로써 아주 쉽게 0%의 위양성률 (false positive rate)을 달성할 수 있습니다.
"0% 위양성률"이라는 신기루
이는 제가 이전에 썼던 내용 중 하나를 설명해 줍니다. 저는 이전에 "DeepSeek가 이 테스트에서 0%의 위양성률을 달성했다"라는 메모를 남겼고, 문제가 해결되었다고 결론지었습니다.
저는 잘못된 지표를 보고 있었습니다.
0%의 위양성률은 훌륭해 보입니다. 하지만 위거부율 (false-rejection rate)을 함께 살펴보지 않는다면, 이는 원래 기사의 오류와 정확히 대칭되는 상황입니다. 원래 기사는 "파일이 존재함"을 "작업 완료"로 취급했고, 저는 "쓰레기가 통과하지 않음"을 "품질 게이트가 작동함"으로 취급했습니다.
품질 게이트의 역할은 단순히 쓰레기를 막는 것이 아니라, 좋은 작업이 유지되도록 하는 것입니다. "0%"라는 숫자는 강력한 모델이 유효한 출력의 75%를 거부하고 있다는 사실을 가리고 있었습니다.
결론에 대한 솔직한 수정
제 이전 글에서는 다음과 같이 말했습니다: 품질 검사기는 단지 문제를 한 단계 위로 옮길 뿐이다.
그것은 너무 가혹한 표현이었습니다. 데이터에 따르면 검사기는 강력한 모델을 사용할 경우 위양성률을 50%에서 0%로 실제로 줄여줍니다. 하지만 이것은 해결책이 아니라 **비용 전이 (cost transfer)**입니다. 쓰레기를 잡아낼 때마다 한 번의 위거부 (false rejection) 비용이 발생합니다.
이것이 작동하는 방식에 대한 더 정확한 모델은 다음과 같습니다:
단계별 게이트 (Phase gate, 무료, 50% 유출) → LLM 품질 게이트 (위양성률을 줄이지만, 위거부를 유발함) → 인간 검토 (위거부를 잡아냄)
어떤 단일 계층도 문제를 "해결"하지 못합니다. 각 계층은 남아있는 불확실성을 다음 계층으로 전이시킵니다. 정직한 설계는 결정론적 보장 (deterministic guarantees)의 스택이 아니라, **위험 전이의 사슬 (chain of risk transfer)**입니다.
그리고 실질적인 시사점은 다음과 같습니다: 만약 LLM 품질 게이트를 추가한다면, 위거부를 검토하기 위한 인간의 시간을 예산에 반드시 포함해야 합니다. 모델이 강력할수록, 오보로 판명되는 플래그 (flags)에 대해 더 많은 비용을 지불하게 될 것입니다.
이것이 프로덕션에 의미하는 바
출력 검증 (output verification) 기능이 포함된 에이전트 루프 (agent loop)를 구축하고 있다면:
-
단계별 게이트(Phase gates)는 콘텐츠에 대해 아무것도 잡아내지 못합니다. 비용은 저렴하지만, 품질 신호(quality signal)를 전혀 얻을 수 없습니다. 50% 이상의 쓰레기 데이터가 그대로 통과될 것을 예상하십시오.
-
**소형 모델 품질 게이트(≤4B)**는 명백한 쓰레기는 일부 잡아내지만, 미묘한 사례는 놓칩니다. 오탐률(false-positive rate)은 50%에서 약 25%로 떨어지지만, 실제 작업의 약 50%를 잘못 거부(false-reject)하게 됩니다.
-
**강력한 모델 품질 게이트(API-grade)**는 소형 모델이 놓치는 엣지 케이스(edge cases)를 포함하여 모든 것을 잡아냅니다. 오탐률(false-positive rate)은 0%에 도달합니다. 하지만 실제 작업의 약 75%를 잘못 거부(false-reject)하게 될 것입니다. 이에 맞춰 인간 검토(human review) 예산을 책정하십시오.
-
중요한 지표는 단일 열이 아니라 전체 혼동 행렬(confusion matrix)입니다. 오거부율(false-rejection rates)을 보여주지 않으면서 "오탐률 0%"를 광고하는 사람은, 자신들이 해결하겠다고 주장하는 것과 똑같은 단순화를 팔고 있는 것입니다.
재현 가능한 스크립트 (Reproducible script)
실험 스크립트는 다중 모델 비교를 위해 **매개변수화(parameterized)**되어 있습니다:
Repo: github.com/zxpmail/blog → agent-determinism-illusions/scripts → harness-verify-test.py
모델을 전환하려면 환경 변수를 설정하십시오:
VERIFY_MODEL=qwen3:0.5b(로컬 Ollama, 기본값)VERIFY_MODEL=gemma3:latest(로컬 Ollama)VERIFY_MODEL=glm-5.2와VERIFY_BASE_URL및VERIFY_API_KEY사용 (API)
각 모델은 동일한 8가지 시나리오 × N회 반복(기본값 3회, 다수결 투표)을 실행합니다. 본인만의 유효한 샘플과 쓰레기 샘플을 교체하여 사용하십시오.
저는 인기 있는 장르의 결정론(determinism) 주장을 측정하기 위해 첫 번째 글을 썼습니다. 두 번째 글은 저 자신이 똑같은 종류의 단순화된 해결책을 제안하는 것을 잡기 위해 썼습니다. 이 세 번째 글은 그 둘 모두를 바로잡습니다. 진실은 "해결책이 없다"거나 "그저 더 큰 모델을 사용하라"는 것이 아닙니다. 진실은 "트레이드오프(tradeoff)가 존재하며, 어디에서 손해를 볼지 선택해야 한다"는 것입니다.
같은 자로, 한 번 더 측정해 보았습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기