Validators: LLM 출력 품질 기준을 담는 검증기

Validators: LLM 출력 품질 기준을 담는 검증기

Validators는 LLM의 출력에 품질 통제를 적용하는 방법이에요. 출력이 유효한지 판단할 기준과, 그 기준을 충족하지 못했을 때 취할 조치를 함께 담고 있죠. Guardrails에서 검증의 가장 기본 단위라고 보면 돼요. 기준을 만드는 방식과 실패했을 때의 동작을 먼저 이해하면, 이후에 guard를 조립할 때 훨씬 수월해져요.

출처: Validators - Guardrails AI 공식 문서

Validators는 어떻게 동작하나요

각 validator는 어떤 기준을 담은 함수 하나로, 주어진 값이 그 기준을 만족하는지를 확인해요.

  • 기준을 통과하면 PassResult를 반환해요. 대부분의 경우 값이 그대로 돌아오고, 아주 일부 고급 케이스에서는 값이 덮어써질 수도 있어요(해당 validator가 문서에 남겨 둡니다).
  • 기준을 통과하지 못하면 FailResult를 반환하고, 이때 사용자가 설정한 on_fail 정책을 적용하죠(On-Fail Policies 참조).

런타임 메타데이터

간혹 validator가 런타임에만 알 수 있는 추가 메타데이터를 필요로 할 때가 있어요. 메타데이터는 validator 실행 중 생성되는 데이터일 수도 있고(직접 validator를 작성한다면 중요한 부분), 런타임 인자를 담는 그릇일 수도 있죠.

예를 들어 ExtractedSummarySentencesMatch validator는 metadata 딕셔너리의 filepaths 프로퍼티로, 요약과 비교할 원본 파일 경로를 받아요. 생성자에서 지정하는 arguments와 달리, metadata는 guard.validateguard.__call__(바로 guard() 함수죠)을 호출할 때 전달해요.

guard = Guard.for_rail("my_railspec.rail")

outcome = guard(
    llm_api=openai.chat.completions.create,
    model="gpt-3.5-turbo",
    num_reasks=3,
    metadata={
        "filepaths": [
            "./my_data/article1.txt",
            "./my_data/article2.txt",
        ]
    }
)

여러 validator가 metadata를 요구한다면, 각 validator의 metadata 키를 전부 담은 하나의 딕셔너리로 만들어요. 아래 예시에서는 Provenance_LLMDetectPII 둘 다 metadata가 필요하죠.

from guardrails import Guard
from guardrails_ai.detect_pii import DetectPII
from guardrails_ai.provenance_llm import ProvenanceLLM

from sentence_transformers import SentenceTransformer


# Setup Guard with multiple validators
guard = Guard().use(
    ProvenanceLLM(validation_method="sentence"),
    DetectPII()
)

# Setup metadata for provenance validator
sources = [
    "The sun is a star.",
    "The sun rises in the east and sets in the west."
]
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

def embed_function(sources: list[str]) -> np.array:
    return model.encode(sources)

# Setup metadata for PII validator
pii_entities = ["EMAIL_ADDRESS", "PHONE_NUMBER"]

# Create a single metadata dictionary containing metadata keys for each validator
metadata = {
    'pii_entities': pii_entities,
    'sources': sources,
    'embed_function': embed_function
}

# Pass the metadata to the guard.validate method
guard.validate("some text", metadata=metadata)

커스텀 Validator

커스텀 validator로 Guardrails의 기능을 자기 검증 로직으로 확장할 수 있어요. 직접 만드는 방법은 공식 문서의 custom validators 항목에 자세히 나와 있어요.

Validator 설치하기

validator들은 Input/Output Guards로 조합되어 LLM의 입력과 출력을 가로채죠. Guardrails-AI validator는 guardrails-ai-<name> 이름으로 공개 PyPI에 배포되고, pip로 설치할 수 있어요.

CLI로 설치하기

validator는 pip로 설치해요. 예를 들어 Toxic Language validator는 이렇게 설치할 수 있어요.

pip install guardrails-ai-toxic-language

설치 후에는 guard 안에서 바로 사용할 수 있어요.

from guardrails_ai.toxic_language import ToxicLanguage
from guardrails import Guard

guard = Guard().use(
    ToxicLanguage, threshold=0.5, validation_method="sentence", on_fail="exception"
)

guard.validate("My landlord is an asshole!") 

코드 안에서 설치하기

참고: 코드 안에서 쓰는 guardrails.install(...) SDK는 deprecated 됐어요. validator는 PyPI에서 pip(또는 uv)로 설치한 뒤 import 하세요.

pip install guardrails-ai-toxic-language
from guardrails import Guard
from guardrails_ai.toxic_language import ToxicLanguage

guard = Guard().use(
    ToxicLanguage, threshold=0.5, validation_method="sentence", on_fail="exception"
)

guard.validate("My landlord is an asshole!")

더 알아보기

  • Guard 객체: 이 검증기들을 어떻게 하나로 묶어 LLM 호출을 감싸는지 봐요.
  • 시작하기 (앱에 Guardrails 임베딩): validator를 설치하고 guard를 구성하는 첫 흐름을 따라가요.