LLM 응답을 믿을 수 있게 만드는 것은 프롬프트가 아니라 스키마다
"JSON 으로만 답해" 라고 쓰는 대신, JSON 이 아니면 통과하지 못하게 만든다.
목차
문장으로 부탁하는 방식의 한계
프롬프트에 이렇게 적는 방식이 있다.
반드시 아래 형식의 JSON 으로만 답하세요. 다른 말은 쓰지 마세요.잘 동작한다. 99% 정도는. 나머지 1% 가 문제인데, 그 1% 는 트래픽이 늘 때 같이 는다.
구조로 강제한다
모델이 형식을 지키게 만드는 것과, 형식을 지키지 않은 답을 받지 않는 것은 다르다. 후자는 프롬프트가 아니라 코드가 한다.
record ExtractedInvoice(String vendor, LocalDate issuedOn, long totalAmount) {}
ExtractedInvoice result = client.structured(prompt, ExtractedInvoice.class);이렇게 두면 형식 위반이 파싱 실패가 되고, 파싱 실패는 재시도든 사람 검수든 정해진 경로를 탄다. 프롬프트에 "반드시" 를 한 번 더 쓰는 것과는 다른 종류의 보장이다.
스키마를 좁히면 프롬프트가 짧아진다
필드 이름과 타입이 이미 의도를 말하므로 설명할 것이 줄어든다.
totalAmount: long 은 "숫자만, 통화 기호 없이" 를 문장으로 쓰지 않아도 된다는 뜻이다.
프롬프트를 길게 쓰는 것으로 해결하려 했던 문제의 상당수가 여기서 사라진다.