작업: 사용자 피드백을 '기능 요청', '버그 신고', '사용법 문의' 세 범주로 AI가 분류하게 만들기.
레벨 1: 좋은 예시 설계하기서로 다른 경우를 포괄하면서 형식이 일관된 few-shot 예시 3개를 설계해 보세요.
학습 목표:
- zero-shot, one-shot, few-shot의 차이 이해하기
- 예시 2~5개로 AI가 패턴을 파악하게 만들기
- 좋은 예시를 고르는 원칙 익히기
전제: << 레슨 2: 프롬프트의 기본 구조 | 다음: 레슨 4 >>
AI가 특정 형식으로 데이터를 출력하기를 바랄 때가 있습니다. 이를테면 '이 글에서 핵심 사실을 뽑아 JSON으로 돌려줘' 같은 요청입니다. 프롬프트에서 필드명, 데이터 타입, 중첩 구조까지 한참을 설명했는데도, AI는 여러분이 머릿속에 그린 것과 다른 모양의 결과를 내놓습니다.
다른 방법을 써 보세요. 형식을 설명하는 대신 깔끔한 예시 2~3개를 AI에게 보여 주는 것입니다. AI는 그것을 읽고 여러분이 원하는 바를 정확히 파악해, 첫 시도에서 형식을 맞춥니다. 이것이 few-shot 학습의 힘입니다. 예시 하나가 설명 한 문단보다 명확합니다1.
few-shot 학습은 소수의 예시(보통 2~5개)를 프롬프트 안에 넣어 원하는 패턴 쪽으로 AI를 이끄는 프롬프트 기법입니다2 1. AI는 그 예시들에서 입력과 출력의 관계, 형식, 문체를 배우고, 그것을 새로운 입력에 적용합니다.
비교해 볼 세 가지 방식이 있습니다.
Zero-shot 프롬프트:
AI는 이렇게 답할 수 있습니다.
예시가 없으면 AI는 애매한 경우를 자기 판단에만 기대어 처리할 수밖에 없습니다.
Few-shot 프롬프트:
예시를 본 뒤 AI는 이렇게 이해합니다.
그래서 AI는 '중립'을 돌려줍니다. 이 리뷰가 세 번째 예시의 패턴과 맞아떨어지기 때문입니다.
few-shot 학습은 대규모 언어 모델의 인컨텍스트 학습(in-context learning) 능력을 활용합니다2. 모델을 다시 학습시키는 것이 아니라, 지금의 대화 안에서 예시 몇 개를 보고 규칙을 추론해 적용하는 것입니다.
모델은 예시에서 세 종류의 정보를 얻습니다.
핵심 연구 결과: 연구에 따르면 예시 하나하나가 정확한지보다 예시의 형식과 다양성이 더 중요합니다2. 예시 안의 레이블 몇 개가 틀렸더라도, 형식이 일관되고 예시가 서로 다른 종류의 입력을 포괄하기만 하면 AI는 여전히 쓸 만한 패턴을 배울 수 있습니다.
아무 예시나 몇 개 던져 넣어서는 안 됩니다. 예시의 품질이 AI의 결과물을 그대로 좌우합니다1.
2개로 시작하고, 결과가 충분히 좋지 않을 때만 세 번째와 네 번째를 더하세요1.
예시는 그 작업이 마주할 수 있는 서로 다른 종류의 입력을 포괄해야 합니다. 이것이 예시의 다양성입니다2.
다양성이 부족한 예시:
모든 예시가 휴대폰입니다. AI는 다른 종류의 전자 제품을 본 적이 없으니, 그런 것이 오면 어떻게 처리할지 모를 수 있습니다.
다양성을 갖춘 예시:
서로 다른 제품 범주를 포괄하므로 AI는 더 일반적인 분류 논리를 배울 수 있습니다.
형식의 일관성은 few-shot 프롬프트가 성공하는 열쇠입니다2.
일관되지 않은 형식:
형식이 제각각이라 AI는 '긍정'을 출력해야 할지, '긍정 감정'을 출력해야 할지, 또 다른 무언가를 출력해야 할지 알 수 없습니다.
일관된 형식:
깔끔하고 균일해서 AI는 출력이 형용사 하나여야 한다는 것을 압니다.
작업에 회색 지대가 있다면 그것을 예시에 넣으세요1.
상황: 코드 주석이 쓸모 있는지 판단하기
뻔한 예시만 있을 때:
엣지 케이스를 포함했을 때:
예시 3과 4는 AI가 경계를 파악하도록 돕습니다. '코드가 무엇을 하는지 설명하는' 주석이라고 해서 모두 쓸모 있는 것은 아닙니다. 중요한 것은 코드가 이미 스스로 의도를 분명히 드러내고 있는지입니다.
여기서 가장 흔한 작업은 비구조화된 텍스트에서 구조화된 데이터를 뽑아내는 것입니다.
Zero-shot 버전(불안정):
AI는 온갖 형식을 돌려줄 수 있습니다.
또는
필드명도, 형식도, 단위도 모두 제각각입니다.
Few-shot 버전(안정된 형식):
예시들이 세 가지 급여 단위(연봉, 월급, 시급)와 세 가지 근무지 유형(도시, 도시와 세부 지역, 원격)을 포괄하므로 AI는 다음을 배웁니다.
예시를 하나만 주면 AI는 규칙이 아니라 사례 하나를 볼 뿐입니다.
해결: 최소 2개, 가능하면 3개.
여기서는 화살표 →, 저기서는 콜론 :, 또 다른 곳에서는 여러 줄로 씁니다.
해결: 형식 하나를 정하고 모든 예시에서 엄격하게 지킵니다.
실제 데이터에는 잡음과 모호함, 빈 곳이 있습니다. 예시가 이상적인 경우만 보여 주면 AI는 엣지 케이스를 만나는 순간 멈춰 섭니다.
해결: 최소 한 개의 예시에는 엣지 케이스를 넣습니다(빠진 필드, 애매한 표현 등).
예시가 5개를 넘어가면 얻는 것은 미미하고, 토큰을 더 쓰며 응답만 길어집니다.
해결: 2~3개로 시작하고 필요할 때만 늘립니다. 5개를 넘길 일은 거의 없습니다.
few-shot은 이런 상황에 가장 잘 맞습니다.
잘 맞지 않는 경우는 이렇습니다.
경험칙 하나. 사람 동료에게 예시 2~3개를 보여 주면 무엇을 해야 할지 알아들을 만한 일이라면, few-shot이 잘 맞습니다.
few-shot 학습은 예시 25개로 AI가 원하는 패턴을 파악하게 만드는 방법이며, 말로 설명하는 것보다 명확하다. 좋은 예시의 조건은 이렇다. 개수가 적당하고(25개), 대표성과 다양성을 갖추고, 형식이 동일하며, 엣지 케이스를 포함한다.
few-shot은 형식 변환, 분류, 문체 모방에 가장 잘 맞는다. 예시를 설계할 때는 2개로 시작하고, 서로 다른 종류의 입력을 포괄하는지 확인하며, 모든 예시에 같은 형식을 쓴다.
다음 레슨에서는 chain-of-thought를 다룹니다. AI가 추론 단계를 드러내게 해서 복잡한 작업의 정확도를 끌어올리는 방법입니다.
다음 레슨 Chain-of-Thought: AI가 추론 과정을 보여주게 하기 >>
Few-Shot Prompting Guide — https://www.prompthub.us/blog/the-few-shot-prompting-guide ↩ ↩2 ↩3 ↩4 ↩5
Prompt Engineering Guide - Few-Shot Prompting — https://www.promptingguide.ai/techniques/fewshot ↩ ↩2 ↩3 ↩4 ↩5 ↩6
Zero-shot Learning - Wikipedia — https://en.wikipedia.org/wiki/Zero-shot_learning ↩
서로 다른 경우를 포괄하면서 형식이 일관된 few-shot 예시 3개를 설계해 보세요.
문제: AI의 출력이 불안정합니다. 필드명이 다른 언어로 나오기도 하고, 장점이 구체적인 항목('품질')이 아니라 형용사('좋음')로 나오기도 합니다.
아래 사용자 리뷰를 "긍정", "부정", "중립" 중 하나로 분류해 주세요.
리뷰: 제품은 잘 작동하는데, 가격이 조금 비싸네요.분류:사용자 리뷰를 "긍정", "부정", "중립"으로 분류해 주세요.
예시:
리뷰: 마감이 훌륭해요, 아주 만족합니다.분류: 긍정
리뷰: 전혀 쓸 수가 없네요, 돈 낭비였습니다.분류: 부정
리뷰: 기능은 괜찮은데 고객 지원이 느립니다.분류: 중립
이제 이 리뷰를 분류해 주세요.
리뷰: 제품은 잘 작동하는데, 가격이 조금 비싸네요.분류:예시 1: iPhone 15 Pro → 휴대폰예시 2: iPhone 14 → 휴대폰예시 3: iPhone 13 → 휴대폰
이제 분류: MacBook Pro예시 1: iPhone 15 Pro → 휴대폰예시 2: MacBook Air → 노트북예시 3: AirPods Pro → 이어폰
이제 분류: iPad Pro예시 1:입력: 날씨 참 좋다출력: 긍정
예시 2:"이 영화 진짜 지루했다" --> 부정 감정
예시 3: 그냥 그렇다 → 중립예시 1:입력: 날씨 참 좋다출력: 긍정
예시 2:입력: 이 영화 진짜 지루했다출력: 부정
예시 3:입력: 그냥 그렇다출력: 중립예시 1:코드: x = x + 1 # 1 더하기판정: 쓸모없음 (주석이 코드를 그대로 반복한다)
예시 2:코드: result = calculate_tax(income, deductions) # 납부할 세금 계산판정: 쓸모 있음 (업무적 의미를 설명한다)예시 1:코드: x = x + 1 # 1 더하기판정: 쓸모없음 (주석이 코드를 그대로 반복한다)
예시 2:코드: result = calculate_tax(income, deductions) # 납부할 세금 계산판정: 쓸모 있음 (업무적 의미를 설명한다)
예시 3:코드: time.sleep(2) # API 레이트 리밋이 풀릴 때까지 대기판정: 쓸모 있음 (왜 기다리는지를 설명하며, 이는 드러나 있지 않다)
예시 4:코드: users = users.filter(active=True) # 활성 사용자 필터링판정: 쓸모없음 (메서드 이름만으로 이미 분명하다)아래 채용 공고에서 다음을 추출해 주세요: 직무명, 연봉 범위, 근무지,요구 경력. JSON으로 돌려주세요.
채용 공고: 시니어 Python 개발자를 채용합니다, 서울 근무, 3~5년 경력,연봉 9000만~1억 원.{"title": "Python 개발자", "pay": "9000만~1억", ...}
{"job": "시니어 Python 개발자", "salary": "연봉 9000만~1억 원", ...}
채용 공고에서 핵심 필드를 추출해 아래 JSON 형식으로 돌려주세요.
예시 1:입력: 프론트엔드 엔지니어 채용, 판교, 2~3년 경력, 연봉 6000만~7500만 원출력:{ "position": "프론트엔드 엔지니어", "location": "판교", "experience": "2~3년", "salary": "연봉 6000만~7500만 원"}
예시 2:입력: 급구: Java 백엔드, 부산(서면), 5년 이상 필수, 월급 500만~700만 원출력:{ "position": "Java 백엔드", "location": "부산(서면)", "experience": "5년 이상", "salary": "월급 500만~700만 원"}
예시 3:입력: 데이터 분석가, 원격, 경력 무관, 시급 4만~6만 원출력:{ "position": "데이터 분석가", "location": "원격", "experience": "무관", "salary": "시급 4만~6만 원"}
이제 이것을 처리해 주세요:입력: 시니어 Python 개발자를 채용합니다, 서울 근무, 3~5년 경력,연봉 9000만~1억 원.출력:제품 리뷰에서 장점과 단점을 뽑아서 JSON으로 출력해 줘.
예시:"품질 괜찮음" -> {"pros": ["품질"], "cons": []}"너무 비싸고 배송도 느림" -> {"pros": [], "cons": ["비쌈", "배송 지연"]}
이제 처리해 줘: [리뷰 텍스트]