DSPy.rb의 “Enhanced Prompting” 모드에서는 시그니처 스키마가 프롬프트에 직접 포함되어 LLM으로 전송됩니다. 이는 TaskDecomposition과 같은 복잡한 시그니처의 경우 JSON Schema 형식으로 변환될 때 1,378자(약 345 토큰)에 달하는 방대한 양을 차지하게 됩니다. 이러한 JSON Schema의 장황함은 매 API 호출마다 수백 개의 토큰을 스키마 설명에만 사용하게 하여, 실제 애플리케이션의 운영 비용을 증가시키고 처리 속도를 저하시키는 “스키마 문제”를 야기합니다.
BAML 스키마: 효율적인 해결책
DSPy.rb v0.28.2부터 sorbet-baml gem을 통해 BAML 스키마 형식을 지원하여 이 문제를 해결합니다. BAML은 동일한 구조 정보, 타입 안전성, 유효성 검사를 제공하면서도 훨씬 간결한 표현이 가능합니다. 예를 들어, TaskDecomposition 시그니처의 경우 BAML 형식은 200자(약 50 토큰)에 불과하여 JSON Schema 대비 85.5%의 토큰을 절감합니다.
검증된 성능
통합 테스트 결과는 BAML의 효율성을 명확히 보여줍니다:
-
TaskDecomposition (6개 필드): JSON Schema 345 토큰 → BAML Schema 50 토큰 (85.5% 절감)
-
ResearchExecution (6개 필드): JSON Schema 287 토큰 → BAML Schema 49 토큰 (83.0% 절감)
-
전체 테스트 종합: JSON Schema 632 토큰 → BAML Schema 99 토큰 (84.4% 절감)
이러한 절감 효과는 출력 품질 저하 없이 100% 동일한 결과를 보장합니다.
사용 방법 및 적용 범위
BAML 스키마를 사용하기 위해서는 DSPy.configure 블록 내에서 c.lm 설정에 schema_format: :baml 옵션만 추가하면 됩니다. 이 변경 사항은 OpenAI, Anthropic, Gemini, Ollama 등 Enhanced Prompting 모드를 지원하는 모든 LLM 제공자와 호환됩니다.
BAML은 특히 다음 경우에 큰 효과를 발휘합니다:
-
복잡한 시그니처: 5개 이상의 필드나 중첩된 타입을 포함하는 경우
-
고용량 애플리케이션: 토큰 절감 효과가 누적되어 비용 절감에 기여
-
비용에 민감한 프로젝트: 모든 토큰이 중요한 경우
간단한 1-3개 필드 시그니처에서는 그 차이가 미미할 수 있습니다. sorbet-baml gem은 DSPy.rb에 자동으로 포함되며, Sorbet 타입 시그니처로부터 BAML 생성이 자동화되어 추가 설정이 필요 없습니다.