LLM 애플리케이션에서 반복해서 등장하는 호출 구조의 설계 패턴입니다. 핵심은 가장 단순한 패턴으로 시작하고, 측정해서 부족할 때만 한 단계씩 복잡도를 올리는 것입니다. 앞의 다섯 개는 흐름을 코드가 정하는 Workflow, 나머지는 모델이 흐름을 정하는 Agent 쪽 패턴입니다. (구분은 Agent 참고)
| 패턴 | 분류 | 한 줄 요약 | 언제 쓰나 | 대가 |
|---|---|---|---|---|
| Prompt Chaining | Workflow | 작업을 순차 단계로 쪼개 앞 결과를 다음 입력으로 | 단계가 고정되고 명확함 | 지연 증가 |
| Routing | Workflow | 입력을 분류해 전문 경로로 분기 | 입력 유형별 처리가 확연히 다름 | 분류 오류가 전체 오류 |
| Parallelization | Workflow | 독립 하위 작업 동시 실행 / 같은 작업 여러 번 후 투표 | 속도, 다양한 관점, 신뢰도 | 비용 배수 |
| Orchestrator-Workers | Workflow | 중앙 LLM이 하위 작업을 동적으로 만들어 위임 | 하위 작업을 미리 알 수 없음 | 조율 복잡도 |
| Evaluator-Optimizer | Workflow | 생성 → 평가 → 수정 루프 | 평가 기준이 명확하고 반복 개선 효과가 있음 | 반복 횟수만큼 비용 |
| ReAct | Agent | 생각 → 행동 → 관찰 반복 | 탐색형 작업, 도구 사용 | 경로 예측 어려움 |
| Reflection | Agent | 스스로 결과를 비판하고 다시 시도 | 1차 결과 품질이 불안정 | 자기 평가 편향 |
| Plan-and-Execute | Agent | 계획을 먼저 세우고 단계별 실행, 필요 시 재계획 | 긴 다단계 작업 | 초기 계획이 틀리면 낭비 |
| Human-in-the-loop | 공통 | 핵심 지점에서 사람 확인·수정 | 되돌릴 수 없는 행동 | 사람 대기 시간 |
| Multi-Agent | Agent | Supervisor가 위임하거나 Agent끼리 인계(Handoff) | 역할·컨텍스트 분리가 필요 | 토큰 급증, 인계 손실 |
⚠️ 함정: 패턴은 조합해서 씁니다. 실제 시스템은 "Routing으로 분기 → 한 경로는 Prompt Chaining, 다른 경로는 ReAct Agent + Human-in-the-loop"처럼 섞입니다. 패턴 이름보다 각 LLM 호출의 입력·출력·실패 시 동작이 명확한가가 중요합니다.
개념: 복잡한 문제를 한 번에 풀게 하지 않고 분할 정복합니다. 원래 문제를 작고 관리하기 쉬운 하위 문제의 연속으로 나누고, 각 하위 문제는 전용 프롬프트로 처리한 뒤 그 결과를 다음 프롬프트의 입력으로 넘깁니다. 단계 사이에 코드로 된 검문(gate) 을 둘 수 있다는 점이 핵심입니다.
개념: 입력을 먼저 분류하고, 유형에 맞는 전용 프롬프트·도구·모델로 보냅니다. 관심사를 분리해 한 프롬프트가 모든 경우를 떠안지 않게 합니다.
개념: 두 가지 변형이 있습니다.
개념: 중앙 Orchestrator LLM이 입력을 보고 필요한 하위 작업을 그때그때 결정해 Worker LLM에 위임하고 결과를 종합합니다. Parallelization과 모양은 비슷하지만 하위 작업이 미리 정해져 있지 않다는 점이 다릅니다.
개념: 한 LLM이 결과를 생성하고 다른 LLM(또는 같은 모델의 다른 프롬프트)이 평가·피드백하며, 기준을 통과할 때까지 반복합니다. 사람 작가가 편집자의 피드백을 받아 고쳐 쓰는 과정과 같습니다.
개념: 모델이 Thought(생각) → Action(도구 호출) → Observation(결과 관찰) 을 반복하며 목표에 다가갑니다. 생각만 하는 CoT와 달리 외부 정보를 보고 계획을 수정할 수 있고, 행동만 하는 방식과 달리 왜 그 행동을 했는지가 남습니다. (Yao et al., 2022)
요즘은 "Thought:/Action:" 텍스트를 파싱하지 않고, 모델의 네이티브 도구 호출(Function Calling)로 같은 루프를 구현합니다.
ReWOO(Reasoning WithOut Observation) 는 ReAct의 변형으로, 도구 결과를 보기 전에 필요한 도구 호출 계획을 한 번에 전부 세우고 실행한 뒤 마지막에 종합합니다. LLM 호출 수가 줄어 토큰을 아끼지만, 중간 결과에 따라 계획을 바꾸기 어렵습니다. (Xu et al., 2023)
개념: 모델이 자기 결과를 비판(critique) 하고 그 피드백을 바탕으로 다시 시도합니다. Evaluator-Optimizer를 Agent 한 명이 스스로 수행하는 형태이며, 실패 경험을 언어로 요약해 다음 시도의 메모리로 쓰는 Reflexion, 초안을 반복 개선하는 Self-Refine이 대표적입니다.
두 방식을 흐름으로 비교하면 다음과 같습니다.
개념: 실행에 들어가기 전에 전체 계획을 먼저 세우고, 단계별로 실행하며, 결과에 따라 재계획합니다. 계획 담당(보통 강한 모델)과 실행 담당(더 작은 모델이나 단일 작업 Agent)을 나누기도 합니다.
Self-Ask는 가벼운 계획 기법으로, 모델이 원래 질문을 풀기 위해 필요한 후속 질문을 스스로 만들고 하나씩 답(필요하면 검색)한 뒤 최종 답을 조합합니다. 다단계 질문에 적합합니다.
개념: Agent가 되돌릴 수 없거나 위험한 행동 직전에 멈추고 사람에게 승인·수정·거부를 받습니다. 사람이 중간 결과를 편집하거나, Agent가 정보가 부족할 때 사람에게 되묻는 것도 포함합니다.
개념: 역할이 다른 여러 Agent가 협업합니다. 대표적인 두 구조가 있습니다.
| 구조 | 동작 | 제어권 | 예 |
|---|---|---|---|
| Supervisor(계층형) | 상위 Agent가 하위 Agent를 도구처럼 호출하고 결과를 받아 종합 | 항상 Supervisor에 있음 | 리서치 리드가 검색 Agent 여러 개에 조사를 맡김 |
| Handoff(인계형) | 현재 Agent가 대화의 제어권 자체를 다른 Agent에게 넘김 | 인계받은 Agent로 이동 | 고객센터 Agent → 환불 전문 Agent로 전환 |
⚠️ 함정: 역할 이름(PM Agent, 개발자 Agent, QA Agent)만 나누고 각자의 입력·출력·완료 조건을 정의하지 않으면 협업이 되지 않습니다. Agent끼리 서로 확인만 주고받거나 같은 일을 중복하는 일이 흔합니다. 역할과 책임, 넘겨받을 산출물의 형식을 프롬프트에 명시하세요.
어느 단계에서든 위험한 행동에는 Human-in-the-loop, 품질 편차가 크면 Evaluator-Optimizer/Reflection을 덧붙입니다.