OpenDeepThink: Parallel Reasoning via Bradley--Terry Aggregation
TL;DR Highlight
LLM 여러 답안을 토너먼트 방식으로 비교·진화시켜 외부 검증기 없이도 경쟁 프로그래밍 Elo를 +405 올린 프레임워크
Who Should Read
LLM 추론 성능을 높이려는 ML 엔지니어나 AI 연구자. 특히 Best-of-N 샘플링에서 '어떤 답이 가장 좋은지 고르는 문제'를 해결하려는 사람.
Core Mechanics
- 기존 추론 스케일링은 하나의 체인을 깊게 늘리는 방식(depth)인데, OpenDeepThink는 여러 후보를 병렬로 생성하고 진화시키는 breadth 방식을 택함.
- 핵심 아이디어는 Bradley–Terry 모델(여러 1:1 비교 결과를 전체 랭킹으로 변환하는 통계 기법)로 후보들을 서열화해서, 외부 정답 검증기 없이도 가장 좋은 답을 고를 수 있음.
- LLM이 두 답을 직접 비교(pairwise)하면 개별 점수 매기기(pointwise)보다 훨씬 정확함 — 500쌍 진단 테스트에서 pairwise 86% vs pointwise 59% 정확도.
- 한 세대마다 하위 25%는 버리고, 상위 25%는 엘리트로 보존, 나머지 75%는 비교 과정에서 나온 자연어 피드백으로 변이(mutation)시키는 진화 루프를 돌림.
- 변이에서 중요한 건 '뭐가 틀렸는지' 네거티브 피드백임. 포지티브 피드백만 주는 건 피드백 없는 것과 성능 차이가 거의 없고, 네거티브 피드백이 실질적인 개선을 이끎.
- HLE(다분야 어려운 문제) 벤치마크에서는 수학/물리 같은 객관적 도메인은 성능이 오르지만, 인문학/사회과학 같은 주관적 도메인에서는 오히려 성능이 떨어짐 — pairwise 판단 신뢰도가 프레임워크 효과를 결정함.
Evidence
- Gemini 3.1 Pro 기준, 단순 랜덤 샘플링 대비 Codeforces Elo +405점 향상 (2851 → 3256). 이는 Gemini 3 Deep Think가 Gemini 3.1 Pro 대비 달성한 +411과 비슷한 수준.
- Hard 난이도 문제(64개)에서 pass@1이 11% → 36%로 상승, BT top-1은 23% → 50%로 상승. 95% 신뢰구간 기준 +16~+39pp 향상.
- pairwise 판단 정확도 86.2% vs pointwise 59.2% (500쌍 진단, NOI-119 문제 기반). Pointwise는 정답(AC) 식별은 96.4%로 높지만 오답(WA) 식별이 62.2%에 불과해 선택 품질이 낮음.
- Self-Refine 6라운드 + pointwise 투표 8회(총 300 API 호출) 대비, OpenDeepThink(285 호출)는 Hard 문제 top-1 정확도 50% vs 41%로 9pp 우위. 비슷한 예산에서 선택 메커니즘 차이만으로 발생한 순수 선택 신호.
How to Apply
- Best-of-N 샘플링을 쓰고 있는데 '어떤 답이 최선인지' 고르기 어렵다면, 각 후보 쌍을 LLM에게 비교시키고 Bradley–Terry로 랭킹을 뽑아 top-1을 제출하는 방식으로 바꿔볼 수 있음. 외부 검증기 없이도 단순 다수결보다 훨씬 나은 선택이 가능함.
- 코드 생성이나 수학 문제 풀이 파이프라인에서 여러 후보를 생성한 뒤, 논문 제공 프롬프트(pairwise comparison + mutation 템플릿)를 그대로 사용해 진화 루프를 구현할 수 있음. GitHub 코드가 공개되어 있어 바로 적용 가능.
- 주관적 판단이 필요한 도메인(창작, 요약 등)에는 이 방법을 쓰면 오히려 성능이 떨어질 수 있음. 객관적으로 정답이 있는 도메인(코딩, 수학, 과학)에만 적용하고, 적용 전 pairwise 판단 정확도를 먼저 검증하는 게 좋음.
Code Example
# 논문에서 제공한 pairwise comparison 프롬프트 템플릿
comparison_prompt = """
You are a competitive programming expert.
## Problem Statement
{problem}
## Solution A
```cpp
{code_a}
```
## Solution B
```cpp
{code_b}
```
Which solution is more likely to receive an Accepted verdict from an online judge ---
meaning it produces correct output within the time and memory limits for all valid inputs?
If both solutions appear incorrect (wrong answer, TLE, or other issues), choose the
one that requires fewer modifications to become Accepted.
If they are fundamentally identical or equally likely to be Accepted, output TIE.
Respond with a JSON object and nothing else, in exactly this format:
{
"feedback_a": "one sentence on Solution A's key strength or critical flaw",
"feedback_b": "one sentence on Solution B's key strength or critical flaw",
"winner": "A or B or TIE"
}
"""
# mutation 프롬프트 (네거티브 피드백 포함)
mutation_prompt = """
## Problem
{problem}
## Solution
```cpp
{code}
```
## Pairwise Feedback
This solution was compared against other solutions multiple times:
### Wins (this solution was judged better):
- {wins_feedback}
### Losses (this solution was judged worse):
- {losses_feedback}
## Task
Write a solution that maximizes the probability of Accepted.
You may refine the existing solution or take a different approach
if the current one is fundamentally flawed.
Think briefly, then output your final solution as a single ```cpp ... ``` block.
"""
# Bradley-Terry 점수 계산 (scipy 사용)
from scipy.optimize import minimize
import numpy as np
def fit_bradley_terry(comparisons, n_candidates, lambda_reg=0.01):
"""
comparisons: list of (i, j, outcome) where outcome=1 if i wins, 0 if j wins, 0.5 if tie
n_candidates: number of candidates
returns: score vector s of shape (n_candidates,)
"""
def neg_log_likelihood(s):
loss = 0
for i, j, outcome in comparisons:
diff = s[i] - s[j]
log_prob = outcome * diff - np.log(1 + np.exp(diff))
loss -= log_prob
loss += 0.5 * lambda_reg * np.sum(s**2) # L2 regularization
return loss
s0 = np.zeros(n_candidates)
result = minimize(neg_log_likelihood, s0, method='L-BFGS-B')
return result.x
# 사용 예시
# comparisons = [(0, 1, 1), (1, 2, 0.5), (0, 2, 1)] # (후보i, 후보j, 결과)
# scores = fit_bradley_terry(comparisons, n_candidates=3)
# best_candidate_idx = np.argmax(scores)Terminology
Related Papers
Show HN: Forge – Guardrails take an 8B model from 53% to 99% on agentic tasks
작은 로컬 LLM(8B)에 guardrails(구조적 안전망)를 씌워 멀티스텝 에이전트 작업 성공률을 53%에서 99%까지 올린 Python 프레임워크 Forge 공개. 모델 자체는 건드리지 않고 실행 환경을 강화하는 접근법이라 주목받고 있음.
Mini Shai-Hulud Strikes Again: 314 npm Packages Compromised
2026년 5월 19일, npm 계정 하나가 탈취되어 22분 만에 637개 악성 버전이 배포됐고, echarts-for-react·size-sensor 등 월 수백만 다운로드 패키지들이 감염되어 AWS 자격증명·SSH 키·AI 코딩 에이전트까지 탈취하는 정교한 공급망 공격이 발생했다.
Show HN: Semble – Code search for agents that uses 98% fewer tokens than grep
AI 에이전트가 코드베이스를 탐색할 때 grep+파일 읽기 대신 자연어로 관련 코드 스니펫만 뽑아주는 검색 라이브러리로, 토큰 사용량을 약 98% 줄여준다.
Zerostack – A Unix-inspired coding agent written in pure Rust
Claude Code나 OpenCode처럼 메모리를 수 GB씩 잡아먹는 코딩 에이전트 대신, Rust로 만든 초경량(~8MB RAM) 코딩 에이전트 Zerostack이 공개됐다. 저사양 환경에서도 쓸 수 있고, 직접 만든 유사 프로젝트들과 비교 토론이 활발하게 이뤄지고 있다.
Δ-Mem: Efficient Online Memory for Large Language Models
LLM의 컨텍스트 윈도우를 늘리지 않고도 과거 정보를 효율적으로 기억할 수 있는 경량 메모리 모듈 δ-mem을 제안한 논문. 모델 자체를 바꾸거나 파인튜닝 없이 기존 LLM에 붙여서 장기 기억 성능을 높일 수 있어 에이전트 시스템 개발자에게 관심을 끌고 있다.
How Claude Code works in large codebases
Anthropic이 수백만 줄짜리 모노레포, 레거시 시스템, 수십 개 마이크로서비스 환경에서 Claude Code를 운영한 패턴을 정리한 글이다. RAG 방식 대신 에이전틱 검색을 쓰는 이유와 실제 현장의 한계를 함께 확인할 수 있다.
Related Resources
Original Abstract (Expand)
Test-time compute scaling is a primary axis for improving LLM reasoning. Existing methods primarily scale depth by extending a single reasoning trace. Scaling breadth by sampling multiple candidates in parallel is straightforward, but introduces a selection bottleneck: choosing the best candidate without a ground-truth verifier, since pointwise LLM judging is noisy and biased. To address this, we introduce OpenDeepThink, a population-based test-time compute framework that selects via pairwise Bradley-Terry comparison. Each generation, the LLM judges random pairs of candidates and aggregates votes via Bradley-Terry into a global ranking; top-ranked candidates are preserved and the top three quarters are mutated using the natural-language critiques produced during comparison; the bottom quarter is discarded. OpenDeepThink raises Gemini 3.1 Pro's effective Codeforces Elo by +405 points in eight sequential LLM-call rounds (~27 minutes wall-clock). The pipeline transfers across weaker and stronger models without retuning, and on the multi-domain HLE benchmark, gains appear concentrated in objectively verifiable domains and reverse in subjective ones. We release CF-73, a curated set of 73 expert-rated Codeforces problems with International Grandmaster annotation and 99% local-evaluation agreement against the official verdict.