본문으로 건너뛰기
RAISE LAB
← 블로그 목록
기술 해설

시스템 프롬프트와 퓨샷으로 출력 품질 높이기

같은 모델이라도 프롬프트를 어떻게 짜느냐에 따라 결과가 크게 달라집니다. 효과가 가장 확실한 기법은 둘입니다. 시스템 프롬프트(system prompt)를 제대로 쓰는 것, 그리고 퓨샷(few-shot)으로 예시를 보여 주는 것. 이 글은 그 둘을 실무에서 쓰는 방식으로 풀어 씁니다.

시스템 프롬프트: 역할과 규칙이 사는 자리

시스템 프롬프트는 대화 전체에 걸리는 지시입니다. 사용자 메시지마다 규칙을 되풀이하는 대신, 역할과 말투, 제약을 여기에 한 번 고정해 둡니다.

response = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=2048,
    system="당신은 금융 규제 문서 검토 전문가입니다. "
           "모든 판단에 근거 조항을 인용하고, "
           "확실하지 않은 경우 '검토 필요'로 표시합니다.",
    messages=[{"role": "user", "content": document}],
)

시스템 프롬프트에 들어갈 것은 세 가지입니다.

  1. 역할(role): "금융 규제 문서 검토 전문가"처럼 구체적인 역할을 주면 어휘 선택과 판단 기준이 함께 바뀝니다. "도움이 되는 어시스턴트" 같은 두루뭉술한 역할보다 언제나 낫습니다.
  2. 행동 규칙: 해야 할 것과 하지 말아야 할 것을 적습니다. 특히 확실하지 않을 때 어떻게 할지("모르면 모른다고 답한다")를 정해 두면 환각(hallucination)이 눈에 띄게 줄어듭니다.
  3. 출력 형식: 응답 구조를 고정해 두면 뒤에서 처리하기 쉽습니다. 형식 규칙은 예시와 함께 줄 때 가장 잘 지켜집니다.

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>

예시를 고를 때 자주 하는 실수

  • 쉬운 예시만 넣기: 모델이 정말로 헷갈리는 것은 경계에 있는 사례입니다. "환불을 요청하면서 칭찬도 하는 입력"처럼 애매한 경우의 정답을 꼭 넣으세요.
  • 한쪽으로 쏠린 분포: 예시 다섯 개가 전부 "부정"이면 모델도 부정 쪽으로 기웁니다. 예시의 분포는 실제 데이터를 닮아야 합니다.
  • 형식이 제각각: 예시마다 출력 형식이 조금씩 다르면 모델도 따라 흔들립니다. 예시의 형식은 기계처럼 똑같이 맞추세요.
  • 개수에 집착하기: 보통 3~5개면 충분합니다. 그 이상은 컨텍스트만 차지하고 나아지는 폭은 작을 때가 많습니다.

둘을 함께 쓰기

실무에서 가장 잘 돌아가는 조합은 이렇습니다.

요소위치
역할·행동 규칙시스템 프롬프트
작업 지시사용자 메시지 상단, <instructions> 태그
처리할 데이터전용 태그로 구획
형식 예시<examples> 태그, 경계 사례 포함

끝으로 하나만 더. 프롬프트는 감이 아니라 측정으로 고칩니다. 대표 입력 20~30개로 작은 평가 세트를 만들어 두고, 프롬프트를 바꿀 때마다 통과율을 비교하세요. 한 번에 한 가지만 바꿔야 무엇이 효과를 냈는지 알 수 있습니다.