Push Your Agent: Measuring and Enforcing Quantitative Goal Persistence in Long-Horizon LLM Agents
TL;DR Highlight
LLM 에이전트가 '100개 찾아줘'를 실제로 100개 찾을 때까지 멈추지 않게 만드는 방법과 벤치마크.
Who Should Read
LLM 에이전트가 장시간 작업(파일 수집, 데이터 처리, 반복 검색 등)을 수행할 때 중간에 멈추거나 중복 작업을 반복하는 문제를 겪는 백엔드/AI 개발자. 에이전트 파이프라인에서 신뢰할 수 있는 작업 완료를 보장하고 싶은 엔지니어에게 적합.
Core Mechanics
- LLM 에이전트는 로컬 작업은 잘 해내지만 '정확히 N개를 완료하라'는 정량적 목표는 자주 실패함 — 논문은 이 문제를 QGP(Quantitative Goal Persistence)라고 정의함.
- 기존 에이전트의 3대 실패 패턴: 이미 제출한 항목을 또 제출하는 중복(duplicate submission), 목표 미달인데 완료 선언하는 조기 종료(premature stopping), 실제 검증 수보다 많다고 보고하는 수치 부풀리기(progress inflation).
- STATEQGP 컨트롤러(상태 추적 기반)는 gpt-4.1-mini~gpt-5.4 전 모델에서 중복 제출률을 0.000으로 만들고 성공률 69~78%를 달성 — 표준 컨트롤러(최대 30.6%) 대비 압도적.
- QGP-DataOps-lite(검증기 기반 작업 단위) 실험에서 표준/완료 게이팅 컨트롤러는 모든 모델에서 성공 0건, UNITQGP 컨트롤러는 25~50% 성공률로 유일하게 작동함.
- Claude Code(Sonnet 4.6)와 Codex CLI(gpt-5.4) 같은 최신 프론티어 에이전트도 50개 목표는 대부분 해결하지만 100개 목표에서 조건당 3/9 성공으로 급락함.
- 체크리스트 프롬프트를 추가해도 100개 목표에서 성공률 개선이 없음 — 프롬프트로 상기시키는 것보다 검증기 연동 상태 추적 메커니즘이 훨씬 효과적.
Evidence
- STATEQGP 컨트롤러는 gpt-4.1 LangGraph 기준 표준 컨트롤러 대비 성공률을 41.7%p 향상(95% CI: 27.8~58.3%p), gpt-5.4 LangGraph에서는 61.1%p 향상(95% CI: 44.4~77.8%p).
- QGP-DataOps-lite에서 표준/VG 컨트롤러는 모든 모델-백엔드 조합에서 성공 0건, UNITQGP는 gpt-4.1-mini 50%, gpt-4.1 29.2%, gpt-5.4 25% 성공률 기록.
- Claude Code(Sonnet 4.6), Codex CLI(gpt-5.4) 모두 N=50에서 9개 중 7개 성공이지만, N=100에서는 모든 에이전트-프롬프트 조건에서 9개 중 3개로 동일하게 하락.
- 메모리 보강 에이전트(LETTA/MEMGPT)는 gpt-4.1-mini에서 36개 중 0개 성공, gpt-5.4에서야 72.2%로 STATEQGP와 유사해짐 — 메모리 효과는 모델 크기에 강하게 의존.
How to Apply
- 에이전트가 '파일 100개 수집' 같은 정량 목표를 수행할 때, 컨트롤러 레이어에서 제출된 ID 목록과 검증 통과 수를 외부 상태로 유지하고, 중복 제출 시 필터링하여 다음 미탐색 페이지로 자동 전환하면 된다(STATEQGP 패턴).
- 백로그 처리 에이전트(CSV 검사, 파일 수정, 데이터 업데이트 등)에서 에이전트가 완료 선언을 시도할 때 검증기 카운트가 목표 미달이면 종료를 차단하고, 미처리 유닛 목록으로 에이전트를 다시 라우팅하는 UNITQGP 패턴을 적용하면 된다.
- 프론티어 에이전트(Claude Code, Codex CLI 등)를 쓰더라도 '체크리스트를 유지해라'는 프롬프트 추가만으로는 부족하므로, 외부 verifier가 accepted/remaining count를 명시적으로 피드백하는 도구 인터페이스를 별도로 설계해야 한다.
Code Example
# STATEQGP 컨트롤러 핵심 패턴 (Python 의사코드)
class StateQGPController:
def __init__(self, target_count, verifier):
self.target_count = target_count
self.submitted_ids = set() # 이미 제출한 ID 추적
self.seen_pages = {} # query -> set of seen page numbers
self.valid_count = 0
self.verifier = verifier
def handle_action(self, action):
if action.type == "submit":
# 중복 필터링
new_ids = [id for id in action.ids if id not in self.submitted_ids]
if not new_ids:
# 제출할 새 ID 없으면 다음 미탐색 페이지로 전환
return self.advance_to_next_unseen_page(action.last_query)
for id in new_ids:
self.submitted_ids.add(id)
if self.verifier.check(id):
self.valid_count += 1
return {"valid_count": self.valid_count,
"remaining": self.target_count - self.valid_count}
elif action.type in ["final", "ask_user"]:
# 목표 미달이면 종료 차단
if self.valid_count < self.target_count:
return {
"blocked": True,
"message": f"아직 {self.valid_count}/{self.target_count}만 완료됨. 계속 진행하세요."
}
return {"allowed": True}
elif action.type == "search":
query = action.query
page = action.page
if query not in self.seen_pages:
self.seen_pages[query] = set()
if page in self.seen_pages[query]:
# 이미 본 페이지면 다음 페이지로
next_page = max(self.seen_pages[query]) + 1
action.page = next_page
self.seen_pages[query].add(action.page)
return action
def advance_to_next_unseen_page(self, query):
seen = self.seen_pages.get(query, set())
next_page = max(seen) + 1 if seen else 1
return {"type": "search", "query": query, "page": next_page}Terminology
Related Papers
CoSPlay: Cooperative Self-Play at Test-Time with Self-Generated Code and Unit Test
Ground Truth 없이도 코드와 Unit Test가 서로 평가하며 함께 품질을 높이는 추론 시간 최적화 프레임워크
Multi-Stream LLMs: new paper on parallelizing/separating prompts, thinking, I/O
현재 LLM이 입력·사고·출력을 순차적으로만 처리하는 구조적 한계를 지적하고, 각 역할을 별도의 병렬 스트림으로 분리해 동시에 처리할 수 있는 Multi-Stream 방식을 제안한 논문이다. 에이전트의 효율성·보안·모니터링 가능성을 모두 개선할 수 있다는 점에서 주목받고 있다.
HarnessAPI: A Skill-First Framework for Unified Streaming APIs and MCP Tools
FastAPI HTTP 엔드포인트와 MCP 도구를 하나의 폴더에서 자동으로 동시에 만들어주는 Python 프레임워크
Launch HN: Runtime (YC P26) – Sandboxed coding agents for everyone on a team
엔지니어링팀뿐 아니라 마케팅, 영업, 지원팀까지 누구나 샌드박스 환경에서 coding agent를 안전하게 쓸 수 있게 해주는 인프라 플랫폼으로, YC P26 배치 스타트업이 런치했다.
Formal Verification Gates for AI Coding Loops
AI가 생성한 코드에서 보안 불변식(invariant)을 지키게 하려면 프롬프트 지시보다 타입 시스템 같은 구조적 제약이 훨씬 효과적이라는 주장과 구현 방법을 소개한다.
Learnings from 100K lines of Rust with AI (2025)
Azure RSL(분산 합의 라이브러리)을 Rust로 재구현하면서 AI 코딩 에이전트를 활용해 4주 만에 100K 라인을 작성한 경험담으로, Code Contracts와 Spec-Driven Development를 AI와 조합하는 실전 워크플로우를 공유한다.
Related Resources
Original Abstract (Expand)
Long-horizon language agents can make many plausible local tool calls yet fail to persist until a requested count is actually complete. We study this gap as Quantitative Goal Persistence (QGP): whether an agent keeps working until an external verifier confirms enough distinct valid items. PushBench turns this into a benchmark for repository-artifact collection and verifier-backed work units, so repeated work, duplicate submissions, false completion, and progress drift are measured directly rather than hidden behind a final success flag. In matched controller comparisons, a state-tracking retrieval controller reaches 69-78% success while eliminating duplicate submissions, and a backlog-tracking work-unit controller reaches 25-50% success in settings where standard and completion-gated controllers complete no task instances. Black-box frontier-agent evaluations with Claude Code (Sonnet 4.6) and Codex CLI (gpt-5.4) solve many 50-artifact tasks but drop to 3 out of 9 successes per condition at 100 artifacts. The results show that quantitative goals stress a different reliability requirement from local task competence: agents must maintain verified progress and stop only when the requested work is complete.