주요 프롬프트 기법 4가지의 정의와 각 프롬프팅별 테스트 결과를 정리해 보았습니다.
각 프롬프팅별 결과 테스트를 정리해 보았습니다.
Zero-Shot Prompting(제로샷 프롬프팅)
(1) 한 줄 정리
제로샷 프롬프팅은 LLM에게 별도의 예시나 사전 학습 데이터 없이 바로 작업을 수행하도록 지시하는 기법입니다.
(2) 핵심 원리
별도의 예시 없이 해당 모델이 이미 데이터를 통해 학습한 지식을 바탕으로 결과물을 추론하여 도출하는 방식입니다.
(3) 사용 예시
광화문 BTS 공연이라는 특정 상황에 대해 정해진 양식 없이 질문한 예시입니다.
→ 이렇게 제로샷 프롬프트의 경우 질문에 따라 추론되어 자유로운 형태의 답변을 받게 됩니다.
| 구분 | 질문 1(자유 추론) | 질문 2(형식 지정) |
|---|---|---|
| 프롬프트 | 키워드 기반의 정보 요청 | 명확한 출력 형식(표) 지시 |
| 추론 방식 | 가장 보편적인 보고서 맥락 선택 | 지시어에 따른 구조적 변환 |
| AR 특징 | 문맥의 일관성을 유지하는 서술적 생성 | 특정 기호(표)에 고착된 패턴 생성 |
(4) 사용처
언제 사용하면 좋을까?
언제 효과가 적을까?
Few-Shot Prompting(퓨샷 프롬프팅)
(1) 한 줄 정리
퓨샷 프롬프팅은 원하는 결과에 대한 예시를 먼저 제시하여 LLM이 추론하는 데 필요한 패턴과 형식을 컨텍스트로 학습시키는 방법입니다.
(2) 핵심 원리
: 모델을 별도로 학습시키지 않고 입력된 문맥만으로 모델의 행동을 변화시키는 문맥 내 학습을 핵심으로 합니다.
→ 퓨샷 프롬프팅은 "명령(Instruction)"만으로는 부족한 작업의 "답변 패턴(Pattern)"과 "출력 형식(Format)"을 데모(예시)로 직접 보여 줌으로써, 모델이 방대한 지식 중 사용자가 원하는 특정 맥락에 빠르게 안착(Anchoring)하도록 유도하는 기법입니다.
확률 분포에서의 강력한 조건부 역할
레이블 공간과 형식
(3) 사용 예시
**Prompt:**
문장에서 이름, 직업, 거주지를 추출하여 JSON 형식으로 출력하세요.
**입력:** "서울에 사는 프론트엔드 개발자 김철수 씨는 오늘 연차입니다."
**출력:** {"name": "김철수", "job": "개발자", "location": "서울"}
**입력:** "부산에서 카페를 운영하는 박영희 사장님을 만났습니다."
**출력:** {"name": "박영희", "job": "자영업자", "location": "부산"}
**입력:** "도쿄에서 요리사로 일하는 사토 씨가 한국에 왔습니다."
**출력:**
→ 결과: {"name": "사토", "job": "요리사", "location": "도쿄"}
(4) 사용처
언제 사용하면 좋을까?
언제 효과가 적을까?
다단계 논리 추론: 수학 문제나 코딩처럼 단계별 사고가 필요한 경우에는 정확도가 떨어진다.
맥락 창(Context Window)이 좁은 모델: 예시가 너무 길어지면 실제 질문에 할당될 문맥 용량이 부족해질 수 있다.
Chain-of-Thought(CoT)[생각의 사슬]
(1) 한 줄 정리
CoT는 복잡한 문제를 한 번에 해결하지 않고 논리적인 중간 추론 단계를 순차적으로 생성하여 정답의 정확도를 높이는 기법입니다.
(2) 핵심 원리
→ 복잡한 문제를 추론하기 어려운 프롬프팅의 한계를 개선하기 위해, "결과(Result)"가 아닌 "사고의 과정(Reasoning)"을 퓨샷 데모로 제공하여 모델이 스스로 정답에 도달하기 위한 중간 논리 단계를 생성하도록 유도하는 기법입니다.
추론을 통한 계산 공간을 확보합니다.
Zero-shot CoT
Auto-CoT
수작업으로 CoT 예시를 만드는 번거로움을 해결하고 예시의 편향성을 줄일 수 있습니다.
질문 클러스터링
휴리스틱 필터링
(3) 사용 예시
Prompt
**[Task]** Next.js FSD 구조에 맞춰 '상품 목록(Product List)' 기능을 구현하세요.
**[FSD Folder Rule]**
- `api/`: 외부 통신 로직(Fetcher)
- `model/`: 상태 관리 및 비즈니스 로직(Hooks, Types)
- `ui/`: UI 컴포넌트
**사고 과정(CoT)**
- 유저 데이터를 가져오는 API 호출 함수는 `features/user/api/`에 위치해야 함.
- 이 API를 호출하고 상태를 관리하는 리액트 훅은 `features/user/model/`에 위치해야 함.
- 외부에서는 이 훅을 통해 데이터에 접근함.
**Result**(파일 코드 생략)
- features/product-list/api/get-products.ts
- features/product-list/model/use-products.ts
(4) 사용처
언제 사용하면 좋을까?
언제 효과가 적을까?
실시간 응답이 필수인 경우: 추론 과정만큼 출력 토큰이 늘어나 응답 속도(Latency)가 느려집니다.
단순 사실 확인: "대한민국의 수도는?" 같은 질문에 추론 단계를 넣는 것은 비효율적입니다.
Self-Consistency[자기 일관성]
(1) 한 줄 정리
하나의 고정된 추론 경로만 따라가지 않고 여러 개의 다양한 추론 경로를 독립적으로 생성하고, 가장 많이 도출된 공통 답변을 최종 정답으로 선택하는 기법입니다.
(2) 핵심 원리
→ 단일 추론 경로에서 발생할 수 있는 우발적 오류(Greedy Decoding의 한계)를 극복하기 위해 여러 번의 '생각의 사슬(CoT)'을 시도하여 결과의 신뢰도와 일관성을 확보합니다.
탐욕적 디코딩(Greedy Decoding) 대체
추론 경로의 다양성 확보
(3) 사용 예시
→ 사용 예시: FSD 아키텍처 리팩토링 검증
Scenario: components/Login.tsx라는 거대하고 지저분한 레거시 파일을 FSD 구조로 분리하라는 임무를 받은 에이전트.
**Prompt**
**[Task]** 다음 레거시 파일을 FSD 구조에 맞게 리팩토링할 계획을 세우세요.
**[Rule]** 파일명과 상세 경로를 반드시 명시하세요.
**[File]** components/Login.tsx (API 호출, 유효성 검사, UI가 모두 섞여 있음)
**Reasoning Paths (에이전트가 내부적으로 생성한 3가지 제안)**
• **시뮬레이션 1:** * API 로직 추출 → `features/auth/api/login.ts`
◦ 상태 관리 추출 → `features/auth/model/use-login.ts`
◦ UI 분리 → `features/auth/ui/login-form.tsx`
◦ **결정:** **`features/auth` 슬라이스로 통합.**
• **시뮬레이션 2:** * API 로직 추출 →`shared/api/auth.ts`
◦ 상태 관리 추출 → `features/auth/model/use-login.ts`
◦ UI 분리 → `features/auth/ui/login-form.tsx`
◦ **결정:** **API는 `shared`로, 나머지는 `features/auth`로 분리.**
• **시뮬레이션 3:** * API 로직 추출→ `features/auth/api/login.ts`
◦ 상태 관리 추출 → `features/auth/model/use-login.ts`
◦ UI 분리 → `features/auth/ui/login-form.tsx`
◦ **결정:** **`features/auth` 슬라이스로 통합.**
**Result (최종 의사결정)**
**[Selection]** 시뮬레이션 1과 3이 동일한 구조를 제안함.
에이전트는 **`features/auth` 내부에 모든 로직을 캡슐화하는 방안**이 가장 일관성 있다고 판단하여 해당 경로로 파일 생성을 시작함.
(4) 사용처
언제 사용하면 좋을까?
언제 효과가 적을까?
비용과 속도가 중요한 경우
창의적인 결과 도출이 필요한 경우
실습 및 결과 정리([LLM 실습] 의료급여 본인부담률 추출 실험: 프롬프트 기법별 성능 비교)
: 본 포스팅에서는 의료급여 본인부담률 데이터를 바탕으로 다양한 프롬프트 엔지니어링 기법(Zero-shot, Few-shot, CoT, Self-Consistency)이 LLM의 정답률에 미치는 영향을 실험하고 그 결과를 정리합니다.
실습 진행 전 데이터의 특성과 모델의 능력을 고려하여 아래와 같은 가설을 세웠습니다.
1) Zero-shot(Step 1) 정답률 예측
| 난이도 | 정답률(예측) | 판단 근거 |
|---|---|---|
| Easy | 90%~100% | 단순 키워드 매칭 및 표 내용 추출 단계 |
| Medium | 70%~80% | 다중 조건(예: 2종 + 특정 질환 + 시술) 결합 시 오류 가능성 |
| Hard | 약 50% | 수치 연산과 추론 로직 결합 지점에서 환각 위험 높음 |
2) 가장 큰 개선이 일어날 난이도 예측
3) 가장 큰 정답률 점프가 일어날 기법
실행 환경
gemini-2.5-flash-lite(OpenAI 호환 엔드포인트)openai Python SDK, pydantic(구조화된 출력 검증)extracted-reference.md를 공통 참조 데이터로 사용프롬프트 전략
모든 Step에서 구조화된 출력(JSON)을 강제하여 평가의 객관성을 확보했습니다.
JSON
{ "answer": "최종 답안", "reason": "판단 근거 요약" }
| Step | 프롬프트 구성 | 정확도 | 평균 토큰/문항 | 비고 |
|---|---|---|---|---|
| Zero-shot | 참조 데이터 + 직접 추론 | 0.9333 | 1,458 | 예측 상회(기본 성능 우수) |
| Few-shot | 예시 3개 추가 | 1.0 | 1,816 | 정답률 100% 도달 |
| CoT | 추론 단계 유도 | 1.0 | 1,993 | 초기 설계 시 형식 흔들림 주의 |
| Self-Consistency | 다수결 채택 | 1.0 | 6,741 | 비용/시간 대폭 증가 |
실험 전 세운 가설과 실제 데이터를 대조해 본 결과, 몇 가지 흥미로운 점을 발견했습니다.
가설 1: Zero-shot 정답률은 70% 이상일 것이다?(적중)
실제 결과는 93.3%로 가설을 크게 상회했습니다. 텍스트로 잘 정리된 extracted-reference.md를 제공하자 모델이 Hard 난이도에서도 뛰어난 추론 능력을 보여 주었습니다. "데이터 전처리의 중요성"을 다시 한번 확인했습니다.
가설 2: Medium 난이도에서 가장 큰 개선이 있을 것이다?(불일치)
실제로는 Hard 난이도에서 실질적인 개선이 일어났습니다. Zero-shot에서 이미 Medium이 완벽에 가까웠기에, 남은 오답 2개를 해결한 Few-shot과 CoT의 기여는 Hard 문항에 집중되었습니다.
가설 3: CoT가 가장 큰 점프를 만들 것이다?(불일치)
가장 큰 정답률 점프는 Few-shot(0.9333 → 1.0)에서 발생했습니다. 이번 실험처럼 정답 형식이 고정된(Exact Match) 과제에서는 복잡한 추론 과정보다 "이런 형식으로 답하라"는 명확한 예시가 더 강력한 트리거가 됨을 배웠습니다.
결론 및 느낀 점
참고 문헌