검증(Validation)

검증(Validation)

Instructor는 구조화된 출력을 받을 뿐만 아니라, 그 출력이 원하는 기준에 맞는지 검증하고 기준을 벗어나면 LLM을 다시 호출해 고치도록 만들 수 있어요. 이건 Pydantic의 검증 기능을 그대로 활용하는 방식이라, 필드 타입·범위·사용자 정의 검증기를 쓰면 돼요.

기본 검증

Pydantic의 Fieldfield_validator를 쓰면 필드 단위로 규칙을 걸 수 있어요. 예를 들어 이름 길이, 나이 범위, 이메일 목록 같은 걸 검사할 수 있어요.

from typing import List
from pydantic import BaseModel, Field, field_validator

class User(BaseModel):
    name: str = Field(..., min_length=2, description="User's full name")
    age: int = Field(..., ge=0, le=150, description="User's age")
    emails: List[str] = Field(description="User's emails")

ge(greater or equal)는 최소값, le(less or equal)는 최대값을 뜻해요. 이 필드 제약이 실패하면 Instructor가 자동으로 재시도(reask)를 돌릴 수 있어요.

출처: https://python.useinstructor.com/concepts/validation/

필드 검증기로 사용자 정의 규칙

field_validator 데코레이터로 복잡한 규칙을 만들 수 있어요. 예를 들어 나이 값이 비정상 범위면 ValueError를 던져서 재시도를 유도할 수 있어요.

from pydantic import BaseModel, field_validator

class UserInfo(BaseModel):
    name: str
    age: int

    @field_validator('age')
    @classmethod
    def validate_age(cls, v):
        if v < 0 or v > 150:
            raise ValueError(f"Age {v} is invalid")
        return v

검증 실패와 재시도(reask)

검증이 실패하면 ValidationError가 발생해요. 이걸 Tenacity의 retry_if_exception_type(ValidationError)와 엮으면 검증 실패 시에만 재시도하게 할 수 있어요(재시도 문서 참고). 또한 Instructor의 max_retries를 쓰면 검증 실패 메시지를 LLM에 다시 보내 정확한 값을 얻도록 바로 재요청할 수 있어요.

더 알아보기