完整指南:如何利用pydanticai框架提升llm的性能与效率!
- Rifx.Online
- Generative AI , Large Language Models , AI Applications
- 05 Mar, 2025
Photo by julien Tromeur on Unsplash
生成式人工智能领域
生成式人工智能领域是人类历史上增长最快的领域之一。正如您可能听说的,2025年将是人工智能代理/多人工智能代理的年份,逐渐从单一的LLMs转变。目前的发展显示出相同的趋势:像AWS、OpenAI、Microsoft等大型企业相继发布了人工智能代理框架。
到目前为止,所有发布中,PydanticAI代理框架似乎是最有用和最重要的发布,因为它支持Pydantic与LLMs的结合。
在我们理解为什么PydanticAI是一个关键框架之前,我们必须理解
什么是 Pydantic?
Pydantic 是一个用于轻松验证和解析数据的 Python 库。它有助于确保您的数据是准确的,并遵循预期的结构。在处理外部输入,如 JSON 文件、用户数据或 API 响应时,它尤其有用。
与其手动为每个字段编写检查(例如,“这是否是一个整数?这个字符串太长了吗?”),Pydantic 通过使用 模型 自动化这些检查。
假设您正在制作一个应用程序,用户提交他们的姓名、年龄和电子邮件。您想确保:
姓名是一个字符串。
年龄是一个数字。
电子邮件是有效格式。
这里是 Pydantic 如何使这变得简单:
from pydantic import BaseModel, EmailStr
class User(BaseModel):
name: str
age: int
email: EmailStr
user_data = {
"name": "Alice",
"age": 25,
"email": "[email protected]"
}
user = User(**user_data)
print(user.name)
print(user.age)
print(user.email)
如果数据不正确怎么办?
如果用户提交了无效数据(例如,"age": "twenty-five"
),Pydantic 将自动抛出错误:
user_data = {
"name": "Alice",
"age": "twenty-five",
"email": "[email protected]"
}
user = User(**user_data)
Pydantic 在部署中扮演着关键角色,因为通常必须遵循:
大规模数据验证: Pydantic 自动验证大规模输入数据,以确保其符合预期结构,从而减少错误。
错误处理和调试: 它为无效数据提供清晰的错误信息,使生产调试更快、更容易。
自动解析和序列化: Pydantic 自动将原始数据转换为可用格式,简化数据处理。
与 FastAPI 的良好集成: 它与 FastAPI 无缝协作,以定义处理生产中 HTTP 数据的输入/输出模型。
确保微服务的稳健性: Pydantic 确保微服务之间的一致和有效的数据交换,以避免集成问题。
防止安全问题: 它在入口点验证数据,以阻止恶意输入并增强应用程序安全性。
现在,既然我们了解了 Pydantic 的重要性,让我们回到 PydanticAI。
PydanticAI 的关键特性:
结构化响应处理:利用 Pydantic 验证静态和流式响应,确保可靠的数据处理。
多功能模型支持:与 OpenAI、Gemini 和 Groq 模型兼容,并提供简单的接口以集成其他模型。
扎根于 Pydantic 专业知识:由 Pydantic 的创建者开发,Pydantic 是 LangChain、OpenAI SDK 等流行框架的基础。
简化的依赖管理:引入类型安全的依赖注入系统,以简化测试和迭代开发。
Pythonic 设计:采用标准的 Python 编程实践进行 Agent 组合和控制流,使开发人员直观易用。
与 Logfire 监控:包括与 Logfire 的集成,以跟踪性能和调试 AI 驱动的应用程序。
类型安全的操作:确保强健的、经过类型检查的工作流程,最小化运行时错误。
处于积极的 Beta 阶段:目前处于测试阶段,提供持续改进和反馈驱动更新的空间。
代码和设置
让我们快速构建一个虚拟的 PydanticAI Agent,看看它是如何工作的
-
Pip 安装
pip install 'pydantic-ai-slim\[openai,vertexai,logfire\]'
-
为您的 LLM 提供者设置 API 令牌。 Pydantic 可以立即与 OpenAI、Groq 和 VertexAI 配合使用。
-
创建一个 PydanticAI Agent。 这段代码实现了一个 银行支持代理,使用 PydanticAI。它利用结构化依赖、定义的结果模式以及与数据库中客户数据交互的工具。
from dataclasses import dataclass from pydantic import BaseModel, Field from pydantic_ai import Agent, RunContext from bank_database import DatabaseConn @dataclass class SupportDependencies: customer_id: int db: DatabaseConn class SupportResult(BaseModel): support_advice: str = Field(description='返回给客户的建议') block_card: bool = Field(description="是否阻止客户的卡片") risk: int = Field(description='查询的风险级别', ge=0, le=10) support_agent = Agent( 'openai:gpt-4o', deps_type=SupportDependencies, result_type=SupportResult, system_prompt=( '您是我们银行的支持代理,提供客户支持并判断他们查询的风险级别。' ), ) @support_agent.system_prompt async def add_customer_name(ctx: RunContext[SupportDependencies]) -> str: customer_name = await ctx.deps.db.customer_name(id=ctx.deps.customer_id) return f"客户的名字是 {customer_name!r}" @support_agent.tool async def customer_balance( ctx: RunContext[SupportDependencies], include_pending: bool ) -> float: """返回客户当前的账户余额.""" return await ctx.deps.db.customer_balance( id=ctx.deps.customer_id, include_pending=include_pending, ) async def main(): deps = SupportDependencies(customer_id=123, db=DatabaseConn()) result = await support_agent.run('我当前的余额是多少?', deps=deps) print(result.data) """ support_advice='你好,约翰,你当前的账户余额,包括待处理交易,是 $123.45。' block_card=False risk=1 """ result = await support_agent.run('我刚刚丢了我的卡!', deps=deps) print(result.data) """ support_advice="很抱歉听到这个,约翰。我们暂时会阻止你的卡,以防止未经授权的交易。" block_card=True risk=8 """
理解代码
Dataclass 装饰器(支持依赖)
- 目的:定义 Agent 需要的依赖,例如客户 ID 和数据库连接 (
db
)。 - 使用:传递给 Agent,以便在查询期间访问特定客户的数据。
SupportResult
- 目的: 指定代理输出的结构化格式。
support_advice
: 针对客户的文本建议。
block_card
: 客户的卡是否应该被阻止。
risk
: 查询中描述的情况的风险级别 (0-10)。
- 验证: 强制数据完整性(例如,
risk
必须在 0 和 10 之间)。
Agent Setup
- 使用
openai:gpt-4o
模型生成响应。 - 指定依赖项(
deps_type
)和预期输出(result_type
)。 - 包含一个 system prompt,设置代理的上下文,指示其提供支持并评估查询风险。
系统提示功能
目的:通过查询数据库动态丰富系统提示,包含客户的姓名。
工作原理:
使用客户 ID (
ctx.deps.customer_id
) 访问数据库 (ctx.deps.db
)。
返回一个包含客户姓名的字符串,以个性化互动。
自定义工具
目的:添加一个工具以获取客户的账户余额,可选择性地包括待处理的交易。
工作原理:
使用客户 ID 和
include_pending
标志查询数据库。
返回余额,类型为浮点数。
运行代理
目的:演示如何通过传递查询和依赖项与代理进行交互。
步骤:
- 创建一个
SupportDependencies
对象,包含客户 ID 和数据库连接。 - 使用查询调用代理的
run
方法('我的余额是多少?'
)。 - 代理根据查询、依赖项和工具生成响应。
正如您可能观察到的,输出以 SupportResult
类中定义的格式呈现(风险为 int,Block_card 为 Bool),因此解决了 LLMs 结构化输出的一个重大问题。
结论
总之,PydanticAI 提供了一个强大的框架,用于构建稳健的、生产级的生成式 AI 应用程序。通过利用 Pydantic 的数据验证能力并与 LLMs 无缝集成,它确保了结构化、类型安全和安全的交互。它的易用性以及对多种 AI 模型的支持,使其成为开发 AI 代理的开发者们不可或缺的工具。随着 PydanticAI 的不断发展,它有望简化 AI 驱动应用程序的开发,并增强其可靠性和可扩展性。