🤖 AI/ML

Zero-shot

제로샷

예시 없이 새 작업 수행. LLM의 일반화 능력을 활용한 프롬프트 기반 추론 방식.

📖 상세 설명

Zero-shot(제로샷)은 AI 모델이 특정 작업에 대한 학습 예시 없이, 오직 자연어 지시(instruction)만으로 작업을 수행하는 방식을 말합니다. "0개의 샷(예시)"으로 작업한다는 의미에서 유래했으며, Few-shot(몇 개의 예시), One-shot(한 개의 예시)과 대비되는 개념입니다.

Zero-shot의 개념은 전통적 머신러닝에서는 불가능한 것으로 여겨졌습니다. 모델이 특정 작업을 수행하려면 해당 작업의 학습 데이터가 필수였기 때문입니다. 하지만 GPT-3(2020) 이후 대규모 언어 모델들이 사전 학습 과정에서 충분히 다양한 작업 패턴을 학습하면서, 명시적 예시 없이도 지시를 이해하고 수행할 수 있게 되었습니다.

Zero-shot이 작동하는 원리는 모델의 "창발적 능력(emergent capabilities)"에 기반합니다. 대규모 텍스트 코퍼스에서 학습하는 과정에서 모델은 질문-답변, 번역, 요약 등 다양한 작업의 패턴을 암묵적으로 습득합니다. "다음 문장을 한국어로 번역하세요"라는 지시만으로 번역을 수행할 수 있는 것은, 학습 데이터에 유사한 패턴이 포함되어 있었기 때문입니다.

실무에서 Zero-shot은 빠른 프로토타이핑, 레이블 데이터가 없는 상황, 또는 다양한 작업을 단일 모델로 처리해야 할 때 유용합니다. 다만 복잡한 도메인 특화 작업에서는 정확도가 낮을 수 있어, 상황에 따라 Few-shot이나 Fine-tuning과 조합해서 사용합니다.

💻 코드 예제

# Zero-shot 프롬프팅 비교 예제
from openai import OpenAI
from anthropic import Anthropic

# OpenAI Zero-shot
openai_client = OpenAI(api_key="your-openai-key")

def zero_shot_openai(task_description: str, input_text: str) -> str:
    """
    Zero-shot: 예시 없이 작업 설명만으로 수행
    """
    response = openai_client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": task_description},
            {"role": "user", "content": input_text}
        ],
        temperature=0
    )
    return response.choices[0].message.content

# Claude Zero-shot
anthropic_client = Anthropic(api_key="your-anthropic-key")

def zero_shot_claude(task_description: str, input_text: str) -> str:
    """
    Claude에서의 Zero-shot 프롬프팅
    """
    message = anthropic_client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=1000,
        messages=[{
            "role": "user",
            "content": f"{task_description}\n\n입력: {input_text}\n\n출력:"
        }]
    )
    return message.content[0].text

# Zero-shot vs Few-shot 비교
def compare_approaches(text: str) -> dict:
    """
    동일한 작업에 대해 Zero-shot과 Few-shot 결과 비교
    """
    # Zero-shot: 지시만 제공
    zero_shot_prompt = """다음 텍스트가 긍정적(positive), 부정적(negative), 중립적(neutral) 중
어떤 감정인지 판단하세요. 감정 레이블만 출력하세요."""

    zero_result = zero_shot_openai(zero_shot_prompt, text)

    # Few-shot: 예시 포함
    few_shot_prompt = """다음 텍스트의 감정을 분류하세요.

예시 1:
텍스트: "이 영화 정말 재미있었어요!"
감정: positive

예시 2:
텍스트: "서비스가 너무 느려서 화가 났습니다."
감정: negative

예시 3:
텍스트: "오늘 날씨는 맑습니다."
감정: neutral

이제 아래 텍스트를 분류하세요:"""

    few_result = zero_shot_openai(few_shot_prompt, text)

    return {
        "text": text,
        "zero_shot": zero_result,
        "few_shot": few_result
    }

# Zero-shot Chain-of-Thought (CoT)
def zero_shot_cot(question: str) -> str:
    """
    Zero-shot CoT: "단계별로 생각해보세요" 추가로 추론 능력 향상
    """
    prompt = f"""{question}

단계별로 생각해보세요."""

    response = openai_client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        temperature=0
    )
    return response.choices[0].message.content

