Self-Refine과 CRITIC: 반복적 출력 개선(Iterative Output Improvement)

Self-Refine(Madaan et al., 2023)은 하나의 LLM을 생성(generate), 피드백(feedback), 개선(refine)이라는 세 역할로 루프 안에서 사용합니다. 평균 개선 폭은 7개 작업에서 절대 점수 +20입니다. CRITIC(Gou et al., 2023)은 검증을 외부 도구로 라우팅해 피드백 단계를 더 단단하게 만듭니다. 2026년에는 이 패턴이 모든 프레임워크에서 "평가자-최적화기(evaluator-optimizer)"(Anthropic) 또는 가드레일 루프(guardrail loop, OpenAI Agents SDK)로 제공됩니다.

유형: Build 언어: Python (stdlib) 선수 학습: Phase 14 · 01 (에이전트 루프), Phase 14 · 03 (Reflexion) 소요 시간: 약 60분

학습 목표

  • Self-Refine의 세 프롬프트인 생성(generate), 피드백(feedback), 개선(refine)을 말하고, 개선 프롬프트에서 이력(history)이 중요한 이유를 설명합니다.
  • CRITIC의 핵심 통찰을 설명합니다. 외부 근거(external grounding)가 없으면 LLM은 자기 검증(self-verification)에 신뢰하기 어렵습니다.
  • 이력과 선택적 외부 검증기(external verifier)를 포함한 표준 라이브러리 기반 Self-Refine 루프를 구현합니다.
  • 이 패턴을 Anthropic의 "평가자-최적화기" 워크플로와 OpenAI Agents SDK의 출력 가드레일(output guardrails)에 매핑합니다.

문제

에이전트가 거의 맞는 답을 만들었습니다. 코드 한 줄에 문법 오류가 있을 수도 있습니다. 요약이 너무 길 수도 있습니다. 계획이 경계 사례(edge case)를 놓쳤을 수도 있습니다. 우리가 바라는 것은 에이전트가 스스로 자기 출력을 비평한 뒤 이를 고치는 것입니다.

Self-Refine은 이것이 하나의 모델만으로도, 학습 데이터 없이, 강화학습 없이 작동한다는 것을 보여줍니다. 하지만 함정이 있습니다. LLM은 어려운 사실에 대한 자기 검증을 잘하지 못합니다. CRITIC은 그 해결책에 이름을 붙였습니다. 검증 단계를 외부 도구, 즉 검색(search), 코드 인터프리터(code interpreter), 계산기(calculator), 테스트 실행기(test runner)로 라우팅(routing)하는 것입니다.

이 두 논문을 합치면 2026년의 반복 개선 기본값이 됩니다. 생성하고, 검증하고(가능하면 외부적으로), 개선하고, 검증기가 통과할 때 멈춥니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.Self-Refine의 피드백 단계와 CRITIC의 검증 단계의 핵심 차이는 무엇인가요?

2.Self-Refine의 개선(refine) 단계에서 이전 출력과 비평의 전체 이력이 필요한 이유는 무엇인가요?

0/2 답변 완료

개념

Self-Refine (Madaan et al., NeurIPS 2023)

하나의 LLM이 세 역할을 맡습니다.

generate(task)            -> output_0
feedback(task, output_0)  -> critique_0
refine(task, output_0, critique_0, history) -> output_1
feedback(task, output_1)  -> critique_1
refine(task, output_1, critique_1, history) -> output_2
...
stop when feedback says "no issues" or budget exhausted.

핵심 세부 사항은 refine이 전체 이력을 본다는 점입니다. 이전 출력과 이전 비평을 모두 보기 때문에 같은 실수를 반복하지 않습니다. 논문은 이를 제거하는 실험(ablation)을 수행했습니다. 이력을 빼면 품질이 급격히 떨어집니다.

대표 결과는 7개 작업(수학, 코드, 약어, 대화 등)에서 평균 절대 점수 +20 개선입니다. GPT-4를 포함해 학습 없이, 외부 도구 없이, 단일 모델만으로 얻은 결과입니다.

CRITIC (Gou et al., arXiv:2305.11738, v4 Feb 2024)

Self-Refine의 약점은 피드백 단계가 자기 자신을 채점하는 LLM이라는 점입니다. 사실 주장(factual claim)에서는 이것이 신뢰하기 어렵습니다. 환각(hallucination)은 그것을 만든 모델에게도 그럴듯해 보일 때가 많기 때문입니다. CRITIC은 feedback(task, output)verify(task, output, tools)로 바꿉니다. 여기서 tools에는 다음이 포함됩니다.

  • 사실 주장을 확인하기 위한 검색 엔진(search engine).
  • 코드 정합성을 확인하기 위한 코드 인터프리터.
  • 산술을 확인하기 위한 계산기.
  • 도메인 특화 검증기(domain-specific verifier): 단위 테스트, 타입 검사기(type checker), 린터(linter).

