훈련 없이 확률값으로 에이전트를 검증하는 LLM-as-a-Verifier 분석
AI 에이전트가 복잡한 코딩이나 멀티스텝 추론 문제를 풀 때, 모델에게 여러 번 시도(Rollout)하게 한 뒤 가장 좋은 결과를 골라내는 테스트 타임 연산(Test-Time Compute) 방식이 핵심 패러다임으로 자리 잡았다.
하지만 여기서 가장 큰 병목이 발생한다. 바로 “생성된 여러 결과 중 무엇이 진짜 정답인지 어떻게 판별할 것인가”라는 질문과 검증(Verification)의 문제다.
스탠퍼드 대학교(Stanford), UC 버클리(UC Berkeley), 엔비디아 리서치(NVIDIA) 연구진이 공개한 LLM-as-a-Verifier [1]는 별도의 보상 모델 학습 없이, 일반 LLM의 로짓 확률 분포(Logprob Distribution)를 기댓값으로 계산하여 에이전트의 행동과 코드를 초정밀하게 채점하고 검증하는 새로운 프레임워크를 제안했다.
1. 기존 ’판사 LLM(LLM-as-a-Judge)’의 치명적 한계
그동안 에이전트의 답변을 평가할 때 가장 널리 쓰인 방식은 판사 LLM(LLM-as-a-Judge)이었다. 평가 모델에게 프롬프트를 주고 “1점에서 5점 사이로 점수를 매겨줘”라거나 “A와 B 중 더 좋은 것을 골라줘”라고 시키는 식이다.
하지만 실제 벤치마크와 실전 환경에서는 치명적인 한계가 드러났다.
| 평가 방식 | 판정 출력 예시 | 발생하는 핵심 문제 |
|---|---|---|
| 기존 판사 LLM (이산적 채점) |
후보 1: 5점 후보 2: 5점 후보 3: 5점 |
동점(Tie) 폭증: 모두 만점을 받아 미세한 코드 무결성 우열 분별 불가 |
| LLM-as-a-Verifier (연속 확률 채점) |
후보 1: 0.92400점 후보 2: 0.88150점 후보 3: 0.74210점 |
초정밀 서열화: 소수점 5자리 기댓값으로 최고 품질 후보 즉각 선별 |
- 이산적 점수와 동점(Tie) 폭증:
- 모델에게 1~5점이나 Yes/No 같은 이산적(Discrete) 텍스트를 출력하게 하면, 후보군 대부분에 최고점을 주거나 동일한 점수를 주어 미세한 품질 차이를 분별하지 못한다.
- 과정 보상 모델(PRM)의 훈련 부담:
- 단계별 채점을 위해 전용 보상 모델을 만들려면 수만 건의 사람 라벨링과 고비용 미세조정(Fine-tuning) 훈련이 강제된다.
- 노이즈와 비일관성:
- 단 한 번의 텍스트 생성으로 판결을 내리다 보니, 프롬프트의 미세한 순서나 단어 선택에 따라 평가 결과가 크게 흔들린다.
2. 핵심 발상: 텍스트 대신 ’로짓 확률의 기댓값’을 계산한다
LLM-as-a-Verifier의 접근법은 단순하면서도 강력하다. 추가 훈련(Training-free) 없이, 모델 내부의 점수 토큰 로짓 확률 분포 전체의 기댓값(Logit Expectation)을 수학적으로 계산하여 0.0000 ~ 1.0000 사이의 연속적인 실수 점수(Continuous Score)를 도출하는 것이다.
[ LLM-as-a-Verifier의 연속 확률 점수 계산 원리 ]
[ 검증 대상 코드 & 평가 기준 프롬프트 ]
│
▼
[ LLM Next-Token Logit 확률 분포 추출 ]
├─ 'Pass' 토큰 로짓: P(Pass) = 0.924
├─ 'Fail' 토큰 로짓: P(Fail) = 0.076
└─ 기타 토큰 로짓: P(Etc) = 0.000
│
▼
[ 수학적 기댓값 계산 (Expectation Scoring) ]
Score = 1.0 × 0.924 + 0.0 × 0.076 = 0.92400
텍스트로 “통과”를 찍고 끝내는 것이 아니라, 모델이 “통과라고 생각하는 확률의 깊이”를 소수점 단위로 측정하기 때문에 0.92400과 0.88150처럼 미세한 품질 차이도 명확하게 순위를 매길 수 있다.
3. 검증력을 극대화하는 3대 스케일링 축
연구진은 검증 성능을 끌어올리기 위해 다음 3가지 확장 축(Scaling Axes)을 결합했다.
| 확장 축 (Scaling Axis) | 적용 기법 | 달성 효과 |
|---|---|---|
| 1. 점수 정밀도 (Granularity) | 이산 텍스트 ➔ 연속 로짓 확률 기댓값 계산 | 후보군 간 미세 품질 분리도 극대화 |
| 2. 반복 평가 (Repetition) | N회 독립 반복 측정 후 평균화 | LLM 단일 판정의 노이즈와 분산 제거 |
| 3. 기준 분해 (Decomposition) | 모호한 거대 질문을 세부 하위 항목으로 분해 | 환각 방지 및 평가 정확도 비약적 상승 |
- 점수 정밀도 (Score Granularity):
- 텍스트 0/1 판정 대신 로짓 확률 기댓값을 사용하여 좋은 답과 나쁜 답 사이의 분리도(Separation)를 극대화한다.
- 반복 평가 (Repeated Evaluation):
- 검증을 여러 번 반복 시행하여 LLM 판단에서 발생할 수 있는 노이즈와 분산(Variance)을 통계적으로 제거한다.
- 기준 분해 (Criteria Decomposition):
- “이 코드가 완벽한가?” 같은 거대하고 모호한 질문 대신, 문제를 여러 개의 하위 질문으로 쪼갠다.
- 기준 1 — 사양(Specification): 궤적이 태스크 요구사항을 모두 충족했는가?
- 기준 2 — 출력(Output): 최종 출력 형식이 기대 결과와 일치하는가?
- 기준 3 — 오류(Errors): 로그와 툴 출력에 실패 신호가 없는가?
- “이 코드가 완벽한가?” 같은 거대하고 모호한 질문 대신, 문제를 여러 개의 하위 질문으로 쪼갠다.
4. 효율적인 탐색: 확률적 피벗 토너먼트
후보 답안이 N개 있을 때, 모든 후보를 서로 1:1로 전수 비교(Round-robin)하면 O(N²)의 막대한 API 호출 비용이 든다.
LLM-as-a-Verifier는 이를 해결하기 위해 확률적 피벗 토너먼트(Probabilistic Pivot Tournament) 알고리즘을 도입했다.
[ 기존 전수 비교: O(N²) ]
5개 후보 전수 비교 ➔ 총 10회 쌍대 비교 (후보가 20개면 190회!)
[ 확률적 피벗 토너먼트: O(Nk²) ]
1단계(링 패스): 무작위 해밀턴 순환으로 인접한 N쌍만 비교.
모든 후보가 A 자리와 B 자리에 한 번씩 등장해
검증기의 위치 편향이 상쇄된다.
2단계(피벗 선정): 링 패스 평균 선호도 상위 k개를 피벗으로 채택.
논문은 임의 앵커가 예산을 낭비한다고 명시한다.
3단계(피벗 라운드): 비피벗 후보를 피벗들과 비교해 순위를 확정.
➔ 비용은 대폭 줄이면서 전수 조사와 동일한 정확도 달성!
5. 실시간 진행도 추적 (Progress Tracking)
이 프레임워크의 또 다른 강력한 기능은 에이전트의 실시간 진행도 추적(Progress Tracking)이다.
에이전트가 터미널 명령을 내리거나 파일을 수정하는 매 스텝마다 실시간으로 밀집 보상(Dense Reward)을 계산한다.
import llm_verifier
problem = "utils.py의 버그를 수정하라."
steps = [
"문제 정의 및 에러 로그 확인", # 점수: 0.001
"utils.py 42번 라인 오타 수정", # 점수: 0.245
"단위 테스트 실행 (실패 확인)", # 점수: 0.312
"예외 처리 로직 추가 및 재작성", # 점수: 0.785
"모든 통합 테스트 통과 확인", # 점수: 0.999
]
result = llm_verifier.track(problem=problem, steps=steps)
print(result.scores) # [0.001, 0.245, 0.312, 0.785, 0.999]
에이전트가 엉뚱한 루프에 빠지거나 점수가 오히려 떨어지는 이상 행동을 보이면, 비싼 API 토큰을 낭비하기 전에 조기에 작업을 롤백하거나 중단하는 조기 종료(Early Exit)를 시킬 수 있다.
6. 벤치마크 결과: 검증기 하나로 3개 도메인 4개 벤치마크 SOTA
가장 인상적인 점은 도메인별 추가 학습 없이 동일한 검증 프레임워크 하나가 코딩·로보틱스·의료 4개 벤치마크에서 모두 최고 성능을 달성했다는 것이다.
| 벤치마크 | 후보 생성 | 단일 실행 (Pass@1) | LLM-as-a-Verifier | 오라클 상한 |
|---|---|---|---|---|
| Terminal-Bench V2 | GPT-5.5, N=5 | 83.1% | 86.5% | 92.1% |
| SWE-Bench Verified | Opus 4.5 / Gemini 3 Flash / MiniMax M2.5, N=3 | 76.1% | 78.2% | 84.4% |
| MedAgentBench (의료) | Claude Opus 4.8, N=5 | 70.2% | 73.3% | 75.0% |
| RoboRewardBench (로보틱스) | Qwen 3.6 35B 검증기 | 70.8% | 87.4% | — |
RoboRewardBench 행만 성격이 다르다. Pass@1이 아니라 궤적 선호 정확도이고, 단일 실행 자리의 70.8%는 LLM-as-a-Judge 기준선이다. 이 설정에서 학습된 보상 모델인 RoboReward-8B(81.4%)와 Robometer-4B(78.8%)를 모두 제쳤다.
여기서 짚어둘 것이 있다. 이 프레임워크에서 생성기와 검증기는 분리되어 있다. Terminal-Bench V2의 경우 GPT-5.5가 궤적 5개를 만들고 검증은 Gemini 2.5 Flash가 맡는다. 검증기가 생성기보다 가벼워도 된다는 점이 실용적 이점이다.
6-1. 한 가지 전제 조건
이 방법에는 전제가 하나 붙는다. 검증기 모델이 스코어링 토큰의 logprob을 노출해야 성립한다. 논문도 이를 첫 번째 한계로 든다. 토큰 단위 logprob을 반환하지 않는 폐쇄형 모델은 검증기 자리에 그대로 넣을 수 없다. 생성기는 무엇이든 상관없지만 검증기는 골라야 한다는 뜻이다.
7. 실전 활용법: 파이썬 라이브러리 및 Claude Code 연동
저자들이 공개했다고 밝힌 것은 Claude Code와 Codex용 확장(TurboAgent)이다. 논문에는 설치 명령이나 파이썬 API 시그니처가 실려 있지 않으므로, 아래 코드는 논문에 명시된 API가 아니라 개념 설명용 의사코드다. 실제 사용법은 저장소 문서를 따르는 편이 정확하다.
1) 라이브러리 설치
pip install llm-verifier
2) Best-of-N 최적 후보 선별 코드
import llm_verifier
problem = "문자열을 뒤집는 파이썬 함수를 작성하라."
candidates = [
"def rev(s): return s[::-1]",
"def rev(s): return s",
"def rev(s): return ''.join(sorted(s))",
]
result = llm_verifier.select(
problem=problem,
candidates=candidates,
criteria={"Correctness": "주어진 문자열을 올바르게 뒤집는가?"},
model="deepseek-v4-flash", # 또는 gemini-2.5-flash
pivots=2, # 토너먼트 피벗 수
)
print("최고의 코드 인덱스:", result.index) # 0
print("후보별 점수:", result.scores) # [0.73104, 0.38446, 0.38449]
3) Claude Code 플러그인 (TurboAgent)
TurboAgent 저장소를 통해 Claude Code 터미널 환경에 연결하면, 에이전트가 복잡한 리팩토링이나 버그 수정을 수행할 때 백그라운드에서 실시간으로 궤적을 검증하며 최적의 수정안을 자동으로 채택한다.
8. 요약 및 용어 정리
| 용어 | 쉬운 설명 |
|---|---|
| LLM-as-a-Verifier | 별도 학습 없이 LLM의 로짓 확률 기댓값을 계산해 에이전트 출력을 초정밀 검증하는 오픈소스 프레임워크 |
| 연속 점수 (Continuous Scoring) | 텍스트 대신 로짓 확률 분포를 기댓값으로 환산하여 0.0~1.0 사이의 실수로 산출하는 정밀 채점 기법 |
| 테스트 타임 연산 (Test-Time Compute) | 학습 단계가 아닌 실제 추론 단계에서 여러 후보를 생성하고 검증하여 정확도를 비약적으로 높이는 기법 |
| 확률적 피벗 토너먼트 | O(N²) 전수 비교 대신 피벗 노드를 활용해 O(Nk) 비용으로 최적 후보를 가려내는 정렬 알고리즘 |
| 밀집 보상 (Dense Reward) | 최종 결과뿐만 아니라 에이전트가 수행하는 중간 스텝마다 실시간으로 주어지는 연속적인 피드백 점수 |
한 문장 요약: LLM-as-a-Verifier는 무거운 전용 보상 모델을 훈련시킬 필요 없이, 일반 LLM의 로짓 확률 기댓값을 통해 에이전트의 작업물과 진행도를 초정밀하게 검증해 내는 가장 실용적인 테스트 타임 확장 기술이다.
참고 문헌
- [1] Kwok, J., Li, S., Atreya, P., Liu, Y., Jiang, Y., Finn, C., Pavone, M., Stoica, I., & Mirhoseini, A. (2026). LLM-as-a-Verifier: A General-Purpose Verification Framework. arXiv:2607.05391
- [2] GitHub Repository. llm-as-a-verifier/llm-as-a-verifier
- [3] Official Project Website. llm-as-a-verifier.com