Overview
OPV bridges outcome and process verification by summarizing long CoT chains before process verification. Iterative active learning progressively improves verification capability while minimizing annotation costs through targeted uncertainty sampling.
When to Use
- Verifying long chain-of-thought reasoning
- Limited annotation budget
- Need to check both answers and reasoning quality
- Mathematical and logical problem solving
- Iterative improvement of verification models
When NOT to Use
- Single-statement verification
- Abundant annotation resources
- Short reasoning chains
Core Technique
Outcome + process hybrid verification with active learning:
# OPV: Outcome-Process Verification
class OutcomeProcessVerifier:
def __init__(self):
self.outcome_model = OutcomeVerifier()
self.process_model = ProcessVerifier()
self.active_learner = ActiveLearner()
def verify_long_cot(self, problem, cot_chain):
"""Hybrid verification for long reasoning."""
# Stage 1: Outcome verification (fast)
outcome_valid = self.outcome_model.verify(problem, cot_chain[-1])
# Stage 2: Summarize long CoT
summary = self.summarize_cot(cot_chain)
# Stage 3: Process verification on summary
process_valid = self.process_model.verify(
problem,
summary
)
# Combined verdict
is_valid = outcome_valid and process_valid
return is_valid
def summarize_cot(self, cot_chain):
"""Compress long reasoning for process verification."""
# Extract key reasoning steps
important_steps = []
for step in cot_chain:
if self.is_important_step(step):
important_steps.append(step)
# Create summary maintaining logical flow
summary = self.create_logical_summary(important_steps)
return summary
def iterative_active_learning(self, unlabeled_cots, expert_budget=100):
"""Progressively improve verification with targeted labels."""
labeled_data = []
for iteration in range(10):
# Current model predicts on unlabeled
predictions = self.predict_on_batch(unlabeled_cots)
# Find uncertain cases
uncertain_indices = self.active_learner.select_uncertain(
predictions,
budget=expert_budget
)
# Get expert annotations for uncertain cases
expert_labels = self.get_expert_labels(
[unlabeled_cots[i] for i in uncertain_indices]
)
# Add to labeled set
for idx, label in zip(uncertain_indices, expert_labels):
labeled_data.append((unlabeled_cots[idx], label))
# Retrain models
self.retrain_on_labeled_data(labeled_data)
# Remove from unlabeled
unlabeled_cots = [
cot for i, cot in enumerate(unlabeled_cots)
if i not in uncertain_indices
]
return labeled_data
def train_with_verifiable_rewards(self, model, problems):
"""RLVR: RL with verifiable rewards."""
for problem in problems:
# Generate reasoning with model
reasoning = model.generate_cot(problem)
# Verify reasoning
is_valid = self.verify_long_cot(problem, reasoning)
# Reward: verification success
reward = 1.0 if is_valid else 0.0
# RL update
model.update_with_reward(reasoning, reward)
Key Results
- 83.1 F1 on verification benchmark
- Improves downstream reasoning (55.2% → 73.3% on AIME)
- Efficient active learning reduces annotation needs
References
- Original paper: https://arxiv.org/abs/2512.10756
- Focus: Verification of long reasoning chains
- Domain: Chain-of-thought evaluation, reinforcement learning