
上个月我给团队搭了个小工具:把一堆散落的简历自动塞进人才库。第一版我图省事,直接让大模型把信息"总结"成一段文字,再让下游代码去抠字段。
上线第一天就出了三个 bug。
这让我第一次认真想一个问题:AI 应用进入工程阶段后,核心不是让模型说得更漂亮,而是让它的输出能被程序稳定接住。
PydanticAI 解决的正是这个——它不是另一个"更会聊天的 Agent 框架",而是让大模型的输出从自然语言文本,变成可校验、可复用的 Python 对象。
你让模型从简历里抽关键信息,它返回得很漂亮:
李明是一位资深数据工程师,熟悉 Python、Spark、Flink 和 LangChain。
人读着没问题。但下一步你要把姓名写进数据库、把技能列表传给岗位匹配接口、把背景展示在前端——你拿到的只是一段自然语言,得自己从文字里把字段重新抠出来。
这一步特别容易变脏:
说白了,让大模型直接吐文本再让程序去解析,就像让同事看完简历用嘴给你汇报,你再凭记忆记笔记——总会漏、会错、还会加戏。
结构化输出,就是给这个同事一张固定格式的 Excel 模板:姓名一格、技能一格,填错格式他交不进来。
PydanticAI 建立在 Pydantic 之上。第一步不是写 Agent,而是定义你想要的形状:
from pydantic import BaseModel, Field
class ResumeSummary(BaseModel):
name: str = Field(description="候选人姓名")
summary: str = Field(description="一句话总结候选人的核心背景")
skills: list[str] = Field(min_length=1, description="从简历中抽取出的技能")这里的关键不在于定义了三个字段,而是定义了一份业务契约:它告诉大模型和所有调用方,输出必须按这个规矩来——name 是字符串、skills 是列表且不能为空、错了或不齐都不行。
Pydantic 模型不只是"定义字段",它是在给数据立规矩。
定义好契约后,连接发生在 Agent 这一层:
from pydantic_ai import Agent
agent = Agent(
model="deepseek:deepseek-chat",
output_type=ResumeSummary,
instructions=(
"你是一个简历结构化助手。"
"严格从简历原文抽取信息,禁止编造内容。"
"提取姓名、一句话职业背景总结、技能清单。"
),
)
result = agent.run_sync(resume_text)
print(result.output.name) # 李明
print(result.output.skills) # ['Python', 'Spark', 'Flink', 'LangChain']最关键的就一行:output_type=ResumeSummary。
这行代码干的事,和给函数声明返回类型一模一样——你不是在说"返回一段字",而是在说"返回的是一个 ResumeSummary 形状的东西"。模型一旦不照这个形状来,Pydantic 立刻在校验阶段报错,而不是等你的下游代码崩了才发现。
拿到结果后,它是一个标准 Pydantic 实例,直接 .model_dump() 转字典、.model_dump_json() 转 JSON、塞数据库,全程不用再解析文本。
文本输出 vs 结构化对象,差在这一张表:
维度 | 文本输出 | 结构化对象 |
|---|---|---|
程序解析 | 自己从文字抠 | 直接 |
字段缺失 | 静默出错 | Pydantic 校验即报错 |
类型 | 全是字符串 |
|
模型编造 | 难防 |
|
切换模型 | 重写解析逻辑 | 改配置即可 |
PydanticAI 另一个爽点是用字符串切模型,格式统一是 provider:model-name:
import os
model_name = os.getenv("MODEL_NAME", "deepseek:deepseek-chat")
# .env 里控制到底用谁
# MODEL_NAME=deepseek:deepseek-chat
# DEEPSEEK_API_KEY=你的 Key
# 换成 OpenAI?只改 .env,业务代码一行不动
# MODEL_NAME=openai:gpt-5-mini
# OPENAI_API_KEY=你的 Keydeepseek:deepseek-chat、openai:gpt-5-mini、anthropic:claude-sonnet-4-6、google:gemini-3-flash-preview——模型供应商从写死的业务代码,变成了配置文件里的一行。这点和把数据库密码放进 .env 是同一个思路:供应商是基础设施,不该污染你的逻辑。
回头看,PydanticAI 解决的不是"怎么让模型更聪明",而是一个更工程化的问题:
好的 AI 应用,不是让模型说得更漂亮,而是让它说得"程序听得懂"。
如果要把 AI 能力做成真正的应用,必须考虑:输出结构是否稳定、字段是否可校验、错误能否被发现、模型是否方便切换。
PydanticAI 让大模型不再只是一个聊天接口,而是变成 Python 工程里一个有输入、有输出、有类型约束的可靠组件。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。