최근에는 LLM(대규모 언어 모델)의 출력을 그대로 프로그램에서 다루고 싶은 경우가 늘어나고 있습니다.
하지만 AI의 답변은 가끔 포맷이 깨지거나 불필요한 프로퍼티가 섞여서 '런타임 에러로 죽는' 것이 가장 무섭습니다.
이럴 때 유용한 것이 Zod를 사용한 스키마 검증(Schema Validation)입니다.
이번 글에서는 TypeScript 프로젝트에서 LLM의 응답을 안전하게 받는 방법을 간단히 소개하겠습니다.
왜 Zod인가?
LLM에게 JSON 모드로 응답하도록 요청하고 타입 정의(interface)를 지정하는 것만으로도 작동은 합니다.
하지만 그것은 어디까지나 '에디터 상의 안정성'일 뿐, 실제로 돌아온 데이터가 올바르다는 보장은 없습니다.
Zod를 사용하면:
- 런타임에서 구조를 검사할 수 있습니다.
- 타입 정의를 Zod 스키마로부터 역추적(
z.infer)할 수 있어, 이중 관리가 필요하지 않습니다.
- 만일의 경우 구조가 다르면, 어디가 잘못되었는지 에러를 알려줍니다.
구현 예시
예를 들어, 요리 레시피를 생성하는 AI 기능을 가정해 보겠습니다.
1. 스키마 정의하기
먼저, 원하는 데이터의 형태를 Zod로 정의합니다.
import { z } from "zod";
const RecipeSchema = z.object({
title: z.string(),
2. LLM 출력을 파싱하기
API에서 돌아온 문자열(JSON)을 safeParse 하는 것이 핵심입니다.
async function getRecipeFromAI(prompt: string) {
const response = await callLLM(prompt);
요약
LLM과 프로그래밍의 경계에는 필연적으로 '불확실성'이 따릅니다.
그 부분을 Zod라는 방패로 막아주기만 해도, 개발 스트레스가 크게 줄어들기 때문에 추천합니다!
'AI가 거짓말을 하는 것'은 막을 수 없어도, 'AI가 프로그램을 망가뜨리는 것'은 막을 수 있습니다.
Discussion