掌握流程的状态管理
理解流程中状态的作用:
状态系统允许你维护上下文,在步骤之间共享数据,并构建复杂的应用逻辑
为什么状态管理很重要:
1.维持上下文 2.构建复杂的条件逻辑 3.创建持久化应用 4.优雅地处理错误 5.拓展你的应用 6.实现对话式的应用
状态管理基础
流程状态生命周期:
1.初始化 2.修改 3.传输 4.持久化(可选):保存到存储中 5.完成
状态管理的两种方法:
1.非结构化状态:灵活性 2.结构化状态:使用Pydantic模型:类型安全性和验证
非结构化状态管理:
工作原理:
使用self.state访问状态,行为类似于字典;可以随时增删改查键;所有状态自动对所有流程方法可用
when
快速原型开发和简单流程;动态演变的状态需求;预先无法确定的结构情况;状态要求简单的流程
结构化状态管理
工作原理:
定义一个表述状态结构的Pydantic模型 模型类型作为类型参数传给flow类 通过self.state访问状态,行为类似于Pydantic模型实例 所有字段根据定义的类型进行验证
优势:
- 类型安全
- 自我文档化
- 验证
- IDE支持
- 默认值
when
- 明确数据模式的复杂流程
- 多名开发者共同参与的团队项目
- 需要验证数据验证的应用城西
- 需要强制执行特定数据类型和约束的流程
自动状态ID
唯一标识符,对于非结构化,通过self.state[“id”]访问,对于结构化,则通过self.state.id访问 在流程中自动生成,整个生命周期不变,用于记录,跟踪和检索已经持久化的状态
动态状态更新
在步骤之间传递数据
流程方法可以返回值,这些值随后作为参数传递给监听方法
持久化流程状态
@persist()装饰器:可以自动执行状态持久化,在执行的关键点保存你的流程状态
类级别持久化:在每次方法执行后保存状态
方法级别持久化:更加细粒度的控制,将其用于特定方法
派生(Forking)持久化状态
@persist 在 kickoff / kickoff_async 上支持两种不同的水合模式。使用 resume (inputs["id"]) 继续同一血缘;使用 fork (restore_from_state_id) 从快照启动一个新的血缘
kickoff 后的 state.id | @persist 的写入位置 | |
|---|---|---|
inputs["id"] (恢复) | 提供的 id | 提供的 id (扩展历史记录) |
restore_from_state_id (派生) | 新的 id,或者如果已固定则为 inputs["id"] | 新的 id (源已保留) |
高级状态模式
条件启动和可恢复执行
flow支持条件@start()和用于HILT/循环场景的可恢复执行
基于状态的条件逻辑
使用状态在流程中实现复杂的条件逻辑
处理复杂的状态转换
对于复杂的状态转换,可以创建专用方法
与Crew一起的状态管理
将状态传给crew
将参数传给agent的创建方法中
在状态中处理crew输出
状态管理最佳实践
- 保持状态聚焦:设计时仅包含必要内容
- 复杂流程使用结构化状态
- 记录状态转化
- 优雅地处理状态错误
- 使用状态进行进度跟踪
- 尽可能使用不可变操作