详细摘要 摘要
生成:2025-06-05 22:25摘要详情
- 音频文件
- 2025-05-21 | PyCon 2025 | Building AI Applications the Pydantic Way (Sponsor: Pydantic)
- 摘要类型
- 详细摘要
- LLM 提供商
- openai
- LLM 模型
- gemini-2.5-pro-exp-03-25
- 已创建
- 2025-06-05 22:25:31
摘要内容
概览/核心摘要 (Executive Summary)
Samuel Colvin (Pydantic创始人) 在 PyCon 2025 的演讲中,详细阐述了使用 Pydantic 生态系统(包括核心库 Pydantic、智能体框架 PydanticAI 和可观测性平台 Pydantic Logfire)构建AI应用的理念与实践。他指出,尽管AI领域日新月异,但构建可靠、可扩展和可维护的AI应用仍然是核心挑战,这与传统软件开发的工程原则一脉相承。Pydantic 通过其强大的数据校验和模型定义能力,为AI应用提供了坚实的数据结构基础。PydanticAI 作为一个新兴的智能体框架,强调类型安全、模型无关性,并利用模型上下文协议 (MCP) 实现与外部工具的交互,支持结构化输出、工具调用、记忆管理等功能。Pydantic Logfire 则通过与 OpenTelemetry 的集成,为AI应用提供深入的追踪、调试、性能监控和成本分析。演讲重点介绍了 Pydantic Evals 框架,它提供了一套类似 Pytest 的机制,用于对AI模型和应用进行系统的基准测试和迭代改进,支持自定义评估器和“LLM即评判者”等高级功能。Colvin 强调了对开放标准、稳定性和清晰文档的重视,并宣布 PydanticAI 将于2025年6月底发布v1.0版本,旨在为Python开发者提供一套高效、可靠的AI应用构建方案。
Pydantic 简介与AI领域应用
- Pydantic 核心数据与背景
- 创始人: Samuel Colvin
- 创建时间: 2017年 (早于生成式AI浪潮)
- 月下载量: 约3.5亿次 (约每秒140次)
- 用户群体: 广泛应用于Python生态,包括通用开发、FastAPI等,同时也被所有主流生成式AI库和框架使用。
- SDKs: OpenAI, Anthropic, Cohere (原文为rock), Google 等。
- 智能体框架: Langchain, LlamaIndex, CrewAI 等。
- Pydantic 公司与新产品
- 公司成立于2023年初。
- Pydantic Logfire: 开发者优先的可观测性平台。
- PydanticAI: 智能体框架。
- 行动号召: 邀请参会者前往Pydantic展台体验Logfire演示、领取T恤和贴纸,并参与抽奖。
构建AI应用的核心原则与挑战
- 行业现状:
- AI领域变化极快,但构建可靠、可扩展应用的基础需求不变。
- 生成式AI (GenAI) 功能强大,但Colvin认为其“完全是一头难以驾驭的猪 (a complete pig to work with)”,使得构建可靠应用更具挑战。
- Pydantic 的主张:
- 演讲旨在分享一套“有主见的AI开发蓝图 (opinionated blueprint for AI development in Python)”。
- 核心原则超越具体工具。
- 关键技术原则:
- 类型安全 (Type Safety):
- 在Python和TypeScript中日益重要。
- 随着AI越来越多地编写代码 (如自动补全、代码生成),类型检查成为AI智能体最有效的反馈形式,因其无副作用且执行速度快 (未来将因 "ti" [不确定具体指代,可能为某种类型检查加速工具] 而更快)。
- Colvin批评其他一些智能体框架为了自身原因牺牲了类型安全。
- 模型上下文协议 (Model Context Protocol, MCP): 一种允许本地LLM应用访问外部工具和资源的协议。
- 评估 (Evals): AI应用测试和基准评估的重要性。
- 可观测性 (Observability): 通过Logfire贯穿始终。
- 类型安全 (Type Safety):
PydanticAI:智能体 (Agent) 框架详解
- 智能体定义与行业共识:
- 采纳Anthropic和OpenAI等公司目前较为统一的智能体定义。
- 引用了Barry Zhang (Anthropic) 在AI Engineer大会上展示的伪代码:智能体接收环境、工具、系统提示 (现多称“指令”),运行LLM,获取工具调用指令,执行工具,更新状态,循环此过程。
- 伪代码中的一个bug (while循环无法退出) 指出了智能体何时停止循环这一难题。
- PydanticAI 核心特性:
- 模型无关性: 支持一行代码切换不同LLM (如OpenAI GPT-4o, Gemini, Anthropic, Google, Groq等),方便比较模型性能。
- Direct API: PydanticAI本周发布的新功能,提供统一接口直接调用各模型,无需智能体封装。
- 类型安全的工具定义: 使用
@agent.tool装饰器和泛型Deps上下文对象,确保工具函数参数和上下文访问的类型安全。
- 代码示例:结构化数据提取 (非智能体行为)
- 定义Pydantic模型
Person(name, date of birth, city)。 - PydanticAI智能体配置输出类型为
Person。 - 从非结构化文本中提取信息并填充到
Person实例。 - Colvin指出这仅为单次LLM调用,并非真正的智能体循环。
- 定义Pydantic模型
- 代码示例:具备校验与重试能力的智能体循环
- 在
Person模型中添加函数校验器 (如出生日期需在19世纪)。 - LLM初次提取数据若未满足校验条件,Pydantic的校验错误会被反馈给LLM。
- LLM根据错误信息进行修正并重试,形成智能体循环。
- Logfire演示:
- 展示了两次对Gemini模型的调用。
- 第一次调用因校验失败,第二次调用根据校验错误修正后成功。
- Logfire追踪视图显示了每次调用的耗时和(若可用)价格信息。
- 在
- 代码示例:工具使用与长短期记忆
- 长期记忆 (Tool-based Memory / Long-Term Memory):
- 通过定义工具 (如
record_memory,retrieve_memory) 与外部系统 (如PostgreSQL数据库) 交互,实现记忆的持久化存储和检索。 - Logfire演示:
- 追踪显示智能体调用、LLM调用、工具调用以及工具内部的数据库查询 (如SQL插入和查询语句)。
- 可观测性数据帮助分析性能瓶颈 (如数据库查询耗时远小于LLM调用耗时)。
- 通过定义工具 (如
- 短期记忆 (Context Memory / Short-Term Memory):
- 将历史消息或相关信息直接放入LLM的上下文窗口中。
- 示例:从数据库查询历史消息,通过
message_history参数传递给智能体。 - Logfire演示:
- 通常比长期记忆更快 (示例中700ms vs 1.6s),因其减少了额外的工具调用和LLM调用。
- 追踪显示历史消息被包含在LLM的上下文中。
- 长期记忆 (Tool-based Memory / Long-Term Memory):
模型上下文协议 (MCP) 的应用
- MCP 简介与核心原语:
- 由Anthropic于2023年12月左右推出,旨在让本地LLM应用 (如Claude Desktop, Cursor) 以标准化方式访问外部工具和资源。
- 三大原语:
- 工具 (Tools): PydanticAI目前主要使用的部分。
- 资源 (Resources): 指文档等,供模型下载并放入上下文 (PydanticAI未来计划支持)。
- 提示 (Prompts): 特定查询的模板 (如包含数据库模式的模板),目前使用较少。
- Colvin提及MCP的创造者之一David Perea对于资源和提示原语未被广泛使用感到些许失望。
- PydanticAI 对 MCP 的应用:
- 用于连接和管理外部工具服务。
- 代码示例:
mcp-run-python(沙盒化Python执行)- PydanticAI内置的MCP服务,用于在沙盒环境中执行Python代码。
- 技术栈: Pyodide (Python in Wasm) -> Deno (JavaScript/TypeScript运行时,提供隔离) -> Wasm。Colvin形容为“Python inside Deno, inside JavaScript, inside Wasm running Python code”。
- 安全性: 强调其隔离性优于某些简单阻止导入的方案 (如批评Hugging Face Small Agents的隔离机制不足)。
- 用例: 执行LLM生成的Python代码进行计算 (如计算两个日期之间的天数),避免LLM直接进行复杂计算。OpenAI内部也采用类似机制。
- Logfire演示: 追踪显示LLM调用 -> MCP工具调用 (启动Python、安装依赖) -> Python代码执行 -> LLM调用生成最终回复。
- 未来:
mcp-run-python将支持回调宿主机函数,例如处理大型HTML文件时,LLM生成Beautiful Soup代码在沙盒中执行,但可回调宿主机获取文件。
- 代码示例:Playwright MCP 服务 (浏览器控制)
- 使用微软维护的Playwright库提供的MCP服务器,实现对浏览器的程序化控制。
- 用例: 让智能体访问Pydantic网站,找到最新的博客文章并进行总结。
- Logfire演示:
- 追踪多次浏览器导航和页面交互的工具调用。
- Playwright MCP服务器会将HTML页面简化为YAML格式,便于LLM处理并减少上下文占用。
- 显示了整个复杂任务的成本 (示例中为15美分)。
Pydantic Logfire:AI应用的可观测性
- 核心功能:
- 提供详细的追踪信息,包括LLM调用、工具调用、函数执行、数据库查询等。
- 帮助调试AI应用,理解其内部行为。
- 分析性能瓶颈和优化机会。
- 聚合和显示AI调用的成本。
- 支持通过SQL查询追踪数据,构建自定义仪表盘。
- 与开放标准的集成 (OpenTelemetry):
- Logfire后端虽为闭源,但其构建于OpenTelemetry之上。
- PydanticAI和Logfire SDK发出的数据遵循OpenTelemetry的GenAI语义约定。
- 用户可以将数据发送到任何兼容OpenTelemetry的平台,不局限于Logfire。Colvin强调“我们不试图进行锁定 (We're not trying to do the lock-in thing)”。
- 应用场景: 贯穿于演讲中的所有PydanticAI示例,用于展示智能体行为、调试问题、追踪性能和成本。
Pydantic Evals:评估AI应用的框架
- Evals 的重要性与挑战:
- 对于随机的、非确定性的AI应用,Evals类似于基准测试而非简单的单元测试。
- 评估AI输出的正确性和质量是一门仍在发展的艺术/科学,尚无完美解决方案。
- Pydantic Evals 的设计理念:
- 旨在成为“该领域的Pytest (Pytest of this space)”。
- 提供运行评估的框架和有用工具 (如“LLM即评判者”),而非规定具体的评估方法。
- 核心流程与功能:
- 数据集构建:
- 可以人工编写,或从Logfire等平台收集真实用户数据。
- 示例中使用强大模型 (GPT-4o) 通过PydanticAI生成包含输入、预期输出和评估器的测试用例,并输出为YAML文件。
- YAML文件支持JSON Schema,可在编辑器中提供自动补全和校验。
- 评估器定义:
- 内置评估器:如
IsInstanceOfSuccess(检查是否成功返回特定类型)、LLMJudge(使用LLM根据指定准则评估输出)。 - 自定义评估器:通过继承
Evaluator基类并实现evaluate方法来定义。
- 内置评估器:如
- 运行评估:
pydantic-evals可与Logfire集成 (可选)。- 命令行或代码中运行评估,输出类似Pytest的摘要报告。
- Logfire演示:
- 展示每个评估案例的运行情况,哪些断言通过/失败。
- 可深入查看失败案例的具体追踪信息,分析原因。
- 示例:通过修改智能体提示 (增加“总是用第二人称回复”),重新运行评估,成功率从80%提升到83%。
- 模型对比:
- PydanticAI的
override方法允许在评估时轻松替换智能体使用的模型。 - 示例:对比GPT-4o和Claude 37在同一评估集上的表现 (GPT-4o: 76% vs Claude 37: 78%)。
- PydanticAI的
- 数据集构建:
- 采用情况: 已有公司开始大规模使用Pydantic Evals (例如某公司一天花费25000美元运行评估)。
PydanticAI 的未来展望与版本计划
- 即将推出的功能增强:
- 结构化输出: 支持不依赖工具调用的结构化输出方式 (如利用模型内置能力或在指令中嵌入JSON Schema),对不擅长工具调用的简单模型更友好。
- MCP采样 (MCP Sampling): MCP服务器请求客户端代理LLM请求的强大功能。
- 工具注册控制: 更细致地控制在特定步骤注册哪些工具。
mcp-run-python回调: 允许沙盒中的Python代码回调宿主机函数。- 图计算库 (Graph Library): 类似LangGraph但类型安全的实现,将进行改进以增强组合性。
- 记忆持久化抽象: 简化对智能体记忆持久化机制的访问。
- 版本与稳定性承诺:
- PydanticAI 尚年轻 (2023年12月发布)。
- PydanticAI v1.0 版本计划于2025年6月底发布。
- 发布v1.0后将严格遵循语义化版本控制 (Semantic Versioning),避免破坏性更改。
问答环节重点
- 内部/自托管模型支持: 是的,可以通过实现
Model抽象基类或配置OpenAI兼容的API端点来支持。 - 异步支持: PydanticAI内部完全是异步的,同步方法是封装。在某些线程环境 (如Celery) 中使用同步接口可能存在问题。
- 视觉模型支持: 对多模态输入有一定的支持,多模态输出方案尚在完善中。
- Llama 3.1等模型支持: 支持多种模型,并欢迎对广泛使用模型的PR。
- Langchain Runnable到PydanticAI模型的转换: Colvin表示这是个有趣的想法,愿意考虑相关实现。
- 本地模型结构化输出的约束生成: 目前主要依赖JSON Schema。对于何时依赖模型自身能力,何时提供辅助工具,是一个需要权衡的问题 ("don't bet against the model" vs 现实需求)。
- Logfire中自托管模型的定价配置: 正在开发中。计划构建一个开源的模型价格数据库,并在PydanticAI中计算价格,允许用户自定义价格,并能在Logfire中基于价格进行查询。
- 智能体在模糊情况下的停止条件:
- 若未指定输出类型,则迭代至产生文本输出为止。
- 若指定输出类型,则内部注册一个
final_result工具,模型调用此工具即视为运行结束。若校验失败,则将错误反馈给模型重试 (次数可配置)。
- 文档质量与维护 (对比Langchain等): Pydantic的文档示例都经过单元测试,确保可运行。团队拥有经验丰富的开源维护者。
核心结论
Samuel Colvin的演讲清晰地展示了Pydantic团队在AI应用开发领域的战略布局和技术实践。通过Pydantic核心库、PydanticAI智能体框架和Pydantic Logfire可观测性平台,他们致力于提供一套类型安全、模块化、可观测且易于评估的工具链。其核心理念是将成熟的软件工程原则应用于AI开发,强调通过结构化、可测试和可维护的方式来应对AI系统固有的复杂性和不确定性。对开放标准和开发者体验的重视,以及即将发布的PydanticAI v1.0,预示着Pydantic生态将在Python AI开发中扮演越来越重要的角色。