프롬프트 엔지니어링 실전 가이드

프롬프트 엔지니어링이란?

프롬프트 엔지니어링(Prompt Engineering)은 LLM에게 정확한 지시를 내려 원하는 결과를 얻는 기술입니다. 같은 모델이라도 프롬프트를 어떻게 작성하느냐에 따라 답변 품질이 크게 달라집니다. 비유하자면, 같은 재료로도 레시피에 따라 요리 결과가 달라지는 것과 같습니다.

이 글에서는 Zero-shot부터 Chain of Thought까지 핵심 기법 6가지를 코드 예제와 함께 정리합니다.

핵심 기법 총정리

기법설명적합한 상황
Zero-shot예시 없이 직접 지시단순 작업, 분류, 요약
Few-shot입출력 예시를 함께 제공특정 형식/스타일 유도
Chain of Thought (CoT)단계별 추론 유도수학, 논리 문제
System Prompt역할과 규칙 사전 정의일관된 톤/형식 유지
구조화된 출력JSON 등 형식 지정API 응답, 데이터 추출
Self-Consistency여러 번 추론 후 다수결정확도가 중요한 작업

Zero-shot 프롬프트

가장 기본적인 방식으로, 예시 없이 직접 지시합니다. GPT-4급 모델에서는 간단한 작업에 충분히 효과적입니다.

from openai import OpenAI

client = OpenAI()

# Zero-shot: 예시 없이 직접 지시
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "다음 문장의 감정을 긍정/부정/중립으로 분류하세요: '이 제품 정말 마음에 들어요!'"}
    ]
)
print(response.choices[0].message.content)
# 긍정

Zero-shot은 명확한 지시가 핵심입니다. “분석해주세요”보다 “긍정/부정/중립으로 분류하세요”처럼 출력 형식을 구체적으로 명시하면 정확도가 높아집니다.

Few-shot 프롬프트

입력-출력 예시를 2~5개 제공하여 모델이 패턴을 학습하도록 유도합니다. 특정 형식이나 스타일을 따라야 할 때 효과적입니다.

# Few-shot: 예시를 제공하여 형식 유도
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "user", "content": "제품 리뷰를 한 줄로 요약하세요."},
        # 예시 1
        {"role": "user", "content": "리뷰: 배송은 빠른데 포장이 엉망이었어요. 제품 자체는 괜찮습니다."},
        {"role": "assistant", "content": "배송 빠르나 포장 불량, 제품 품질은 양호"},
        # 예시 2
        {"role": "user", "content": "리뷰: 가격 대비 성능이 훌륭합니다. 다만 소음이 좀 있네요."},
        {"role": "assistant", "content": "가성비 우수하나 소음 있음"},
        # 실제 요청
        {"role": "user", "content": "리뷰: 디자인은 예쁜데 배터리가 하루를 못 버팁니다. 충전도 느려요."},
    ]
)
print(response.choices[0].message.content)
# 디자인 우수하나 배터리 수명 및 충전 속도 부족

예시의 품질이 곧 답변의 품질입니다. 예시가 일관된 형식과 길이를 유지해야 모델이 패턴을 정확히 파악합니다.

Chain of Thought (CoT)

“단계별로 생각해보세요”라는 지시를 추가하면, 모델이 중간 추론 과정을 거쳐 더 정확한 답변을 생성합니다. 수학 문제, 논리 추론, 복잡한 분석에서 효과가 큽니다.

# Chain of Thought: 단계별 추론 유도
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "문제를 단계별로 풀어주세요. 각 단계를 명확히 보여주세요."},
        {"role": "user", "content": """
카페에서 아메리카노 3잔(4,500원/잔)과 케이크 2조각(6,000원/조각)을 주문했습니다.
10% 할인 쿠폰을 적용하면 최종 금액은 얼마인가요?
"""}
    ]
)
print(response.choices[0].message.content)
# 1단계: 아메리카노 3잔 = 4,500 × 3 = 13,500원
# 2단계: 케이크 2조각 = 6,000 × 2 = 12,000원
# 3단계: 합계 = 13,500 + 12,000 = 25,500원
# 4단계: 10% 할인 = 25,500 × 0.9 = 22,950원
# 최종 금액: 22,950원

