TL;DR — 리플렉션은 에이전트가 자신의 출력을 스스로 평가하고 다시 고쳐 쓰는 패턴입니다. 한 번에 끝내지 않고 생성 → 평가 → 개선 → (반복)의 피드백 루프를 돕니다. 핵심은 생성자와 비평가의 역할 분리(Producer-Critic)로 자기 평가의 편향을 줄이고, 키워드·점수·최대 반복 횟수로 루프를 안전하게 끝내는 것입니다. 내부 평가만 하는 기본 Reflection을 외부 도구(코드 실행·테스트)로 검증하는 Reflexion으로 끌어올리면 코드 생성 성공률이 약 55%→81%로 뜁니다. 대신 비용·지연이 늘므로 품질이 속도보다 중요할 때 씁니다.
1. 왜 리플렉션인가 — 한 번에 쓴 글은 들쭉날쭉하다
1편 프롬프트 체이닝은 작업을 순서대로 쪼갰고, 2편 라우팅은 입력에 따라 길을 나눴으며, 3편 병렬화는 독립 작업을 동시에 던졌습니다. 셋 다 “한 번 생성하면 그게 결과”라는 점은 같았습니다. 그런데 LLM에게 똑같은 요청을 세 번 하면 이런 일이 벌어집니다.
사람도 초안을 한 번에 완성하지 않습니다. 쓰고, 읽어 보고, 고칩니다. 리플렉션은 바로 이 “쓰고-검토하고-고치는” 인간의 작업 방식을 에이전트에 이식한 패턴입니다. 초기 응답의 부정확성, 빠진 정보, 논리적 비약, 요구사항 미충족, 코드 버그 — 이 모든 결함을 스스로 잡아내고 보완합니다.
2. 리플렉션이란 — 생성·평가·개선의 4단계 루프
리플렉션의 본체는 피드백 루프입니다. 일반적인 AI 호출이 입력 → LLM → 출력(끝)이라면, 리플렉션은 출력을 다시 입력으로 되먹여 4단계를 돕니다.
2단계 평가는 막연한 “잘했나?”가 아니라 구체적 기준 — 사실 정확성·논리 일관성·스타일/톤·완성도·요구사항 충족도 — 를 항목별로 따집니다. 평가가 구체적일수록 3단계 개선이 정확해집니다. 이 점에서 리플렉션은 1편 체이닝의 사촌입니다. 체이닝이 작업을 공간적으로 쪼갰다면, 리플렉션은 같은 작업을 시간적으로 반복하며 다듬는 셈이죠.
3. Producer-Critic — 생성자와 비평가를 나누는 이유
한 에이전트가 자기 글을 자기가 평가하면 인지 편향(Cognitive Bias)이 생깁니다. 사람도 자기가 쓴 글의 오타를 잘 못 보죠. 그래서 리플렉션의 정석은 역할을 둘로 나누는 Producer-Critic(생성자-비평가) 모델입니다.
Critic의 품질이 곧 리플렉션의 품질입니다. 좋은 Critic 프롬프트에는 세 가지가 들어갑니다 — 전문가 페르소나(“당신은 PEP 8을 준수하는 시니어 Python 엔지니어”), 구체적 평가 기준(항목별 점수), 구조화된 출력 형식과 종료 키워드입니다.
4. 리플렉션의 진짜 함정 — 루프는 반드시 끝나야 한다
리플렉션 코드의 가장 위험한 버그는 무한 루프입니다. 비평가가 영원히 트집을 잡으면 LLM 호출이 끝없이 돌며 비용과 리소스를 태웁니다. 그래서 종료 조건은 선택이 아니라 필수입니다. 네 가지를 조합합니다.
- 키워드 종료 — 비평가가
"APPROVED"·"CODE_IS_PERFECT"를 출력하면 종료 - 점수 임계값 — 품질 점수
≥ 8/10(또는 75/100) 충족 시 종료 - 최대 반복(필수 안전장치) —
max_iterations도달 시 무조건 종료 - 개선 없음 감지 — 직전과 같은 피드백이 반복되면 조기 종료
5. 구현 ① LangChain — 메시지 히스토리 + while 루프
가장 직관적인 방식입니다. MessagesPlaceholder로 대화 히스토리를 프롬프트에 끼워 넣고, for 루프로 생성-비평을 반복합니다. 비평 결과를 HumanMessage로 히스토리에 쌓으면, 다음 생성이 자동으로 피드백을 반영합니다.
코드 생성에 특화하려면 비평가를 코드 리뷰어 페르소나로 바꾸고 종료 키워드를 CODE_APPROVED로 두면 됩니다. 가장 유연하지만 상태·종료를 직접 관리해야 해 코드량이 많은 게 단점입니다.
6. 구현 ② LangGraph — 조건부 엣지로 동적 분기
LangGraph는 리플렉션을 그래프로 표현합니다. generate(Producer)와 evaluate(Critic) 노드를 두고, 평가 뒤에 조건부 엣지로 “다시 생성”과 “종료”를 동적으로 가릅니다. 루프 횟수가 입력마다 달라지는 리플렉션에 가장 잘 맞는 구조입니다.
상태가 TypedDict로 명시되고 흐름이 그래프로 보이니 복잡한 워크플로우를 시각화·디버깅하기 좋습니다. graph.astream()으로 각 노드 실행을 실시간 추적할 수도 있습니다.
7. 구현 ③ Google ADK — LoopAgent로 선언적 반복
ADK는 반복 자체를 에이전트로 추상화합니다. SequentialAgent로 Producer→Critic을 한 스텝으로 묶고, 그 스텝을 LoopAgent에 넣으면 max_iterations까지 자동 반복합니다. 결과는 output_key로 세션 상태에 저장돼 다음 에이전트가 {변수}로 참조합니다.
코드량이 가장 적고 의도가 선언적으로 드러나 빠른 프로토타이핑에 좋습니다. Producer는 current_content, Critic은 previous_feedback처럼 서로 다른 output_key를 쓰는 게 상태가 덮어써지지 않게 하는 핵심입니다.
8. 세 프레임워크 — 같은 루프, 다른 추상화
셋 다 “생성-평가-개선-반복”이라는 원리는 동일합니다. 다른 건 상태를 어떻게 관리하고 루프를 어떻게 제어하느냐 뿐입니다.
| 특성 | LangChain LCEL | LangGraph | Google ADK |
|---|---|---|---|
| 상태 관리 | List[Message] | TypedDict + Reducer | output_key 자동 |
| 반복 제어 | if 조건문 | should_continue | max_iterations |
| 코드량 | 많음 | 중간 | 적음 |
| 적합한 경우 | 세밀한 제어 | 복잡한 워크플로우 | 빠른 프로토타이핑 |
9. 한 걸음 더 — 리플렉션을 강하게 만드는 3가지
기본 루프를 익혔다면, 실무에서 위력을 발휘하는 세 가지 진화형이 있습니다. 모두 “평가를 더 객관적으로” 만드는 방향입니다.
① 멀티크리틱 병렬 — 리플렉션 × 병렬화
한 명의 만능 비평가 대신 품질·보안·성능 전문 비평가 3명이 동시에 같은 코드를 평가합니다(3편 Fan-Out/Fan-In의 응용). 각 점수를 가중 평균(품질 40% · 보안 35% · 성능 25%)해 75점 임계값으로 판정하죠.
② 구조화 비평 — 자유 텍스트 대신 JSON 스키마
“개선이 필요합니다” 같은 자유 서술은 파싱이 불안정합니다. Pydantic 스키마로 비평을 강제하면 점수·심각도(critical/major/minor)·이슈 ID가 정량화되어 CI/CD 품질 게이트·대시보드에 그대로 연결됩니다. 형식이 깨지면 자동 재시도까지 합니다.
③ 코드 실행 grounding — 의견이 아니라 사실로 평가
가장 강력한 형태입니다. LLM의 주관적 비평 대신, 생성된 코드를 실제로 실행해 테스트 통과/실패라는 객관적 사실을 피드백으로 씁니다(TDD 방식). “그럴듯한데 틀린” 비평이 끼어들 여지가 없죠.
코드 생성→Code Runner
실제 실행·테스트→Critic
결과 분석↺
내부 평가만 · 메모리 없이 독립 반복
실행·테스트로 검증 · 성찰을 저장·재사용
10. 엔터프라이즈 적용 — CRM · ERP · Groupware
기업에서 리플렉션의 비평가는 곧 자동 품질 보증(QA)·컴플라이언스 검증기가 됩니다. Producer가 만든 문서를 Critic이 평가하고, 그 뒤 Validator가 비즈니스 규칙·규정 준수를 100% 통과시킨 뒤에만 내보냅니다. 인간은 최종 승인이나 예외만 봅니다.
한 번에 전사 적용하지 않습니다. 파일럿(1개 사용 사례) → 확장(CRM·ERP·GW) → 고도화의 3단계로 가며, 핵심은 Producer-Critic-Validator를 공통 오케스트레이터로 두고 시스템 커넥터만 갈아끼우는 것입니다.
11. 케이스 스터디
① CRM 영업 제안서 — 품질 점수 8점 게이트
CRM의 고객·기회 정보로 Producer가 제안서 초안을 만들면, Critic이 니즈 매칭 30% · 가치 제안 25% · 차별화 20% · 완성도 15% · 가격 10%로 채점합니다. 8점 미만이면 피드백과 함께 되돌리고, 8점 이상이면 Compliance Validator(가격 정책·약관·브랜드 가이드)를 통과한 뒤에야 출력합니다.
② ERP 재무 보고서 — 다중 Validator
재무 보고서는 한 가지 평가로 부족합니다. 수치 정확성(합계·전기 일치) → 회계 기준(K-IFRS·주석 공시) → 품질(가독성·분석 깊이) 세 Validator를 모두 통과해야 합니다. 멀티크리틱(9장)의 엔터프라이즈판으로, 감사 지적 건수를 월 15건 → 3건(-80%)으로 줄입니다.
③ Groupware 회의록 — 완성도·정확성 검증 후 자동 등록
녹취를 요약해 초안을 만들고, Completeness Checker(모든 안건·결정·액션아이템·담당자/기한)와 Accuracy Reviewer(발언자 매칭·수치·고유명사)를 통과하면, 액션 아이템을 업무 관리 시스템에 자동 등록하고 참석자에게 검토를 요청합니다.
12. 베스트 프랙티스 & 트레이드오프
리플렉션을 쓸지 말지 — 의사결정
- 품질·정확성 > 속도
- 장문 콘텐츠(보고서·문서)
- 코드 생성·디버깅
- 복잡한 계획 수립
- 전문적 평가가 필요한 작업
- 실시간 응답 필요
- 단순 질의응답
- 비용에 민감한 대용량 처리
- 간단한 변환 작업
트레이드오프 — 공짜 품질은 없다
리플렉션은 품질을 비용·지연·컨텍스트와 맞바꿉니다. 3회 반복은 LLM 호출을 최소 6번으로 늘리고, 응답 시간을 키우며, 누적 히스토리로 토큰을 잡아먹습니다. 그래서 “품질 향상의 한계 효용이 비용을 넘는 구간”까지만 반복하는 게 핵심입니다.
체크리스트
- ✅ Critic은 다른 페르소나로 — 자기 평가의 인지 편향 방지
- ✅ 평가 기준을 항목별로 명시 — 점수·근거를 구조화(가능하면 Pydantic)
- ✅ 종료 키워드 + 점수 + max_iterations 삼중 종료 — 무한 루프 금지
- ✅ 가능하면 외부 도구로 grounding — 코드는 실행·테스트로 검증(Reflexion)
- ✅ 컨텍스트 관리 — 최초 요구사항 유지 + 중간 히스토리 요약·압축
- ✅ 에스컬레이션 — 최대 반복까지 미달이면 인간 검토로 넘긴다
체이닝(1편)이 “순서대로 쪼개기”, 라우팅(2편)이 “입력에 따라 길 나누기”, 병렬화(3편)가 “독립 작업 동시에 던지기”였다면, 리플렉션은 “자기 출력을 스스로 평가하고 다시 쓰기”입니다. 네 패턴은 경쟁이 아니라 조합됩니다 — 라우터가 복잡한 작업만 리플렉션으로 보내고, 다양한 버전을 병렬 생성한 뒤 비평가가 최선을 고르고, 코드 실행 결과로 평가를 grounding합니다. 핵심은 생성과 평가를 분리하고, 루프를 반드시 끝맺는 것. 그리고 평가가 객관적일수록(외부 도구) 리플렉션은 강해집니다. 다음 편에서는 에이전트가 외부 세계와 상호작용하는 도구 사용(Tool Use)을 다룹니다.
'Agentic AI Design Patterns' 카테고리의 다른 글
| CH06-스스로 길을 그리는 AI — 플래닝(Planning) 패턴 완벽 정리 (0) | 2026.06.03 |
|---|---|
| CH05-AI 에이전트 도구 사용 입문 | @tool·ReAct·FunctionTool로 외부 API·DB 연동하기 (0) | 2026.06.03 |
| CH03-AI 에이전트 병렬화 입문 | RunnableParallel·LangGraph·ParallelAgent·asyncio로 동시 실행 구현하기 (0) | 2026.06.01 |
| CH02-입력에 따라 길을 나눠라 — 라우팅(Routing) 패턴 완벽 정리 (0) | 2026.05.31 |
| CH01-프롬프트 체이닝 입문 | 단일 프롬프트의 한계부터 LangChain·LangGraph·Google ADK 구현까지 (0) | 2026.05.31 |