掌握流程的状态管理

理解流程中状态的作用:

状态系统允许你维护上下文,在步骤之间共享数据,并构建复杂的应用逻辑

为什么状态管理很重要:

1.维持上下文 2.构建复杂的条件逻辑 3.创建持久化应用 4.优雅地处理错误 5.拓展你的应用 6.实现对话式的应用

状态管理基础

流程状态生命周期:

1.初始化 2.修改 3.传输 4.持久化(可选):保存到存储中 5.完成

状态管理的两种方法:

1.非结构化状态:灵活性 2.结构化状态:使用Pydantic模型:类型安全性和验证

非结构化状态管理:

工作原理:

使用self.state访问状态,行为类似于字典;可以随时增删改查键;所有状态自动对所有流程方法可用

when

快速原型开发和简单流程;动态演变的状态需求;预先无法确定的结构情况;状态要求简单的流程

结构化状态管理

工作原理:

定义一个表述状态结构的Pydantic模型 模型类型作为类型参数传给flow类 通过self.state访问状态,行为类似于Pydantic模型实例 所有字段根据定义的类型进行验证

优势:

  1. 类型安全
  2. 自我文档化
  3. 验证
  4. IDE支持
  5. 默认值

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输出

状态管理最佳实践

  1. 保持状态聚焦:设计时仅包含必要内容
  2. 复杂流程使用结构化状态
  3. 记录状态转化
  4. 优雅地处理状态错误
  5. 使用状态进行进度跟踪
  6. 尽可能使用不可变操作