03-형식-강제-기법
03. 형식 강제(Format Forcing) 기법
섹션 제목: “03. 형식 강제(Format Forcing) 기법”왜 형식 강제가 필요한가
섹션 제목: “왜 형식 강제가 필요한가”LLM 출력을 다음 단계 코드가 파싱한다면(예: 분류 → DB 저장), 출력 모양이 1% 깨져도 파이프라인 전체가 멈춘다. 형식 강제는 그 1%를 0%에 가깝게 만드는 기법이다.
기법 1 — 스키마 명시
섹션 제목: “기법 1 — 스키마 명시”<output_schema>{ "category": "billing|bug|feature_request|account|other|abuse", "confidence": "low|medium|high", "reason_ko": "string (40자 이내)"}</output_schema>
JSON 외 텍스트를 출력하지 마라. 코드 블록 표시(```) 없이 원시 JSON만 출력하라.핵심:
- 허용 값을
|로 열거 (enum 효과) - 길이 제약 명시
- “JSON 외 텍스트 금지”를 명시적으로 적기
기법 2 — Few-shot으로 형식 시연
섹션 제목: “기법 2 — Few-shot으로 형식 시연”스키마만으로 부족하면 예시를 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을 한 번 호출하라."기법 5 — XML 태그 출력
섹션 제목: “기법 5 — XML 태그 출력”JSON이 과한 경우 XML이 더 안정적이다.
<classification> <category>billing</category> <confidence>high</confidence> <reason>환불 절차 문의</reason></classification>XML은 누락된 필드·중첩 구조를 사람이 한눈에 발견하기 쉽고, Claude가 학습 시 자주 본 형식이라 안정적이다.
기법 6 — 검증 + 재시도 루프
섹션 제목: “기법 6 — 검증 + 재시도 루프”형식이 깨졌을 때의 회복 전략. 코드 측에서 파싱 실패를 잡아 같은 호출을 한 번 더 보내되, 시스템에 “직전 시도가 다음 이유로 실패했다: …”를 덧붙인다. 보통 두 번째 시도에서 회복한다.
형식 강제의 우선순위
섹션 제목: “형식 강제의 우선순위”| 순위 | 기법 | 강도 |
|---|---|---|
| 1 | Tool use 호출 | 가장 강함 |
| 2 | Assistant prefill | 강함 |
| 3 | Few-shot + 스키마 | 중간 |
| 4 | ”JSON으로 답하라” 지시만 | 약함 |
평가 기반으로 가장 약한 기법부터 강한 기법으로 올라가라. 도구 호출은 가장 강력하지만 통합 비용이 있다.