跳至内容

定制验证器

定制验证器允许您为结构化数据提取实现专门的验证逻辑。本教程将向您展示如何使用 Instructor 创建和使用定制验证器。

基本定制验证器

定制验证器是用于验证字段值的函数,可以使用 Pydantic 的字段验证器来应用。

from pydantic import BaseModel, field_validator
import instructor
from openai import OpenAI

# Initialize the client
client = instructor.from_openai(OpenAI())

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

    @field_validator('age')
    @classmethod
    def validate_age(cls, value):
        if value < 0 or value > 120:
            raise ValueError("Age must be between 0 and 120")
        return value

# Extract data with validation
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "user", "content": "The person's name is John and they are 150 years old."}
    ],
    response_model=Person
)

如果模型返回的年龄超出有效范围,Instructor 将使用关于验证失败的具体反馈重试该请求。

有关 Instructor 如何处理验证和重试的更多信息,请参阅验证基础重试概念页面。

复杂验证

您可以创建更复杂的验证器,它们可以检查多个字段或包含条件逻辑

from pydantic import BaseModel, field_validator, model_validator
import instructor
from openai import OpenAI
from typing import List, Optional
from datetime import date

client = instructor.from_openai(OpenAI())

class Employee(BaseModel):
    name: str
    hire_date: date
    termination_date: Optional[date] = None
    skills: List[str]

    @field_validator('skills')
    @classmethod
    def validate_skills(cls, skills):
        if len(skills) < 1:
            raise ValueError("Employee must have at least one skill")
        return skills

    @model_validator(mode='after')
    def validate_dates(self):
        if self.termination_date and self.termination_date < self.hire_date:
            raise ValueError("Termination date cannot be before hire date")
        return self

有关更高级的验证方法,请查看字段级别验证验证器概念页面。

处理复杂数据类型

定制验证器还可以处理更复杂的数据类型并执行转换

from pydantic import BaseModel, field_validator
import instructor
from openai import OpenAI
import re

client = instructor.from_openai(OpenAI())

class Contact(BaseModel):
    name: str
    email: str
    phone: str

    @field_validator('email')
    @classmethod
    def validate_email(cls, value):
        pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
        if not re.match(pattern, value):
            raise ValueError("Invalid email format")
        return value

    @field_validator('phone')
    @classmethod
    def validate_phone(cls, value):
        # Remove non-digit characters and validate
        digits_only = re.sub(r'\D', '', value)
        if len(digits_only) < 10:
            raise ValueError("Phone number must have at least 10 digits")
        return digits_only  # Return the cleaned version

有关带验证的提取的实际示例,请参阅联系信息提取示例。

使用外部服务进行验证

您还可以使用外部服务或 API 进行验证

from pydantic import BaseModel, field_validator
import instructor
from openai import OpenAI
import requests

client = instructor.from_openai(OpenAI())

class Address(BaseModel):
    street: str
    city: str
    state: str
    zip_code: str

    @field_validator('zip_code')
    @classmethod
    def validate_zip_code(cls, value):
        # Example of validation using an external service (simplified)
        # In a real app, you might use a postal code validation API
        if not (value.isdigit() and len(value) == 5):
            raise ValueError("Zip code must be 5 digits")
        return value

处理验证失败

验证失败时,Instructor 可以通过不同方式处理。了解更多关于

定制验证器的最佳实践

  1. 错误消息要具体:提供清晰的错误消息,准确解释出了什么问题
  2. 尽早验证:尽可能在模型级别验证之前对单个字段应用验证器
  3. 验证器要专注:每个验证器应只有一个职责
  4. 使用类型提示:正确的类型提示有助于 Pydantic 和 Instructor 更好地理解您的数据
  5. 考虑验证和转换:验证器既可以验证数据,也可以转换数据

有关验证的更多信息,请查看验证概念页面。

  • 字段 - 了解字段定义和属性
  • 模型 - 理解模型创建和配置
  • 类型 - 探索您可以使用的不同数据类型

定制验证器是确保提取的数据满足您特定要求的强大方法,可以提高大型语言模型结构化输出的可靠性和质量。