기초를 넘어: 한계 극복 기법들
앞서 배운 CoT, Few-shot, 역할 부여는 강력하지만 한계가 있습니다.
- 최신 정보가 없음 → LLM 지식 컷오프
- 계산이 틀릴 수 있음 → 수학적 오류
- 같은 질문에 다른 답 → 일관성 부족
- 프롬프트 작성이 어려움 → 설계 비용
이 한계를 극복하는 고급 기법들을 살펴봅니다.
기법 1: ReAct (Reason + Act)
**추론(Reason)**과 **행동(Act)**을 교차하며 문제를 해결하는 패턴입니다.
flowchart TB
Q["질문"] --> T1
subgraph LOOP["ReAct 사이클"]
T1["🧠 생각 (Thought)\n'무엇을 해야 하는가?'"]
A1["⚡ 행동 (Action)\n'도구를 실행한다'"]
O1["👁️ 관찰 (Observation)\n'결과를 확인한다'"]
T2["🧠 다음 생각\n'결과로 무엇을 알 수 있나?'"]
T1 --> A1 --> O1 --> T2
T2 -->|"목표 달성 전"| A2["다음 행동"]
end
T2 -->|"목표 달성"| ANS["최종 답변"]
ReAct 프롬프트 구조
다음 형식으로 문제를 해결해줘:
생각: [현재 상황 분석]
행동: [실행할 작업] (검색("쿼리"), 계산("수식"), 읽기("파일"))
관찰: [행동 결과]
생각: [결과 해석]
... (반복)
최종 답변: [결론]
---
질문: 2024년 한국 반도체 수출 금액과 2023년 대비 변화율은?
ReAct는 AI 에이전트 구현의 핵심 패턴이기도 합니다. 도구(검색, 계산, API)를 LLM과 연결할 때 사용합니다.
기법 2: 자기 일관성 (Self-Consistency)
같은 질문을 여러 번 독립적으로 추론시키고 다수결로 최종 답변을 결정합니다.
flowchart TB
Q["동일한 질문"]
Q --> P1["추론 경로 1\n→ 답 A"]
Q --> P2["추론 경로 2\n→ 답 A"]
Q --> P3["추론 경로 3\n→ 답 B"]
Q --> P4["추론 경로 4\n→ 답 A"]
Q --> P5["추론 경로 5\n→ 답 A"]
P1 & P2 & P3 & P4 & P5 --> VOTE["다수결\nA: 4표 / B: 1표"]
VOTE --> FINAL["최종 답변: A\n(신뢰도 80%)"]
자기 일관성 활용 예시
아래 문제를 3가지 다른 방식으로 각각 독립적으로 풀어줘.
각 풀이는 서로 참조하지 않고 독립적으로 작성해.
마지막에 3개의 답변을 비교하고 다수결로 최종 답을 결정해줘.
문제: [복잡한 추론 문제]
단일 추론보다 신뢰도가 높아지지만 비용(토큰)이 N배 됩니다. 중요한 의사결정에만 활용하세요.
기법 3: 메타 프롬프팅
프롬프트를 생성하는 프롬프트입니다. LLM에게 좋은 프롬프트를 설계하게 시킵니다.
flowchart LR
GOAL["목표 설명"] -->|"메타 프롬프트"| LLM1["LLM\n(프롬프트 설계자)"]
LLM1 --> PROMPT["최적화된 프롬프트"]
PROMPT -->|"실제 작업"| LLM2["LLM\n(실행자)"]
LLM2 --> RESULT["결과"]
메타 프롬프팅 예시
나는 이런 작업을 하려고 해:
"고객 리뷰 텍스트에서 감정(긍정/부정/중립)과
주요 키워드를 추출하고 구조화된 JSON으로 출력"
이 작업을 위한 최적의 시스템 프롬프트와 사용자 프롬프트 템플릿을
설계해줘. 실제 예시 2개도 포함해줘.
활용 상황:
- 프롬프트 작성에 익숙하지 않을 때
- 새로운 작업 유형의 프롬프트가 필요할 때
- 기존 프롬프트 품질을 개선하고 싶을 때
기법 4: 프롬프트 체이닝
복잡한 작업을 여러 단계로 나눠 순차적으로 처리합니다.
flowchart LR
IN["원본 입력"]
subgraph CHAIN["프롬프트 체인"]
S1["단계 1\n요약 추출"]
S2["단계 2\n핵심 논점 분석"]
S3["단계 3\n반론 생성"]
S4["단계 4\n최종 보고서 작성"]
S1 --> S2 --> S3 --> S4
end
IN --> S1
S4 --> OUT["최종 결과물"]
체이닝 예시: 컨텐츠 파이프라인
# 의사코드
step1 = llm("다음 원문에서 핵심 사실만 3개 추출: {raw_text}")
step2 = llm(f"이 3가지 사실을 기반으로 블로그 개요 작성: {step1}")
step3 = llm(f"이 개요로 2000자 블로그 글 작성: {step2}")
step4 = llm(f"이 글에서 SNS용 요약 트윗 3개 생성: {step3}")
각 단계의 출력이 다음 단계의 입력이 됩니다.
기법 5: 역할 역전 (Flipped Interaction)
LLM이 질문을 받는 것이 아니라 사용자에게 질문하게 만듭니다.
flowchart LR
subgraph FLIP["역할 역전 패턴"]
U["사용자\n'앱 기획 도와줘'"]
L["LLM\n'타겟 사용자는 누구인가요?\n주요 기능 3가지는? 예산 범위는?'"]
U2["사용자\n답변 제공"]
L2["LLM\n충분한 정보로\n구체적 기획안 제공"]
end
U --> L --> U2 --> L2
나는 [목표]를 달성하고 싶어. 최적의 결과를 위해
나에게 필요한 정보를 질문해줘. 충분한 정보를 얻으면
그 때 [결과물]을 생성해줘.
초안을 먼저 받는 것보다 맥락 수집 후 생성이 훨씬 정확한 결과를 냅니다.
기법 선택 가이드
flowchart TD
Q["어떤 상황인가?"]
Q -->|"도구 사용 + 복잡한 추론"| R1["ReAct"]
Q -->|"중요한 판단, 높은 정확도 필요"| R2["자기 일관성"]
Q -->|"프롬프트 설계가 막막함"| R3["메타 프롬프팅"]
Q -->|"복잡한 다단계 작업"| R4["프롬프트 체이닝"]
Q -->|"사용자 요구사항이 불명확"| R5["역할 역전"]
실전: 기법 결합하기
실제 AI 서비스에서는 여러 기법을 동시에 씁니다.
[시스템 프롬프트] ← pe-04
당신은 수석 전략 컨설턴트입니다.
[역할 역전] ← 이번 편
클라이언트의 비즈니스 상황을 파악하기 위해
먼저 5개 핵심 질문을 해주세요.
[CoT 유도] ← pe-03
충분한 정보 수집 후, 단계별로 분석하여
전략 보고서를 작성해주세요.
[출력 형식]
보고서는 다음 구조로 작성합니다:
1. 현황 분석
2. 핵심 문제 정의
3. 전략 옵션 3가지 (장단점 비교)
4. 권고안
프롬프트 엔지니어링 전체 정리
flowchart TB
subgraph PE["프롬프트 엔지니어링 기법"]
direction LR
B["기초\n명확성·구체성·구조화"]
R["역할+Few-shot\n페르소나·예시 학습"]
C["CoT\n단계별 추론"]
S["시스템 프롬프트\n서비스 행동 제어"]
A["고급 기법\nReAct·자기일관성\n메타·체이닝·역전"]
end
B --> R --> C --> S --> A
| 기법 | 효과 | 비용 |
|---|---|---|
| 명확성·구체성 | 기본 품질 향상 | 낮음 |
| 역할+Few-shot | 일관성·전문성 | 중간 |
| CoT | 추론 정확도 | 중간 |
| 시스템 프롬프트 | 서비스 일관성 | 낮음 |
| 자기 일관성 | 신뢰도 최대화 | 높음 (N배) |
| ReAct | 도구 활용 | 높음 |
| 체이닝 | 복잡한 작업 | 높음 |
이것으로 프롬프트 엔지니어링 시리즈를 마칩니다. 다음은 LLM API 개발 — 실제 코드로 LLM을 제어하고 서비스를 만드는 실습을 시작합니다.