자기 교정과 성찰적 프롬프트 작성
에이전트가 원래 목표와 비교하여 자신의 출력을 검토하고, 누락되거나 잘못된 부분을 찾아 수정된 계획을 생성한 뒤 다시 시도하도록 성찰 단계를 구현합니다.
자기 교정과 성찰적 프롬프트 작성은(는) CoddyKit의 무료 AI Engineering Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Engineering Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
성찰적 프롬프트란 무엇인가
성찰적 프롬프트는 에이전트가 최종 확정 전에 자신의 출력을 평가하도록 요청하는 기법입니다. 에이전트는 답변을 생성하고 멈추는 대신 원래 목표에 비추어 응답을 검토하고, 누락이나 오류를 찾아 수정된 버전을 생성합니다. 이는 사람이 자신의 작업을 교정하는 방식을 모방하며, 별도의 비평 모델 없이도 복잡한 작업의 출력 품질을 크게 향상합니다.
성찰 및 수정 반복
기본 성찰 반복은 세 단계로 이루어집니다. 먼저 초기 응답을 생성하고, 명확한 기준에 따라 해당 응답을 비평한 다음, 비평을 바탕으로 수정합니다. 이 반복은 한 번 이상 실행할 수 있습니다. 각 반복은 비평에서 만족스럽다고 판단하거나 최대 수정 횟수에 도달할 때까지 응답을 개선합니다. 비평 단계 자체도 특화된 성찰 프롬프트를 사용하는 LLM 호출입니다.
async def reflect_and_revise(task: str, max_rounds: int = 2) -> str:
response = await generate_initial(task)
for round_num in range(max_rounds):
critique = await critique_response(task, response)
if critique.is_satisfactory:
break
response = await revise_response(task, response, critique.feedback)
return response효과적인 비평 프롬프트 작성
비평 프롬프트는 모델에 단순히 응답을 '개선'하라고 요청하기보다 구체적인 평가 기준을 명시해야 합니다. 확인할 항목을 구체적으로 나열하십시오. 모든 주장이 정확한가? 질문의 모든 부분에 답했는가? 빠진 단계가 있는가? 불필요하게 장황한 부분이 있는가? 명확한 체크리스트 항목이 포함된 비평 프롬프트는 수정 단계에서 바로 사용할 수 있는 실행 가능한 피드백을 생성합니다.
CRITIQUE_PROMPT = '''
You are reviewing an AI-generated response to this task: {task}
Response to evaluate:
{response}
Check each criterion and provide specific feedback:
1. COMPLETENESS: Does it address all parts of the task?
2. ACCURACY: Are all factual claims correct?
3. CONCISENESS: Is there unnecessary padding or repetition?
4. FORMAT: Does it match the requested output format?
5. ACTIONABILITY: Can the user act on this response?
For each issue found, state exactly what to fix.
If the response is satisfactory on all criteria, say APPROVE.
'''비평 응답 파싱
비평 출력을 Pydantic 모델로 구성하면 수정할지 여부를 프로그래밍 방식으로 결정할 수 있습니다. is_satisfactory 필드가 반복 종료 여부를 결정합니다. issues 목록은 수정 단계에 정확히 무엇을 고쳐야 하는지 알려 줍니다. severity 필드를 사용하면 사소한 문체 문제에 대해서는 수정을 건너뛰고, 사실 오류가 있을 때는 항상 수정할 수 있습니다.
from pydantic import BaseModel
from typing import List, Literal
class Issue(BaseModel):
criterion: str
description: str
severity: Literal['critical', 'moderate', 'minor']
class Critique(BaseModel):
is_satisfactory: bool
issues: List[Issue]
overall_verdict: str
# is_satisfactory=True means no revision needed
# is_satisfactory=False means issues must be addressed수정 프롬프트
수정 프롬프트에는 원래 작업, 초기 응답, 비평 피드백이 전달됩니다. 비평에서 확인된 각 문제를 구체적으로 해결하면서 원래 응답의 올바른 부분은 유지하도록 모델에 요청합니다. 비평에서 이미 승인한 내용을 모델이 불필요하게 변경하지 않도록 항상 'only'라는 단어를 포함합니다.
def build_revision_prompt(task: str, response: str, critique: Critique) -> str:
issues_text = '\n'.join(
f'- [{i.severity.upper()}] {i.criterion}: {i.description}'
for i in critique.issues
)
return f'''
Original task: {task}
Your previous response:
{response}
Issues to fix:
{issues_text}
Write an improved response that fixes ONLY the issues listed above.
Do not change parts that were not flagged as problems.
'''코드 생성의 자기 교정
자기 교정은 특히 코드 생성에서 강력합니다. 코드를 생성한 후 린터나 유형 검사기로 검사하고, 오류 출력을 모델에 전달하여 오류를 수정하도록 요청합니다. 이러한 실행 기반 성찰은 다른 LLM의 판단이 아니라 객관적인 도구에서 피드백을 받기 때문에 언어만 사용하는 비평보다 신뢰성이 높습니다.
import subprocess
import sys
async def self_correct_code(task: str, max_rounds: int = 3) -> str:
code = await generate_code(task)
for _ in range(max_rounds):
# Write code to temp file and run mypy
with open('/tmp/agent_code.py', 'w') as f:
f.write(code)
result = subprocess.run(
[sys.executable, '-m', 'mypy', '/tmp/agent_code.py', '--ignore-missing-imports'],
capture_output=True, text=True
)
if result.returncode == 0:
break # No type errors
code = await fix_code(code, result.stdout + result.stderr)
return code과도한 수정 피하기
성찰 시스템에서 흔히 발생하는 실패는 과도한 수정입니다. 모델이 다른 문제를 고치려다가 원래 문제를 더 악화시키는 것입니다. 수정 범위를 제한하여 이를 완화할 수 있습니다. 수정 프롬프트에 '표시된 항목 외에는 아무것도 변경하지 마세요'라고 명시해야 합니다. 또한 차이 검사를 사용하여 수정된 응답과 원래 응답을 비교하십시오. 수정본이 크게 달라졌다면 문제가 발생한 것이므로 원래 응답을 유지해야 합니다.
from difflib import SequenceMatcher
def safe_revision(original: str, revised: str, max_change_ratio: float = 0.7) -> str:
similarity = SequenceMatcher(None, original, revised).ratio()
if similarity < (1 - max_change_ratio):
print(f'Revision changed too much (similarity: {similarity:.2f}). Keeping original.')
return original
return revised다단계 에이전트 작업에서의 성찰
다단계 에이전트에서는 일련의 단계를 완료한 후, 예를 들어 모든 조사를 수집했지만 최종 보고서를 작성하기 전과 같이 성찰 체크포인트를 추가합니다. 에이전트는 수집한 내용을 검토하고, 부족한 부분을 파악하며, 더 많은 정보를 수집할지 진행할지 결정합니다. 이러한 작업 중간의 성찰은 에이전트가 불완전하거나 모순되는 근거를 가지고 종합 단계로 진행하는 것을 방지합니다.
async def research_with_reflection(question: str) -> str:
# Phase 1: gather evidence
evidence = await gather_evidence(question)
# Reflection checkpoint
assessment = await assess_evidence_completeness(question, evidence)
if not assessment.is_complete:
for gap in assessment.gaps:
more_evidence = await targeted_search(gap.search_query)
evidence.extend(more_evidence)
# Phase 2: synthesize
return await synthesize_answer(question, evidence)성찰 결과 기록하기
모든 성찰 라운드를 기록하십시오. 비평 점수, 확인된 문제, 수정이 실제로 문제를 해결했는지를 기록해야 합니다. 이 데이터는 성찰 프롬프트가 효과적인지 보여 줍니다. 수정된 응답이 비평에서 지적한 동일한 문제를 계속 다시 도입한다면 수정 프롬프트가 충분히 구체적이지 않은 것입니다. 첫 번째 라운드에서 대부분의 비평이 'APPROVE'라고 한다면 초기 생성 품질이 이미 높으므로 성찰에 드는 추가 비용이 정당하지 않을 수 있습니다.
import structlog
log = structlog.get_logger()
def log_reflection_round(task_id: str, round_num: int, critique: Critique, action: str):
log.info(
'reflection_round',
task_id=task_id,
round=round_num,
is_satisfactory=critique.is_satisfactory,
issue_count=len(critique.issues),
critical_issues=sum(1 for i in critique.issues if i.severity == 'critical'),
action=action # 'approved', 'revised', 'max_rounds_reached'
)성찰을 사용할 시점
성찰에는 지연 시간과 비용이 추가됩니다. 두 라운드의 성찰 및 수정은 해당 작업의 LLM 호출 횟수를 최소 세 배로 늘립니다. 성찰은 선택적으로 사용하십시오. 실행될 코드나 중대한 비즈니스 질문에 대한 답변처럼 위험이 높은 출력에는 항상 사용하고, 사용자에게 표시되는 응답에는 필요에 따라 사용하며, 도구로 즉시 검증할 내부 중간 단계에는 사용하지 마십시오. 속도보다 품질이 중요할 때는 이 비용을 감수할 가치가 있습니다.
# Reflection decision matrix:
# Task type: Use reflection?
# SQL query generation YES (run+verify)
# Final report writing YES (review before delivery)
# Tool argument prep NO (tool result verifies it)
# Short factual answer MAYBE (if accuracy is critical)
# Internal agent thought NO (intermediate, not final)
# Code generation YES (run linter/tests)
USE_REFLECTION = {'report', 'code', 'email', 'analysis'}성찰 효과 측정하기
A/B 테스트를 실행하여 성찰이 실제로 출력을 개선하는지 추적하십시오. 작업의 무작위 50%는 성찰과 함께 처리하고 나머지 50%는 성찰 없이 처리한 다음, LLM 평가자로 두 집합을 모두 평가합니다. 성찰 그룹의 점수가 유의미하게 높고 그 개선 폭이 추가 지연 시간과 비용을 초과한다면 성찰이 효과를 내고 있는 것입니다. 점수가 비슷하다면 초기 생성 품질이 이미 충분히 높아 성찰이 이점 없이 추가 부담만 주고 있는 것입니다.
async def reflection_ab_test(tasks: list) -> dict:
import random
results = {'with_reflection': [], 'without_reflection': []}
for task in tasks:
if random.random() < 0.5:
response = await reflect_and_revise(task, max_rounds=2)
group = 'with_reflection'
else:
response = await generate_initial(task)
group = 'without_reflection'
score = await judge(task, response)
results[group].append(score.overall)
return {
'mean_with': sum(results['with_reflection']) / len(results['with_reflection']),
'mean_without': sum(results['without_reflection']) / len(results['without_reflection'])
}간단한 확인
에이전트의 자기 교정과 성찰 프롬프트에 대한 이해도를 확인하십시오.
수업 요약
이 수업에서는 다음을 배웠습니다. 성찰 및 수정 반복은 에이전트가 자신의 응답을 비평하고 수정하게 하여 출력 품질을 높입니다. 구체적인 비평 기준은 막연한 개선 제안이 아니라 실행 가능한 피드백을 제공합니다. 또한 린터와 같은 객관적인 도구를 사용하는 실행 기반 성찰은 코드 생성에서 특히 강력합니다. 다음에서는 에이전트 체크포인트 저장과 작업 재개를 구현합니다.
자주 묻는 질문
“자기 교정과 성찰적 프롬프트 작성” 강의는 무료인가요?
네 — “자기 교정과 성찰적 프롬프트 작성” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Engineering Academy 강의 전체를 잠금 해제할 수 있습니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“자기 교정과 성찰적 프롬프트 작성”에서 뭘 배우나요?
에이전트가 원래 목표와 비교하여 자신의 출력을 검토하고, 누락되거나 잘못된 부분을 찾아 수정된 계획을 생성한 뒤 다시 시도하도록 성찰 단계를 구현합니다. 브라우저에서 직접 실행하는 실습 코드로 AI Engineering Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
AI Engineering Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 AI Engineering Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“자기 교정과 성찰적 프롬프트 작성” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 AI Engineering Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 AI Engineering Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 에이전트 실패 유형 분류
- 자기 교정과 성찰적 프롬프트 작성
- 체크포인트 저장과 작업 재개
- 사람 참여형 에스컬레이션