定制验证器¶
定制验证器允许您为结构化数据提取实现专门的验证逻辑。本教程将向您展示如何使用 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 可以通过不同方式处理。了解更多关于
定制验证器的最佳实践¶
- 错误消息要具体:提供清晰的错误消息,准确解释出了什么问题
- 尽早验证:尽可能在模型级别验证之前对单个字段应用验证器
- 验证器要专注:每个验证器应只有一个职责
- 使用类型提示:正确的类型提示有助于 Pydantic 和 Instructor 更好地理解您的数据
- 考虑验证和转换:验证器既可以验证数据,也可以转换数据
有关验证的更多信息,请查看验证概念页面。
相关资源¶
定制验证器是确保提取的数据满足您特定要求的强大方法,可以提高大型语言模型结构化输出的可靠性和质量。