PydanticAI:打造穩(wěn)健的生成式AI代理框架
感谢julienTromeur拍摄,照片来自Unsplash
生成式AI领域是人类历史上增长最快的技术领域之一。正如你可能听说的,2025年将是AI代理或多个AI代理的时代,从单一的大型语言模型转向。当前的发展趋势也证实了这一点:像AWS、OpenAI、微软等大型科技巨头相继推出了AI代理框架。
PydanticAI 演示应用
到目前为止,所有发布的版本中,PydanticAI 代理框架工具被认为是最有用和最重要的一个发布,由于它支持 Pydantic 和 LLMs 的结合。
点击 Gumroad 上的 datasciencepocket 进行订阅。datasciencepocket.gumroad.com在我们理解为什么PydanticAI是一个重要的框架之前,我们首先需要理解。
Pydantic是什么?Pydantic 是一个用于轻松验证和解析数据过程的 Python 库。它帮助确保您的数据准确且符合预期的结构。在处理诸如 JSON 文件、用户数据或 API 响应之类的外部输入时特别有用。
不必为每个字段手动编写这些检查(例如,“是不是整数?字符串是否过长?”),Pydantic 利用 模型 自动执行这些检查。
比如说你在做一个App,让用户都填写他们的姓名、年龄和电子邮件。你希望确保用户提交的信息准确无误:
名字是字符串形式的。
年龄是数字形式的。
邮箱地址格式正确。
Pydantic 如何让这变得更容易如下:
从 pydantic 导入 BaseModel, EmailStr # 导入所需的模块
# 定义一个用户模型
class User(BaseModel):
name: str
age: int
email: EmailStr
# 示例输入数据
user_data = {
"name": "Alice",
"age": 25,
"email": "alice@example.com"
}
# 验证输入数据
user = User(**user_data)
print(user.name) # Alice
print(user.age) # 25
print(user.email) # alice@example.com
如果数据不对怎么办?
如果用户输入了无效的数据(例如:“age": "twenty-five"),Pydantic 会自动报错:
user_data = {
"name": "Alice",
"age": "twenty-five", # 错误
"email": "alice@example.com"
}
user = User(**user_data)
# 错误:年龄不是一个有效的整数
在部署过程中,Pydantic非常重要,通常必须遵循其规则。
大规模数据验证: Pydantic 自动验证大规模输入数据,确保数据结构符合预期,从而减少错误。
错误处理和调试: 它提供清晰的错误信息,使生产调试更快更简单。
自动解析和序列化: Pydantic 自动将原始数据转换为可用格式,简化数据处理。
与 FastAPI 融合良好: 它与 FastAPI 无缝合作,定义输入输出模型以处理生产环境中的 HTTP 数据。
确保微服务的健壮性: Pydantic 确保微服务之间一致且有效的数据交换,避免集成错误。
防止安全问题: 它在输入点验证数据,防止恶意输入并增强应用安全性。
现在,我们已经理解了 Pydantic 的重要性,让我们回到 PydanticAI。
PydanticAI的关键特性:代码和配置结构化响应处理:利用 Pydantic 验证静态和流式响应,确保可靠的数据处理。
支持多种模型:兼容 OpenAI、Gemini 和 Groq 模型,并提供简单接口以集成其他模型。
基于 Pydantic 专家级开发:由 Pydantic 的创建者开发,是 LangChain、OpenAI SDK 等流行框架的核心。
简化依赖管理:引入类型安全的依赖注入系统,简化测试和迭代开发。
符合 Python 编程风格:采用标准的 Python 编程实践进行代理组合和控制流设计,便于开发者使用。
使用 Logfire 监控:集成 Logfire 以追踪性能和调试 AI 驱动的应用程序。
类型安全操作:确保健壮、类型检查的工作流程,减少运行时错误。
处于活跃的测试版:目前处于测试版,提供持续改进和反馈驱动更新的空间。
让我们快速创建一个简易的 PydanticAI 程序,并看看它是怎么工作的
运行 pip install
命令
pip install 'pydantic-ai-slim[openai,vertexai,logfire]'
这将安装带有openai、vertexai和logfire扩展的pydantic-ai-slim包。
2. 设置您的LLM提供商的API密钥。Pydantic可以立即与OpenAI、Groq和VertexAI等提供商一起使用。
2. 创建一个使用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='查询的风险等级(0到10)', 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}'"
@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='你好,John。你的当前账户余额(含未完成交易)是 $123.45。' block_card=False risk=1
"""
result = await support_agent.run('我刚刚把我的卡弄丢了!', deps=deps)
print(result.data)
"""
support_advice="听到这个消息我很难过,John。我们将暂时冻结你的卡以防止未经授权的交易。" block_card=True risk=8
"""
了解编程代码的意思
数据类装饰器(支持依赖)- 目的:定义代理需要的依赖项,例如客户ID和数据库连接(
db
)。 - 用途:传递给代理,以便在查询时访问特定客户的资料信息。
- 目的是:规定代理的输出的结构化格式。
support_advice
: 为客户提供支持的建议。
block_card
: 是否需要冻结客户的卡片。
risk
: 描述情况的风险等级(0到10)。
- 验证:保证数据正确性(例如,
risk
必须介于 0 和 10 之间)。
- 使用
openai:gpt-4o
模型来生成响应。 - 指定依赖类型(
deps_type
)和预期输出(result_type
)。 - 包含一个系统提示,用于为代理设定上下文,指示其提供支持并评估查询的风险。
目的:动态地通过查询数据库,在系统提示中加入客户的姓名,以增强系统提示。
它是怎么工作的
自定义工具(Custom Tool)使用客户ID(
ctx.deps.customer_id
)访问数据库(ctx.deps.db
)。返回一个包含客户姓名的字符串,以便更好地个性化交互。
目的说明:增加一个功能来查询客户的账户余额,可以选择包含未完成的交易。
它是怎么工作的
运行代理程序根据客户ID和
include_pending
标记查询数据库。返回余额(浮点数形式)。
目的:展示如何通过传递查询和依赖与代理互动。
步骤如下:
创建一个
SupportDependencies
对象,使用客户 ID 和数据库连接。调用代理的
run
方法,传入查询 ('What is my balance?'
)。代理根据查询、依赖项和工具生成回复。
正如你所观察到的,输出遵循SupportResult (Risk是整数, Block_card是布尔值)类的定义,因此解决了从LLMs获取结构化输出的一大难题。
结尾总之,PydanticAI 提供了一个强大的框架,用于构建具有生成式人工智能的健壮且生产级的应用程序。通过利用 Pydantic 的数据验证能力并无缝集成大型语言模型,它确保了结构化、类型安全且安全的交互。其易用性以及对多种 AI 模型的支持,使其成为开发人员构建 AI 代理的不可或缺的工具。随着 PydanticAI 的持续发展,它承诺简化 AI 驱动应用的开发,并提高其可靠性和扩展性。
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章