🧠 图解记忆:为什么 LLM 需要 Pydantic;点击图片可查看原图。
💡 答案要点
为什么 LLM 需要 Pydantic?
LLM 输出是自由文本,应用需要结构化数据。Pydantic v2 提供了类型安全的解析方案:
LLM 输出: "是的,这部电影适合全家观看。评分: 8.5/10,主演: 张三"
↓
Pydantic 模型:
MovieReview {
suitable_for_family: bool = True
rating: float = 8.5
main_actor: str = "张三"
}Pydantic v2 核心用法:
python
from pydantic import BaseModel, Field
from openai import OpenAI
client = OpenAI()
# 1. 定义输出 Schema
class MovieReview(BaseModel):
"""电影评论结构化输出"""
suitable_for_family: bool = Field(description="是否适合全家观看")
rating: float = Field(description="评分,范围 0-10")
main_actor: str = Field(description="主演姓名")
genre: list[str] = Field(description="电影类型列表")
# 2. 使用 OpenAI Structured Output
response = client.chat.completions.create(
model="gpt-4o-2024-08-06", # 支持结构化输出的模型
messages=[{"role": "user", "content": "分析《你好,李焕英》"}],
response_format=MovieReview # 直接传 Pydantic 模型
)
review = response.choices[0].message.parsed
print(f"评分: {review.rating}, 适合家庭: {review.suitable_for_family}")原理:Pydantic 在内部做了什么?
1. Pydantic 模型 → JSON Schema
2. JSON Schema → 注入到 System Prompt(告诉 LLM 输出格式)
3. LLM 输出 → JSON 字符串
4. Pydantic 解析 JSON → Pydantic 模型实例(带验证)
5. 验证失败 → `ValidationError`;业务语义仍需单独校验Pydantic v2 高级特性:
展开 Python 代码示例(30 行)
python
from pydantic import BaseModel, Field, field_validator, model_validator
from typing import Optional
class AgentConfig(BaseModel):
"""Agent 配置,支持嵌套和验证"""
name: str = Field(..., min_length=1, max_length=50)
max_steps: int = Field(default=10, ge=1, le=100)
temperature: float = Field(default=0.7, ge=0, le=2)
tools: list[str] = Field(default_factory=list)
@field_validator('temperature')
@classmethod
def validate_temperature(cls, v):
if v > 1.5:
print("⚠️ temperature > 1.5 可能导致输出不稳定")
return v
@model_validator(mode='after')
def validate_config(self):
if self.max_steps > 50 and not self.tools:
raise ValueError("超过50步必须有工具定义,否则可能无限循环")
return self
# 用法
config = AgentConfig(
name="data-analyst",
max_steps=60,
temperature=1.8,
tools=["sql_query", "chart_generator"]
)
print(config.model_dump_json())V2 vs V1 核心区别:
| 特性 | Pydantic v1 | Pydantic v2 |
|---|---|---|
| 验证核心 | Python 实现为主 | 大量核心校验由 Rust pydantic-core 执行,具体加速比依 Schema 而定 |
| BaseModel | dict() | model_dump() |
| 序列化 | dict() / json() | model_dump() / model_dump_json() |
| 验证器 | @validator | @field_validator / @model_validator |
面试话术:
"Pydantic v2 适合把 LLM 输出解析为带类型约束的对象。可以把模型导出为 JSON Schema 交给支持结构化输出的模型或推理引擎,再用 Pydantic 校验返回值;若供应商只支持文本输出,则还需自己提示、提取和重试。校验通过只表示结构与字段约束满足,不代表内容事实正确。V2 的性能改进主要来自 Rust 实现的
pydantic-core,具体提升要按实际 Schema 测。"
