Skip to content
🔗 分享本题
查看我的学习进度 →

24 模块 Q2 教学图:Pydantic v2 在 LLM 结构化输出中的用法与原理?

🧠 图解记忆:为什么 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 v1Pydantic v2
验证核心Python 实现为主大量核心校验由 Rust pydantic-core 执行,具体加速比依 Schema 而定
BaseModeldict()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 测。"

📚 参考:Pydantic 官方文档(v2 结构化输出)