Compare · 横评对比
BAML vs PydanticAI:结构化抽取接口与 Python Agent 流程怎么选?
BAML 适合可复用的类型化抽取接口,PydanticAI 适合带工具和上下文的 Python Agent。比较输出校验、组合方式、权限、幂等和费用。
| 维度 | baml | pydantic-ai |
|---|---|---|
| 主要层次 | 类型化函数与工具链 | Python Agent 与运行流程 |
| 输出定义 | BAML 类型与对应集成接口 | output_type 与输出校验器 |
| Python 集成 | v0 生成 Pydantic 类型 | 使用 Python 类型与 Pydantic |
| 工具和上下文 | 按版本与应用设计组合 | 提供工具、依赖与运行机制 |
| 事实与权限 | 应用验证来源和权限 | 应用验证来源和权限 |
| 版本条件 | 区分 v0 SDK 与新工具链 | 核对框架版本与 provider |
| 软件许可 | Apache-2.0 | MIT |
| 资源费用 | 模型、部署与日志另计 | 模型、部署和可选服务另计 |
需要把文档抽取维护成类型化函数并接入现有应用,可以优先比较 BAML;需要在 Python 中组织 Agent 的工具、依赖和运行上下文,PydanticAI 更值得先试。它们可以在不同层次配合使用,选择时先确定抽取之外还有哪些任务。
本文于 2026 年 10 月 14 日核对资料,未进行统一模型的性能或准确率测试。
核心差异速览
| 维度 | BAML | PydanticAI |
|---|---|---|
| 主要组织方式 | 类型化函数、提示词与工具链 | Python Agent 与运行流程 |
| 输出定义 | 在 BAML 中声明类型并生成或桥接接口 | 以 output_type 和校验器定义输出 |
| Python 集成 | v0 SDK 可生成 Pydantic 类型 | 框架使用 Python 类型与 Pydantic |
| 工具与上下文 | 按所用版本及应用设计组合 | 有工具、依赖、消息与运行机制 |
| 事实核对 | 来源与业务规则另做检查 | 来源与业务规则另做检查 |
| 版本条件 | 当前区分 v0 SDK 和新工具链 | 核对框架版本与 provider 支持 |
| 软件许可 | Apache-2.0 | MIT |
| 运行费用 | 模型与资源另计 | 模型、资源与可选托管服务另计 |
参见 BAML SDK 流程、PydanticAI 概览。本表用工作层次解释选择,不声称任一工具在所有任务中更强。
BAML 适合可复用的抽取接口
例如多个服务需要从项目记录中获得名称、负责人和日期,可以将输入输出定义与提示词集中维护,再让调用方使用对应接口。BAML v0 的 Python 路径将类型生成为 Pydantic 模型,供应用继续处理。Python 集成
这适合明确的抽取任务:输入一份资料,返回一组字段及来源证据。应用可以把这个函数放入自己的队列、服务或工作流。
版本要明确。当前官网提示 BAML 1.0 即将 GA,而文档仍提供 v0 SDK 路径。新的语言能力不应直接套用到旧客户端示例;团队应保存 runtime、生成器和编辑器版本。官网、版本同步
PydanticAI 适合具有工具和上下文的流程
当模型需要先查询资料、调用工具,然后返回类型化结果时,PydanticAI 的 Agent、工具与依赖机制值得比较。输出可以使用类型定义,也可加入输出校验函数。输出文档、工具文档
例如一个项目助手需要先根据当前用户权限检索记录,再抽取信息、提出待确认操作。这种流程涉及身份、上下文、工具结果和输出状态,应在 Agent 与应用之间明确分工。
工具调用能够形成工作流,但授权仍应来自业务系统。模型生成的用户 ID、文档 ID 或工具参数不能直接证明它有权限访问相应对象。
两者怎样组合
一种可行设计是由 Agent 获取经授权的资料,再调用独立抽取函数,随后做来源与业务校验。另一种设计是用 PydanticAI 自身的 output_type 完成抽取。选择哪种,需要比较团队维护成本和已有接口。
组合时保留明确责任:谁检索文档、谁调用模型、谁检查结果、谁审批外部写入。不要让两个层次都自动重试而没有总请求上限,避免一次失败引发叠加调用。
也不要为了使用框架而扩展任务。如果只需要提取少数字段,一个清晰函数与校验步骤可能已经足够。
类型检查不能代替事实与权限检查
输出对象符合类型,只能说明结果满足相应结构条件。原文中有多个日期时,选错字段仍可能通过校验。应要求段落 ID 和精确引句,再检查是否真正支持目标含义。
PydanticAI 提供输出校验器,可以访问运行上下文,并在需要时反馈重试;BAML v0 提供 check/assert 与错误路径。业务程序需要决定何时重试、何时标记缺失、何时交给人工。PydanticAI 输出校验、BAML 校验规则
对于要写回系统的字段,应取得最终结果并完成验收。流式部分对象用于展示时,还需显示未完成状态,避免用户把临时内容当作已批准数据。
故障、历史与幂等怎么设计
保存文档版本、类型定义、提示词、模型配置、调用记录和最终验收状态。重新执行抽取时,应知道它针对哪一份来源,不能悄悄换成更新后的文档。
外部写入使用业务幂等键,例如“文档 revision + 审批版本 + 动作类型”。重复生成相同对象不代表已经完成的操作可以再执行。审批完成之后,也要重新核对对象权限与资料是否仍适用。
候选方案的测试至少覆盖超时、取消、截断、来源缺失、错误证据、权限失效和重复请求。关注业务系统最终状态,别只检查函数是否没有抛异常。
软件费用与数据去向
BAML 开源软件免费、Apache-2.0,当前云套餐金额未公开;PydanticAI 开源框架采用 MIT。模型、部署、日志和可选托管服务按各自条件计费。BAML 价格、BAML 仓库、PydanticAI 仓库
本地程序调用云模型时,输入仍会发给所选 provider。记录数据接收方、日志范围和保留期限。使用 fallback 时,应将新 provider 纳入数据审查和预算。
应该选哪一个
先比较 BAML:团队希望维护可复用的抽取函数和类型接口,应用本身已有任务与状态管理。
先比较 PydanticAI:Python 应用需要工具、依赖和运行上下文,希望在 Agent 流程内处理类型化结果。
考虑组合:Agent 负责取得授权资料,抽取函数负责返回字段,应用负责事实核对、审批与写入。先用 文档抽取与事实校验教程 验证这种边界,再扩大任务。更多选型见 5 款结构化输出工具推荐。
结论
需要可复用抽取函数与类型接口,先比较 BAML;需要 Python Agent 的工具、依赖和上下文,先比较 PydanticAI。也可按职责组合,应用负责权限、事实核验、审批与幂等写入。
常见问题
- PydanticAI 只是一个输出校验库吗?
- 不是。它还提供 Agent 工具、依赖和运行流程,结构化输出是其中一部分。
- BAML 能与 PydanticAI 组合吗?
- 可以在应用层分工,例如 Agent 获取已授权资料,再调用抽取接口,并执行独立来源与业务验收。
- 有输出类型是否就能安全调用工具?
- 不能。工具权限需要根据当前用户身份和业务条件判断,模型生成参数不是授权证明。
- 怎样避免多层重试放大成本?
- 记录各层重试责任,设置全流程请求与费用上限,区分网络失败、类型失败和资料缺失。
- 外部写入如何避免重复?
- 使用业务幂等键、审批版本与执行状态。重复生成同一对象不代表可以再次执行已经完成的动作。
- 本文是否测试了性能?
- 没有。比较基于官方资料和工作流设计,没有统一模型准确率或延迟测试。