검증기는 도구 결과에 근거한 구조화된 비평(structured critique)을 만듭니다. 개선기는 이 비평을 조건으로 다시 출력을 만듭니다.

대표 결과는 다음과 같습니다. CRITIC은 사실 기반 작업에서 Self-Refine보다 좋습니다. 비평이 근거에 묶여 있기 때문입니다. 외부 검증기가 없는 작업, 예를 들어 창의적 글쓰기나 형식 맞추기에서는 CRITIC이 Self-Refine으로 축소됩니다.

중지 조건

흔한 형태는 두 가지입니다.

  1. 검증기 통과. 외부 테스트가 성공을 반환합니다. 단위 테스트, 타입 검사기, 가드레일 단언(guardrail assertion)처럼 사용할 수 있을 때 선호합니다.
  2. 피드백 없음. 모델이 "출력에 문제가 없다"고 말합니다. 더 저렴하지만 신뢰하기 어렵습니다. 최대 반복 횟수 제한과 함께 써야 합니다.

2026년 기본값은 둘을 결합하는 것입니다. "검증기가 통과하면 멈춘다. 또는 모델이 괜찮다고 말하고 반복 횟수가 2 이상이면 멈춘다. 또는 최대 반복 횟수에 도달하면 멈춘다."

평가자-최적화기(Evaluator-Optimizer, Anthropic, 2024)

Anthropic의 2024년 12월 글은 이것을 다섯 가지 워크플로 패턴 중 하나로 이름 붙입니다. 역할은 두 가지입니다.

  • 평가자(Evaluator): 출력을 채점하고 비평을 만듭니다.
  • 최적화기(Optimizer): 비평을 보고 출력을 수정합니다.

평가자가 통과시킬 때까지 루프를 돕니다. 이것이 Anthropic의 표현으로 본 Self-Refine/CRITIC입니다. Anthropic이 추가한 중요한 엔지니어링 세부 사항은 평가자와 최적화기 프롬프트가 구조적으로 충분히 달라야 한다는 점입니다. 그래야 모델이 단순히 도장 찍듯 "좋아 보인다"고 말하는 일을 줄일 수 있습니다.

OpenAI Agents SDK 출력 가드레일

OpenAI Agents SDK는 이 패턴을 "출력 가드레일"로 제공합니다. 가드레일은 에이전트의 최종 출력에 대해 실행되는 검증기입니다. 가드레일이 걸리면(OutputGuardrailTripwireTriggered 발생) 출력은 거부되고, 에이전트는 재시도할 수 있습니다. 가드레일은 도구를 호출할 수도 있고(CRITIC 스타일), 순수 함수일 수도 있습니다(Self-Refine 스타일).

2026년의 함정

  • 도장 찍기 루프(Rubber-stamp loop). 같은 모델이 같은 프롬프트 스타일로 생성과 비평을 모두 수행하면 "괜찮아 보인다"로 수렴합니다. 구조적으로 다른 프롬프트를 쓰거나, 비평에는 더 작고 저렴한 모델을 사용합니다.
  • 과도한 개선(Over-refinement). 각 개선 단계는 지연 시간과 토큰을 추가합니다. 보통 1-3회로 예산을 잡고, 그 뒤에는 사람 검토로 올립니다.
  • 사소한 작업에 CRITIC 사용. 외부 검증기가 없다면 CRITIC은 Self-Refine으로 퇴화합니다. 빈 검증기(stub verifier)를 위해 지연 시간을 지불하지 마세요.

만들어보기

code/main.py는 장난감 작업 위에서 Self-Refine과 CRITIC을 구현합니다. 주어진 주제에 대해 짧은 불릿 목록을 만드는 작업입니다. 검증기는 형식을 확인합니다. 불릿은 3개여야 하고, 각 불릿은 60자 미만이어야 합니다. CRITIC은 알려진 환각을 벌점 처리하는 외부 "사실 검증기(fact verifier)"를 추가합니다.

구성 요소는 다음과 같습니다.

  • generate - 스크립트형 생성기입니다.
  • feedback - LLM 스타일 자기 비평입니다.
  • verify_external - CRITIC 스타일의 근거 있는 검증기입니다.
  • refine - 이력을 보고 출력을 다시 씁니다.
  • 중지 조건 - 검증기가 통과하거나 최대 4번 반복합니다.

