Self-Refine (2023) and CRITIC (2023) — iterative improvement
Self-Refine: one model, three prompts
generate(task) -> output
base producer — task prompt, no history
feedback(task, output) -> critique
self-critic; weakest link — model scoring itself
refine(task, output, critique, HISTORY) -> output'
history is load-bearing; drop it and quality tanks
stop: feedback says fine OR max_iters
pair both conditions; single stops hide bugs
avg +20 absolute over 7 tasks (paper)
math, code, acronym, dialog; includes GPT-4
pitfall: rubber-stamp loop
same-prompt critic agrees with itself
fix: different prompt style or a smaller critic
fits Anthropic "evaluator-optimizer"
one of the 5 workflow patterns (Dec 2024)
CRITIC: verify through external tools
generate(task) -> output
same producer
verify(task, output, TOOLS) -> critique
search, code, calculator, tests — grounded
refine(task, output, critique, HISTORY) -> output'
same refine, better critique -> better output
stop: verifier passes OR max_iters
verifier signal dominates self-critic
key claim
LLMs are unreliable at self-verification without external grounding
maps to OpenAI Agents SDK output guardrails
guardrails can call tools; tripwires enforce retries
maps to Gemini 2.5 per-step safety
every action verified before commit
no external verifier? CRITIC reduces to Self-Refine