예시 없이 지시하는 제로샷부터 예시를 활용하는 퓨샷까지, 예시 기반 프롬프팅의 원리와 실전 활용 전략을 체계적으로 다룹니다.
대규모 언어 모델의 가장 놀라운 능력 중 하나는 인컨텍스트 학습(In-Context Learning, ICL)입니다. 별도의 파인튜닝 없이 프롬프트에 포함된 예시만으로 새로운 작업을 수행할 수 있는 능력을 말합니다.
전통적인 머신러닝에서는 새로운 작업을 학습하려면 대량의 학습 데이터로 모델을 재학습시켜야 했습니다. 하지만 LLM은 프롬프트에 몇 개의 예시를 포함하는 것만으로 해당 패턴을 파악하고 적용할 수 있습니다. 예시의 수에 따라 제로샷, 원샷, 퓨샷으로 구분합니다.
제로샷 프롬프팅(Zero-shot Prompting)은 예시 없이 지시사항만으로 모델에게 작업을 수행하게 하는 방식입니다. 모델이 사전 학습 과정에서 습득한 지식에 의존합니다.
제로샷은 모델이 이미 잘 알고 있는 일반적인 작업에 적합합니다.
다음 문장의 감성을 긍정, 부정, 중립 중 하나로 분류하세요.
문장: "이 제품은 가격 대비 성능이 뛰어나고 디자인도 깔끔합니다."
감성:번역, 요약, 감성 분류, 문법 교정 등 LLM이 학습 과정에서 충분히 접한 작업들은 제로샷만으로도 높은 정확도를 보여줍니다.
그러나 다음과 같은 경우에는 제로샷이 불안정한 결과를 내놓을 수 있습니다.
# 제로샷으로는 불안정한 예시
다음 고객 문의를 우리 회사의 카테고리로 분류하세요:
배송문의, 교환/반품, 결제오류, 제품불량, 기타
문의: "어제 주문한 상품의 송장번호를 알고 싶습니다"이 경우 모델은 "배송문의"와 "기타" 사이에서 일관되지 않은 선택을 할 수 있습니다. 각 카테고리의 경계가 모호하기 때문입니다.
퓨샷 프롬프팅(Few-shot Prompting)은 프롬프트에 입력-출력 쌍의 예시를 포함하여 모델이 원하는 패턴을 학습하게 하는 방식입니다.
다음 고객 문의를 카테고리로 분류하세요.
카테고리: 배송문의, 교환/반품, 결제오류, 제품불량, 기타
문의: "결제했는데 금액이 두 번 빠져나갔어요"
카테고리: 결제오류
문의: "받은 상품에 스크래치가 있습니다"
카테고리: 제품불량
문의: "택배가 아직 출발도 안 했는데 언제 오나요"
카테고리: 배송문의
문의: "어제 주문한 상품의 송장번호를 알고 싶습니다"
카테고리:예시를 통해 각 카테고리의 경계가 명확해지므로 모델의 분류 정확도가 크게 향상됩니다.
일반적으로 예시의 수가 늘어날수록 성능이 향상되지만, 수확 체감(diminishing returns)이 발생합니다.
| 예시 수 | 일반적인 효과 | 권장 상황 |
|---|---|---|
| 0개 (제로샷) | 기본 능력에 의존 | 일반적인 작업, 빠른 프로토타입 |
| 1-2개 | 형식과 톤 학습 | 출력 형식이 중요한 경우 |
| 3-5개 | 패턴 정밀 학습 | 분류, 추출 등 정확도가 중요한 작업 |
| 6개 이상 | 미세한 개선 | 복잡한 도메인, 엣지 케이스 처리 |
대부분의 작업에서 3-5개의 예시가 비용 대비 최적의 성능을 보여줍니다. 예시를 무한히 늘리는 것보다 예시의 품질과 다양성을 높이는 것이 더 효과적입니다.
퓨샷의 성능은 예시의 품질에 크게 좌우됩니다. 다음 원칙을 따르면 더 효과적인 예시를 설계할 수 있습니다.
예시가 한 쪽으로 편향되면 모델도 편향된 출력을 생성합니다. 가능한 모든 카테고리나 유형을 골고루 포함해야 합니다.
# 편향된 예시 (긍정만 3개)
리뷰: "훌륭합니다" -> 긍정
리뷰: "최고의 제품" -> 긍정
리뷰: "매우 만족" -> 긍정
# 균형 잡힌 예시
리뷰: "훌륭합니다" -> 긍정
리뷰: "그냥 평범합니다" -> 중립
리뷰: "절대 재구매 안 합니다" -> 부정명확한 예시만 제공하면 모호한 입력에 대한 판단 기준이 부족해집니다. 경계 사례(edge case)를 포함하면 모델의 판단이 더 정교해집니다.
# 경계 사례 포함
리뷰: "가격은 비싸지만 품질은 좋습니다" -> 긍정
리뷰: "디자인은 예쁜데 기능이 부족해요" -> 부정
리뷰: "보통입니다. 나쁘진 않은데 좋다고 하기도 어렵네요" -> 중립예시 간의 형식이 일관되어야 모델이 패턴을 정확하게 학습합니다.
# 비일관적 (형식이 제각각)
입력: "Hello" -> 출력: 인사말
"Good morning" - 이것은 인사말입니다
입력값 "Thank you" 의 분류: 감사 표현
# 일관적 (동일한 형식)
입력: "Hello" -> 분류: 인사말
입력: "Good morning" -> 분류: 인사말
입력: "Thank you" -> 분류: 감사 표현인위적으로 만든 예시보다 실제 데이터에서 선별한 예시가 더 효과적입니다. 실제 데이터의 노이즈, 오타, 비정형 표현을 모델이 학습할 수 있기 때문입니다.
모든 입력에 동일한 예시를 사용하는 대신, 입력과 가장 유사한 예시를 동적으로 선택하면 성능을 더 높일 수 있습니다.
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
def select_examples(query_embedding, example_embeddings, examples, k=3):
"""쿼리와 가장 유사한 k개의 예시를 선택합니다."""
similarities = cosine_similarity(
[query_embedding], example_embeddings
)[0]
top_indices = np.argsort(similarities)[-k:][::-1]
return [examples[i] for i in top_indices]
def build_prompt(query, selected_examples):
"""선택된 예시로 퓨샷 프롬프트를 구성합니다."""
prompt = "다음 고객 문의를 분류하세요.\n\n"
for ex in selected_examples:
prompt += "문의: " + ex["input"] + "\n"
prompt += "카테고리: " + ex["category"] + "\n\n"
prompt += "문의: " + query + "\n"
prompt += "카테고리:"
return prompt원하지 않는 출력의 예시를 함께 제공하면 모델이 더 정확한 경계를 학습합니다.
다음 텍스트에서 사람 이름만 추출하세요.
[올바른 예시]
텍스트: "김철수 부장이 삼성전자 회의에 참석했습니다."
이름: 김철수
[잘못된 예시 - 이렇게 하지 마세요]
텍스트: "김철수 부장이 삼성전자 회의에 참석했습니다."
이름: 김철수, 삼성전자
(설명: 삼성전자는 기업 이름이므로 사람 이름이 아닙니다)
텍스트: "이영희 과장과 박지민 사원이 서울역에서 만났습니다."
이름:프로덕션 환경에서 퓨샷을 사용할 때는 API 비용을 고려해야 합니다. 정적인 예시를 프롬프트 앞부분에 배치하면 프롬프트 캐싱의 이점을 받을 수 있습니다.
[캐싱 가능한 영역 - 정적 콘텐츠]
시스템 지시사항
퓨샷 예시들
도구 정의
[캐싱 불가능한 영역 - 동적 콘텐츠]
사용자의 실제 입력Anthropic의 프롬프트 캐싱은 정적 콘텐츠를 앞에 배치할 경우 비용을 최대 90%, 지연 시간을 최대 85% 줄일 수 있습니다. 퓨샷 예시는 변경 빈도가 낮으므로 캐싱의 좋은 후보입니다.
퓨샷 프롬프팅이 특히 효과적인 실전 사례를 살펴보겠습니다.
다음 이력서 텍스트에서 정보를 추출하여 지정된 형식으로 반환하세요.
[예시 1]
텍스트: "홍길동, 서울대학교 컴퓨터공학과 졸업(2018), 현재 네이버에서
시니어 백엔드 개발자로 근무 중. Python, Java, Go 사용. 경력 6년."
결과:
- 이름: 홍길동
- 학력: 서울대학교 컴퓨터공학과 (2018 졸업)
- 현직: 네이버, 시니어 백엔드 개발자
- 기술: Python, Java, Go
- 경력: 6년
[예시 2]
텍스트: "박소연 / KAIST 전산학부 석사(2020) / 前 카카오 ML 엔지니어,
현 토스 데이터팀 리드 / TensorFlow, PyTorch, Spark / 8년차"
결과:
- 이름: 박소연
- 학력: KAIST 전산학부 석사 (2020 졸업)
- 현직: 토스, 데이터팀 리드
- 기술: TensorFlow, PyTorch, Spark
- 경력: 8년
텍스트: "이준혁. 고려대 산업공학 학사, 연세대 데이터사이언스 석사(2021).
쿠팡 추천 시스템 개발 3년 후 현재 당근마켓 ML 파트장.
주력 스택은 Python과 SQL이며 AWS 인프라 경험 보유. 총 경력 5년."
결과:예시가 두 가지 다른 형식의 입력(자연문, 슬래시 구분)을 보여주므로, 세 번째 입력이 또 다른 형식이더라도 모델이 올바르게 추출할 수 있습니다.
어떤 방식을 사용할지 결정하는 실용적인 기준을 정리합니다.
| 기준 | 제로샷 선택 | 퓨샷 선택 |
|---|---|---|
| 작업 유형 | 일반적 (번역, 요약) | 도메인 특화 (커스텀 분류) |
| 출력 형식 | 자유 형식 | 엄격한 형식 |
| 비용 민감도 | 토큰 절약 필요 | 정확도가 우선 |
| 반복 빈도 | 일회성 작업 | 대량 반복 처리 |
| 프로토타입 단계 | 초기 탐색 | 프로덕션 배포 |
모든 예시가 명확한 경우만 다루면 모호한 입력에서 성능이 떨어집니다.
해결: 쉬운 예시와 어려운 예시를 혼합하여 모델이 경계를 학습하게 합니다.
퓨샷에서 잘못된 레이블이 포함된 예시는 모델의 성능을 저하시킵니다. 모델은 예시의 패턴을 충실하게 따르므로, 잘못된 패턴도 그대로 학습합니다.
해결: 예시의 정확성을 반드시 검증하고, 가능하면 도메인 전문가의 리뷰를 거칩니다.
연구에 따르면 예시의 순서가 모델 성능에 영향을 미칠 수 있습니다. 마지막 예시가 모델의 출력에 가장 큰 영향을 주는 경향이 있습니다.
해결: 가장 대표적인 예시를 마지막에 배치하거나, 순서를 무작위로 섞어 편향을 줄입니다.
이 장에서는 제로샷과 퓨샷 프롬프팅의 원리와 실전 활용법을 다루었습니다.
다음 장에서는 Chain-of-Thought(CoT) 추론 기법을 다루겠습니다. 복잡한 추론이 필요한 작업에서 모델에게 단계적 사고를 유도하는 방법과, 최신 추론 모델에서의 CoT 활용 전략을 살펴보겠습니다.
이 글이 도움이 되셨나요?
LLM에게 단계적 사고를 유도하는 Chain-of-Thought 프롬프팅의 원리, 변형 기법, 그리고 최신 추론 모델에서의 활용 전략을 다룹니다.
프롬프트 엔지니어링이 무엇이고 왜 중요한지, LLM과의 효과적인 소통을 위한 핵심 원칙과 기초 개념을 체계적으로 살펴봅니다.
LLM에게 전문가 역할을 부여하여 도메인 특화 응답을 이끌어내는 페르소나 설계의 원리와 실전 패턴을 체계적으로 다룹니다.