실행합니다.

python3 code/main.py

Self-Refine 실행과 CRITIC 실행을 비교해보세요. CRITIC은 Self-Refine이 놓친 사실 오류를 잡아냅니다. 외부 검증기는 자기 비평기에는 없는 근거를 갖고 있기 때문입니다.

사용해보기

Anthropic의 평가자-최적화기는 Claude 친화적 언어로 표현한 이 패턴입니다. OpenAI Agents SDK의 출력 가드레일은 CRITIC 형태입니다. 가드레일이 도구를 호출할 수 있기 때문입니다. LangGraph는 Self-Refine처럼 읽히는 회고 노드(reflection node)를 제공합니다. Google의 Gemini 2.5 Computer Use는 단계별 안전 평가자(per-step safety evaluator)를 추가하는데, 이는 CRITIC의 변형입니다. 모든 행동은 커밋되기 전에 검증됩니다.

산출물 만들기

outputs/skill-refine-loop.md는 작업 형태, 검증기 사용 가능성, 반복 예산을 받아 평가자-최적화기 루프를 구성합니다. 생성기, 평가자/검증기, 최적화기 프롬프트와 중지 정책(stop policy)을 함께 생성합니다.

연습문제

  1. 장난감 예제를 max_iterations=1로 실행해보세요. 그래도 CRITIC이 도움이 되나요?
  2. 외부 검증기를 노이즈가 섞인 검증기(noisy verifier)로 바꿔보세요. 무작위 30% 거짓 양성(false positive)을 추가합니다. 루프는 어떻게 동작하나요? 이것이 2026년 대부분의 가드레일 스택 현실입니다.
  3. "서로 다른 모델의 생성기-비평기" 변형을 구현해보세요. 큰 모델이 생성하고, 작은 모델이 비평합니다. 같은 모델보다 나은가요?
  4. CRITIC 논문 3장(arXiv:2305.11738 v4)을 읽어보세요. 세 가지 검증 도구 범주를 말하고 각각 예를 하나씩 드세요.
  5. OpenAI Agents SDK의 output_guardrails를 CRITIC의 검증기 역할에 매핑해보세요. SDK가 잘못하는 것은 무엇이고, 잘하는 것은 무엇인가요?

핵심 용어

용어흔한 설명실제 의미
Self-Refine"스스로 고치는 LLM"하나의 모델 안에서 생성 -> 피드백 -> 개선 루프를 돌며, 이력을 사용합니다.
CRITIC"도구 기반 검증(Tool-grounded verification)"피드백을 검색, 코드, 계산기, 테스트 같은 외부 검증기로 대체합니다.
평가자-최적화기(Evaluator-Optimizer)"Anthropic 워크플로 패턴"평가자가 채점하고 최적화기가 수정하는 두 역할을 수렴할 때까지 반복합니다.
출력 가드레일(Output guardrail)"사후 검사(Post-hoc check)"에이전트가 출력을 만든 뒤 실행되는 OpenAI Agents SDK 검증기입니다.
검증 단계(Verify step)"비평 단계"핵심 결정 지점입니다. 근거 기반인지, 자기 채점인지가 중요합니다.
개선 이력(Refine history)"모델이 이미 시도한 것"이전 출력과 비평을 개선 프롬프트 앞에 붙인 것입니다. 빼면 품질이 무너집니다.
도장 찍기 루프(Rubber-stamp loop)"자기 동의 실패"같은 프롬프트 형식으로 진행한 비평이 "좋아 보인다"로 끝나는 현상입니다. 구조적으로 다른 프롬프트로 고칩니다.
중지 조건(Stop condition)"수렴 검사"검증기 통과 또는 피드백 없음과 반복 제한을 함께 둡니다. 단일 조건만 쓰지 않습니다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

refine-loop

Configure an evaluator-optimizer (Self-Refine / CRITIC) loop given task, verifier availability, and iteration budget.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.팀이 Self-Refine 루프가 실제 문제를 고치지 않고 한 번 반복 후 '괜찮아 보인다'로 수렴하는 것을 발견했습니다. 가장 유력한 원인은 무엇인가요?

2.에이전트가 생성된 보고서의 사실 주장을 검증해야 합니다. Self-Refine과 CRITIC 스타일 검증 중 무엇을 사용해야 하나요?

3.Anthropic의 평가자-최적화기(evaluator-optimizer) 패턴은 Self-Refine 및 CRITIC과 어떤 관계에 있나요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다