콘텐츠로 이동

03-형식-강제-기법

LLM 출력을 다음 단계 코드가 파싱한다면(예: 분류 → DB 저장), 출력 모양이 1% 깨져도 파이프라인 전체가 멈춘다. 형식 강제는 그 1%를 0%에 가깝게 만드는 기법이다.

<output_schema>
{
"category": "billing|bug|feature_request|account|other|abuse",
"confidence": "low|medium|high",
"reason_ko": "string (40자 이내)"
}
</output_schema>
JSON 외 텍스트를 출력하지 마라. 코드 블록 표시(```) 없이 원시 JSON만 출력하라.

핵심:

  • 허용 값을 |로 열거 (enum 효과)
  • 길이 제약 명시
  • “JSON 외 텍스트 금지”를 명시적으로 적기

스키마만으로 부족하면 예시를 1~3개 붙인다. 모델은 예시의 모양을 그대로 모방한다.

<example>
입력: "결제 환불 어떻게 받죠?"
출력: {"category":"billing","confidence":"high","reason_ko":"환불 절차 문의"}
</example>
<example>
입력: "그냥 안녕하세요"
출력: {"category":"other","confidence":"low","reason_ko":"분류 불가"}
</example>

기법 3 — 응답 접두어(Assistant Prefill)

섹션 제목: “기법 3 — 응답 접두어(Assistant Prefill)”

Anthropic API는 assistant 메시지를 미리 채워 응답의 시작을 강제할 수 있다.

{"role":"assistant","content":"{"}

이렇게 하면 모델은 이미 {로 시작한 응답을 이어 쓸 수밖에 없다. 산문 서론(“Sure, here is the JSON…”)이 원천적으로 차단된다.

기법 4 — Tool Use를 형식 도구로 활용

섹션 제목: “기법 4 — Tool Use를 형식 도구로 활용”

모델에게 “JSON으로 답하라”고 부탁하는 대신, JSON 스키마를 가진 도구를 호출하게 만든다. 도구 호출은 모델 백엔드에서 스키마를 강제하므로 가장 강력한 형식 강제 수단이다.

도구 정의: classify_ticket(category: enum, confidence: enum, reason_ko: string)
지시: "이 티켓에 대해 classify_ticket을 한 번 호출하라."

JSON이 과한 경우 XML이 더 안정적이다.

<classification>
<category>billing</category>
<confidence>high</confidence>
<reason>환불 절차 문의</reason>
</classification>

XML은 누락된 필드·중첩 구조를 사람이 한눈에 발견하기 쉽고, Claude가 학습 시 자주 본 형식이라 안정적이다.

형식이 깨졌을 때의 회복 전략. 코드 측에서 파싱 실패를 잡아 같은 호출을 한 번 더 보내되, 시스템에 “직전 시도가 다음 이유로 실패했다: …”를 덧붙인다. 보통 두 번째 시도에서 회복한다.

순위기법강도
1Tool use 호출가장 강함
2Assistant prefill강함
3Few-shot + 스키마중간
4”JSON으로 답하라” 지시만약함

평가 기반으로 가장 약한 기법부터 강한 기법으로 올라가라. 도구 호출은 가장 강력하지만 통합 비용이 있다.