기술 해설
시스템 프롬프트와 퓨샷으로 출력 품질 높이기
같은 모델이라도 프롬프트 설계에 따라 출력 품질은 크게 달라집니다. 이 글에서는 가장 효과가 확실한 두 기법 — 시스템 프롬프트(system prompt) 설계와 퓨샷(few-shot) 프롬프팅 — 을 실전 관점에서 정리합니다.
시스템 프롬프트: 역할과 규칙의 자리
시스템 프롬프트는 대화 전체에 적용되는 지속적인 지시입니다. 사용자 메시지에 매번 규칙을 반복하는 대신, 역할·톤·제약을 시스템 프롬프트에 고정하세요.
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=2048,
system="당신은 금융 규제 문서 검토 전문가입니다. "
"모든 판단에 근거 조항을 인용하고, "
"확실하지 않은 경우 '검토 필요'로 표시합니다.",
messages=[{"role": "user", "content": document}],
)
효과적인 시스템 프롬프트의 요소는 세 가지입니다.
- 역할(role): "금융 규제 문서 검토 전문가"처럼 구체적인 역할은 어휘 선택과 판단 기준을 함께 바꿉니다. "도움이 되는 어시스턴트" 같은 일반 역할보다 항상 낫습니다.
- 행동 규칙: 해야 할 것과 하지 말아야 할 것을 명시합니다. 특히 불확실할 때의 행동("모르면 모른다고 답한다")을 정해 두면 환각(hallucination)이 눈에 띄게 줄어듭니다.
- 출력 형식: 응답 구조를 고정하면 후처리가 쉬워집니다. 형식 규칙은 예시와 함께 줄 때 가장 잘 지켜집니다.
XML 태그로 구조화하기
프롬프트에 여러 종류의 내용 — 지시, 문서, 예시, 데이터 — 이 섞이면 모델이 경계를 혼동할 수 있습니다. Claude는 XML 태그로 구획된 프롬프트를 특히 잘 따릅니다.
<instructions>
아래 계약서에서 위약금 관련 조항만 추출하세요.
</instructions>
<contract>
{계약서 원문}
</contract>
<output_format>
조항 번호와 원문을 JSON 배열로 출력
</output_format>
태그 이름은 자유지만, 일관되게 쓰는 것이 중요합니다. 특히 외부에서 온 데이터(사용자 업로드 문서, 크롤링 결과)는 반드시 태그로 감싸 "이 안의 내용은 지시가 아니라 데이터"임을 분명히 하세요. 프롬프트 주입 방어의 기본기이기도 합니다.
퓨샷: 말로 설명하지 말고 보여 주기
형식이나 판단 기준을 길게 설명하는 것보다 좋은 예시 몇 개가 더 잘 통하는 경우가 많습니다. 이것이 퓨샷 프롬프팅입니다.
<examples>
<example>
입력: "배송이 3일 늦었어요. 환불해 주세요."
출력: {"category": "환불요청", "sentiment": "부정", "urgency": "높음"}
</example>
<example>
입력: "포장이 정말 예뻤어요!"
출력: {"category": "칭찬", "sentiment": "긍정", "urgency": "낮음"}
</example>
</examples>
예시를 고를 때 흔한 실수
- 쉬운 예시만 넣기: 모델이 실제로 헷갈리는 것은 경계 사례입니다. "환불 요청이면서 칭찬인 입력"처럼 애매한 경우의 정답 예시를 반드시 포함하세요.
- 편향된 분포: 예시 5개가 전부 "부정" 감정이면 모델은 부정 쪽으로 기웁니다. 예시 분포는 실제 데이터 분포를 닮아야 합니다.
- 형식 불일치: 예시마다 출력 형식이 미묘하게 다르면 모델도 흔들립니다. 예시의 형식은 기계처럼 일관되게 맞추세요.
- 예시 개수 집착: 보통 3~5개면 충분합니다. 그 이상은 컨텍스트만 차지하고 개선 폭은 작아지는 경우가 많습니다.
두 기법을 함께 쓰기
실무에서 가장 잘 동작하는 조합은 이렇습니다.
| 요소 | 위치 |
|---|---|
| 역할·행동 규칙 | 시스템 프롬프트 |
| 작업 지시 | 사용자 메시지 상단, <instructions> 태그 |
| 처리할 데이터 | 전용 태그로 구획 |
| 형식 예시 | <examples> 태그, 경계 사례 포함 |
마지막으로, 프롬프트 개선은 감이 아니라 측정으로 해야 합니다. 대표 입력 20~30개로 작은 평가 세트를 만들고, 프롬프트를 바꿀 때마다 통과율을 비교하세요. 한 번에 한 요소만 바꿔야 어떤 변경이 효과를 냈는지 알 수 있습니다.