理解响应模型¶
响应模型是 Instructor 功能的核心。它们定义了你想要提取的数据结构并提供验证规则。本指南解释了如何为各种用例创建不同类型的响应模型。
基本模型¶
让我们从一个之前看过的简单模型开始
这定义了一个包含两个必填字段的模型:name
(字符串)和 age
(整数)。
添加字段元数据¶
你可以使用 Field
类为字段添加元数据
from pydantic import BaseModel, Field
class WeatherForecast(BaseModel):
"""Weather forecast for a specific location"""
temperature: float = Field(
description="Current temperature in Celsius"
)
condition: str = Field(
description="Weather condition (sunny, cloudy, rainy, etc.)"
)
humidity: int = Field(
description="Humidity percentage from 0-100"
)
字段描述有助于大型语言模型(LLM)理解每个字段需要提取的信息。
字段验证¶
你可以添加验证规则以确保提取的数据符合你的要求
from pydantic import BaseModel, Field
class Product(BaseModel):
name: str = Field(min_length=3)
price: float = Field(gt=0) # greater than 0
quantity: int = Field(ge=0) # greater than or equal to 0
description: str = Field(max_length=500)
常见的验证参数包括: - min_length
/max_length
:用于字符串 - ge
/gt
/le
/lt
:用于数字(大于/小于或等于/大于) - pattern
:用于正则表达式匹配
嵌套模型¶
你可以使用嵌套模型创建复杂的数据结构
from pydantic import BaseModel, Field
from typing import List, Optional
class Address(BaseModel):
street: str
city: str
state: Optional[str] = None
country: str
class User(BaseModel):
name: str
age: int
addresses: List[Address]
这允许你提取分层数据结构。更多示例请查看简单嵌套结构指南。
使用枚举¶
当你你想将字段限制在一组特定值时,枚举很有用
from enum import Enum
from pydantic import BaseModel
class UserType(str, Enum):
ADMIN = "admin"
REGULAR = "regular"
GUEST = "guest"
class User(BaseModel):
name: str
user_type: UserType
可选字段¶
对于源文本中可能不存在的字段
from typing import Optional
from pydantic import BaseModel
class Contact(BaseModel):
name: str
email: str
phone: Optional[str] = None
address: Optional[str] = None
有关使用可选字段的更多信息,请参阅可选字段指南。
列表和数组¶
用于提取多个相同类型的项目
from typing import List
from pydantic import BaseModel
class BlogPost(BaseModel):
title: str
content: str
tags: List[str]
有关使用列表的更多信息,请参阅列表提取指南。
在 Instructor 中使用你的模型¶
定义好模型后,你就可以用它进行提取
import instructor
from openai import OpenAI
client = instructor.from_openai(OpenAI())
forecast = client.chat.completions.create(
model="gpt-3.5-turbo",
response_model=WeatherForecast,
messages=[
{"role": "user", "content": "What's the weather in New York today?"}
]
)
print(forecast.model_dump_json(indent=2))
模型文档¶
你可以使用文档字符串和字段描述为你的模型添加文档
from pydantic import BaseModel, Field
class Investment(BaseModel):
"""Represents an investment opportunity with risk and return details."""
name: str = Field(description="Name of the investment")
amount: float = Field(description="Investment amount in USD")
expected_return: float = Field(description="Expected annual return percentage")
risk_level: str = Field(description="Risk level (low, medium, high)")
这个文档既有助于大型语言模型(LLM)理解要提取什么,也使你的代码更易于维护。
使用验证器进行高级验证¶
对于更复杂的验证规则,你可以使用验证器方法
from pydantic import BaseModel, Field, field_validator
from datetime import date
class Reservation(BaseModel):
check_in: date
check_out: date
guests: int = Field(ge=1)
@field_validator("check_out")
def check_dates(cls, v, values):
if "check_in" in values.data and v <= values.data["check_in"]:
raise ValueError("check_out must be after check_in")
return v
有关更高级的验证技术,请查看自定义验证器指南。
下一步¶
在下一节中,学习关于客户端设置,了解如何配置不同的 LLM 提供商并理解各种操作模式。