🎯 课程主题
掌握 LangChain 中 Pydantic 模式的基本使用:定义 BaseModel、绑定模型、调用并提取结构化字段。
📝 核心知识点
1. Pydantic 数据模型定义
- 概念说明:所有结构化输出的数据模型都必须继承自
BaseModel,使用类型提示定义字段。 - 关键细节:
- 字段类型丰富:
str、int、float、list、Optional等 - 通过
Field(description="...")提供字段描述和默认值 - 与上一章 Tools 中
args_schema的设置方式类似
- 字段类型丰富:
2. 绑定模型与调用
- 核心方法:
model.with_structured_output(Person)将 Pydantic 模型与大模型绑定,返回一个新的"结构化大模型" - 调用方式:通过绑定后的模型调用
invoke(),结果自动符合定义的格式 - 结果类型:返回的是 Pydantic 类的实例,可以直接通过
.访问字段(如result.name、result.age)
3. Pydantic 作为首选模式的原因
- 运行时强制类型校验:如果模型返回的字段与定义不匹配(如少字段、类型错),会直接抛出异常
- 其他三种模式(TypedDict、JSON Schema、DataClass)返回的是字典,不会做强制校验
🏗️ 架构与工作流
💻 代码实战
示例一:人物信息提取
from pydantic import BaseModel, Field
class Person(BaseModel):
"""人物的信息"""
name: str = Field(description="姓名")
age: int = Field(description="年龄")
occupation: str = Field(description="职业")
structured_model = model.with_structured_output(Person)
result = structured_model.invoke("张三是一名30岁的软件工程师")
print(result) # Person 类型实例
print(result.name) # 张三
print(result.age) # 30
print(result.occupation) # 软件工程师
示例二:电影信息提取
class Movie(BaseModel):
"""电影的详细信息"""
title: str = Field(description="电影标题")
year: int = Field(description="发行的年份")
director: str = Field(description="电影的导演")
rating: float = Field(description="电影的评分,满分10分")
structured_model = model.with_structured_output(Movie)
result = structured_model.invoke("给出电影《盗梦空间》的信息")
print(result) # Movie 类型实例
示例三:文本情感分析
class SentimentResult(BaseModel):
"""情感分析的结果"""
sentiment: str = Field(description="情感倾向:positive/negative/neutral")
confidence: float = Field(description="置信度")
keywords: list[str] = Field(description="关键词列表")
text = "这个课程的内容很详实,学到了很多知识,强烈推荐"
structured_model = model.with_structured_output(SentimentResult)
result = structured_model.invoke(text)
print(result.sentiment) # positive
print(result.confidence) # 0.98
print(result.keywords) # ['详实', '推荐', ...]
⚠️ 常见问题与避坑指南
- Pydantic 是唯一返回类实例的模式,类型不匹配时会抛异常,适合对数据质量要求严格的场景
- 字段 description 很重要:它会被转换成 JSON Schema 传给大模型,直接影响输出质量
with_structured_output返回的是新模型对象,原 model 不变
💡 个人总结与延伸
Pydantic 的基本使用流程非常简洁:定义类 → 绑定 → 调用。关键在于 Field(description=...) 的编写质量,它替代了传统提示词中对输出格式的冗长描述。建议在实际项目中始终为每个字段写好清晰的 description,这会显著提升大模型对输出格式的遵从度。