- LLM 응답을 객체화하여 활용하기 위해 구조화된 응답(Structured Output)은 함수적으로 LLM을 사용할 때 매우 중요합니다. 🏗️
- 모든 LLM이 구조화된 응답을 잘 처리하는 것은 아니며, JSON 스키마를 이해하고 따를 수 있는 모델이 필수적입니다. 🧠
- 툴 콜링이 가능한 모델은 툴 요청 스펙이 JSON 스키마를 사용하므로, 일반적으로 구조화된 응답도 잘 처리합니다. 🛠️
- JSON 스키마는
name, strict, schema, required 같은 래퍼 속성과 함께, properties (객체) 및 items (배열)를 사용하여 재귀적으로 타입을 정의하는 표준화된 문법을 가집니다. 📜
- Spring AI의 기본 구조화된 응답 방식은 LLM API의 네이티브 기능을 사용하지 않고 프롬프트에 지시문을 추가하는 방식이라, 모델이 이를 무시하고 잘못된 응답을 생성할 위험이 높습니다. ⚠️
- 프롬프트 기반 출력 제어는 모델 성능에 크게 의존하며, 저품질 모델에서는 예외 발생이나
null 반환 등 불안정한 결과를 초래할 수 있습니다. 📉
- 안정적인 구조화된 응답을 위해서는 OpenAI의
response_format과 같이 LLM API가 제공하는 실제 구조화된 응답 요청 기능을 직접 사용하여 ChatOptions를 구성해야 합니다. ⚙️
- Spring AI는 API 수준의
response_format 직접 지원이 부족하므로, 개발자가 JSON 스키마를 수동으로 구성하고 ChatOptions에 포함하여 요청을 보내야 합니다. ✍️
- 응답으로 받은 JSON 문자열을 자바 객체로 변환하는
BeanOutputConverter는 유용하지만, 요청 생성 단계에서는 API 수준의 직접적인 구성이 필수적입니다. 🔄