Wei et al.(2022) 논문에 따르면, CoT 프롬프팅은 수학 추론 벤치마크(GSM8K)에서 PaLM 540B 기준 표준 프롬프트 대비 정확도를 약 3배(18% → 57%) 향상시켰습니다. 특히 100B 파라미터 이상의 대형 모델에서 효과가 두드러집니다.

System Prompt 설계

System Prompt는 모델의 역할, 톤, 제약 조건을 정의합니다. 대화 시작 전에 설정하며, 전체 대화에 걸쳐 일관된 동작을 유지합니다.

# System Prompt로 역할과 규칙 정의
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": """
당신은 시니어 Python 개발자입니다.
규칙:
1. 코드에 한국어 주석을 포함하세요
2. 타입 힌트를 사용하세요
3. 보안 취약점이 있는 코드는 경고하세요
4. 답변은 200자 이내로 간결하게 하세요
"""},
        {"role": "user", "content": "사용자 입력을 받아 SQL 쿼리를 실행하는 함수를 만들어주세요"}
    ]
)
print(response.choices[0].message.content)

효과적인 System Prompt의 요소를 정리하면 다음과 같습니다.

요소예시효과
역할 정의”시니어 Python 개발자”전문성 수준 설정
출력 형식”JSON으로 응답하세요”파싱 가능한 출력
제약 조건”200자 이내”답변 길이 제어
금지 사항”추측하지 마세요”할루시네이션 방지
톤 설정”친근하지만 전문적으로”일관된 스타일

구조화된 출력 요청

LLM 응답을 프로그램에서 처리해야 할 때, JSON 등 구조화된 형식을 명시하면 파싱이 용이합니다.

# 구조화된 JSON 출력 요청
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "응답을 반드시 JSON 형식으로만 출력하세요. 다른 텍스트는 포함하지 마세요."},
        {"role": "user", "content": """
다음 텍스트에서 인물 정보를 추출하세요:
"김철수는 35세 소프트웨어 엔지니어로, 서울에 거주하며 Python과 Go를 주로 사용합니다."

JSON 스키마:
{"name": string, "age": number, "job": string, "city": string, "skills": string[]}
"""}
    ],
    response_format={"type": "json_object"}  # JSON 모드 강제
)
print(response.choices[0].message.content)
# {"name": "김철수", "age": 35, "job": "소프트웨어 엔지니어", "city": "서울", "skills": ["Python", "Go"]}

OpenAI API의 response_format={"type": "json_object"}를 사용하면 모델이 반드시 유효한 JSON을 반환하도록 강제할 수 있습니다. Claude API에서도 output_configjson_schema 타입을 지정하여 구조화된 출력을 강제할 수 있습니다.

실전 팁: 나쁜 프롬프트 vs 좋은 프롬프트

나쁜 프롬프트좋은 프롬프트개선 포인트
”코드 작성해줘""Python으로 JWT 인증 미들웨어를 작성하세요. FastAPI 사용.”언어, 프레임워크, 목적 명시
”이거 요약해줘""다음 기사를 3개 핵심 포인트로 요약하세요. 각 포인트는 1문장으로.”출력 형식과 길이 지정
”뭐가 문제야?""이 Python 코드의 버그를 찾고, 원인과 수정 방법을 설명하세요.”구체적인 행동 지시
”잘 만들어줘""성능과 가독성 관점에서 이 함수를 리팩토링하세요. 변경 이유를 주석으로 설명하세요.”기준과 부가 작업 명시

정리

프롬프트 엔지니어링의 핵심은 구체적이고 명확한 지시입니다. 핵심 원칙을 요약하면 다음과 같습니다.

  • 역할을 부여하면 전문성 있는 답변을 얻습니다 (System Prompt)
  • 예시를 제공하면 원하는 형식을 유도할 수 있습니다 (Few-shot)
  • 단계별 사고를 요청하면 복잡한 추론의 정확도가 향상됩니다 (CoT)
  • 출력 형식을 지정하면 프로그램 연동이 쉬워집니다 (JSON 등)
  • “잘 해줘”보다 “무엇을, 어떤 형식으로, 어떤 기준으로”를 명시하세요

이 글이 도움이 되었나요?