Day 16: 프롬프트 엔지니어링
같은 모델이라도 프롬프트를 어떻게 작성하느냐에 따라 결과 품질이 극적으로 달라집니다. 오늘은 핵심 프롬프트 기법과 실전 팁을 정리합니다.
역할 지정과 Zero-shot / Few-shot
from openai import OpenAI
client = OpenAI() # 환경변수 OPENAI_API_KEY 필요
# Zero-shot: 예시 없이 바로 질문
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "당신은 감성 분석 전문가입니다. 긍정/부정/중립으로만 답하세요."},
{"role": "user", "content": "이 제품 배송은 빨랐는데 품질이 별로예요."},
],
)
print("Zero-shot:", response.choices[0].message.content)
# Few-shot: 예시를 제공하여 패턴 학습 유도
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "감성을 분석하세요."},
{"role": "user", "content": "음식이 맛있어요. -> 긍정\n서비스가 느려요. -> 부정\n그냥 평범해요. -> 중립\n\n이 제품 배송은 빨랐는데 품질이 별로예요. ->"},
],
)
print("Few-shot:", response.choices[0].message.content)
Chain-of-Thought (사고의 연쇄)
복잡한 추론 문제에서는 단계별 사고를 유도하면 정확도가 크게 향상됩니다. “단계별로 생각해보세요”라는 한 마디가 효과적입니다.
# 일반 프롬프트 vs CoT 프롬프트 비교
normal_prompt = "가게에 사과가 23개 있었다. 11개를 팔고 6개를 더 들여왔다. 남은 사과는?"
cot_prompt = """가게에 사과가 23개 있었다. 11개를 팔고 6개를 더 들여왔다. 남은 사과는?
단계별로 풀어보세요:
1단계: 처음 사과 개수를 확인합니다.
2단계: 판매한 만큼 뺍니다.
3단계: 새로 들여온 만큼 더합니다.
4단계: 최종 답을 구합니다."""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": cot_prompt}],
)
print(response.choices[0].message.content)
구조화 출력 (JSON 모드)
LLM 출력을 프로그래밍적으로 처리하려면 JSON 같은 구조화 형식이 필수입니다.
import json
response = client.chat.completions.create(
model="gpt-4o-mini",
response_format={"type": "json_object"},
messages=[
{"role": "system", "content": "JSON 형식으로만 응답하세요."},
{"role": "user", "content": """다음 리뷰에서 정보를 추출하세요:
"삼성 갤럭시 S24를 2주간 사용했습니다. 카메라는 훌륭하지만 배터리가 아쉽습니다. 가격은 120만원이었어요."
형식: {"product": "", "duration": "", "pros": [], "cons": [], "price": ""}"""},
],
)
result = json.loads(response.choices[0].message.content)
print(json.dumps(result, ensure_ascii=False, indent=2))
프롬프트 팁 10가지
- 역할을 명확히 부여하세요 - “당신은 10년 경력의 데이터 사이언티스트입니다”
- 출력 형식을 지정하세요 - JSON, 표, 번호 리스트 등 원하는 형식을 명시
- 구분자를 사용하세요 - 입력과 지시를
---이나###으로 분리 - 부정형보다 긍정형으로 - “~하지 마세요” 대신 “~하세요”
- 예시를 보여주세요 - Few-shot이 Zero-shot보다 거의 항상 좋음
- 단계를 나누세요 - 복잡한 작업은 “먼저… 그 다음… 마지막으로…”
- 제약 조건을 명시하세요 - “3문장 이내”, “200자 이하”
- 탈출 조건을 설정하세요 - “모르면 ‘모르겠습니다’라고 답하세요”
- 온도를 조절하세요 - 사실 기반은 낮게(0.1
0.3), 창작은 높게(0.71.0) - 반복 실험하세요 - 한 번에 완벽한 프롬프트는 없음, 점진적으로 개선
오늘의 연습문제
- Few-shot 프롬프트로 한국어 뉴스 제목을 “정치/경제/사회/IT/스포츠” 5개 카테고리로 분류하는 시스템을 만들어보세요. 예시 5개를 포함하세요.
- Chain-of-Thought 기법을 사용하여 수학 문제(연립방정식)를 풀도록 프롬프트를 작성하고, CoT 없는 버전과 정답률을 비교해보세요.
- JSON 출력 모드를 활용하여 자유 형식의 이력서 텍스트에서 이름, 연락처, 학력, 경력을 구조화된 JSON으로 추출하는 프롬프트를 작성해보세요.