# 다양한 Zero-shot 작업 예제
def demonstrate_zero_shot_tasks():
    # 1. 번역 (Zero-shot)
    translation = zero_shot_openai(
        "한국어를 영어로 번역하세요.",
        "인공지능이 세상을 바꾸고 있습니다."
    )
    print(f"번역: {translation}")

    # 2. 요약 (Zero-shot)
    summary = zero_shot_openai(
        "다음 텍스트를 한 문장으로 요약하세요.",
        """
        기계학습은 컴퓨터가 명시적으로 프로그래밍되지 않아도
        데이터로부터 학습할 수 있게 하는 인공지능의 한 분야입니다.
        다양한 알고리즘을 사용하여 패턴을 인식하고 예측합니다.
        """
    )
    print(f"요약: {summary}")

    # 3. NER (Zero-shot)
    ner = zero_shot_openai(
        "텍스트에서 인명, 조직명, 장소명을 추출하세요. JSON 형식으로 출력하세요.",
        "이재용 삼성전자 회장이 서울에서 기자회견을 열었습니다."
    )
    print(f"NER: {ner}")

    # 4. 추론 with CoT (Zero-shot)
    reasoning = zero_shot_cot(
        "가게에 사과가 23개 있었습니다. 오전에 15개를 팔고, 오후에 12개를 더 받았습니다. 현재 사과는 몇 개인가요?"
    )
    print(f"추론: {reasoning}")

# 실행
if __name__ == "__main__":
    # 감정 분석 비교
    result = compare_approaches("배송이 생각보다 늦었지만 제품 품질은 만족스럽습니다.")
    print(f"Zero-shot 결과: {result['zero_shot']}")
    print(f"Few-shot 결과: {result['few_shot']}")

    # 다양한 작업 데모
    demonstrate_zero_shot_tasks()

🗣️ 실무에서 이렇게 말하세요

💬 회의에서

"고객 문의를 자동 분류하려는데 학습 데이터가 없어요." - "일단 Zero-shot으로 시작해봅시다. GPT-4에 '고객 문의를 환불/배송/상품문의/기타로 분류하세요'라고 지시만 하면 돼요. 정확도가 80% 정도 나오면 바로 쓸 수 있고, 부족하면 오분류된 케이스를 모아서 Few-shot 예시로 추가하면 됩니다."

💬 면접에서

"Zero-shot, One-shot, Few-shot의 차이를 설명해주세요." - "프롬프트에 포함되는 예시 개수의 차이입니다. Zero-shot은 0개로 지시만, One-shot은 1개, Few-shot은 보통 3~5개 예시를 포함해요. 예시가 많을수록 모델이 패턴을 더 잘 파악하지만, 토큰 비용이 증가하고 컨텍스트 길이 제한에 걸릴 수 있어요. 실무에서는 Zero-shot으로 테스트 후 필요시 Few-shot으로 업그레이드합니다."

💬 기술 토론에서

"Zero-shot CoT가 뭔가요?" - "Chain-of-Thought의 약자로, '단계별로 생각하세요' 같은 문구를 추가해서 모델이 추론 과정을 명시적으로 출력하게 하는 기법이에요. 2022년 논문에서 나왔는데, 수학 문제나 논리 추론에서 정확도가 크게 오릅니다. 예시를 안 줘도 추론 과정만 요청하면 되니까 여전히 Zero-shot이에요."

⚠️ 흔한 실수 & 주의사항

모호한 지시 제공

"분석하세요"보다 "긍정/부정/중립 중 하나로 분류하세요"처럼 구체적인 출력 형식을 지정해야 합니다. Zero-shot은 예시가 없으므로 지시의 명확성이 더욱 중요합니다.

모든 작업에 Zero-shot 적용

의료 진단, 법률 문서 분석 등 도메인 전문성이 필요한 작업에서는 Zero-shot 정확도가 낮습니다. 이런 경우 Few-shot 예시나 Fine-tuning이 필수적입니다.

올바른 접근 방법

Zero-shot으로 빠르게 MVP를 만들고, 실제 오류 패턴을 분석하세요. 반복적으로 틀리는 케이스가 있으면 그것을 Few-shot 예시로 추가하는 점진적 개선이 효과적입니다.

🔗 관련 용어

📚 더 배우기