持久化执行
持久化执行是一种技术,其中进程或工作流在关键点保存其进度,允许它暂停并稍后从中断的地方恢复。这在需要人在回路中(human-in-the-loop)的场景中特别有用,用户可以在继续之前检查、验证或修改流程,也适用于可能遇到中断或错误的长时间运行任务(例如,调用 LLM 超时)。通过保留已完成的工作,持久化执行使流程能够恢复而无需重新处理先前的步骤——即使在很长时间延迟之后(例如,一周后)。
Spring AI Alibaba Graph 的内置持久化层为工作流提供了持久化执行,确保每个执行步骤的状态都保存到持久化存储中。此功能保证如果工作流被中断——无论是由于系统故障还是人在回路中的交互——它都可以从最后记录的状态恢复。
如果您在使用 Spring AI Alibaba Graph 时配置了检查点器(checkpointer),则已经启用了持久化执行。您可以在任何时候暂停和恢复工作流,即使在中断或失败之后也是如此。
为了充分利用持久化执行,请确保您的工作流设计为确定性和一致性重放,并将任何副作用或非确定性操作包装在节点中。
要求
要在 Spring AI Alibaba Graph 中利用持久化执行,您需要:
-
通过指定检查点器(checkpointer)在工作流中启用持久化,该检查点器将保存工作流进度。
-
在执行工作流时指定线程标识符(thread identifier)。这将跟踪工作流特定实例的执行历史。
-
将任何非确定性操作(例如,随机数生成)或具有副作用的操作(例如,文件写入、API 调用)包装在节点中,以确保在恢复工作流时,这些操作不会在特定运行中重复,而是从持久化层检索它们的结果。有关更多信息,请参阅确定性和一致性重放。
确定性和一致性重放
当您恢复工作流运行时,代码不会从执行停止的同一行代码恢复;相反,它将从上次停止的 Node 节点 第一行代码开始,从那里继续执行。这意味着工作流将从上次终止的 Node 节点开始继续执行或重放所有步骤,直到达到流程的终止点。
因此,在为持久化执行编写工作流时,您必须将任何非确定性操作(例如,随机数生成)和任何具有副作用的操作(例如,文件写入、API 调用)包装在独立的节点中。
为了确保您的工作流是确定性的并且可以一致地重放,请遵循以下准则:
- 避免重复工作:如果节点包含多个具有副作用的操作(例如,日志记录、文件写入或网络调用),请将每个操作包装在单独的节点中。这确保在恢复工作流时,操作不会重复,而是从持久化层检索它们的结果。
- 封装非确定性操作:将可能产生非确定性结果的任何代码(例如,随机数生成)包装在节点中。这确保在恢复时,工作流遵循记录的精确步骤序列和相同的结果。
- 使用幂等操作:尽可能确保副作用(例如,API 调用、文件写入)是幂等的。这意味着如果在工作流失败后重试操作,它将具有与第一次执行相同的效果。这对于导致数据写入的操作特别重要。如果某个 Node 节点已经启动但未能成功完成,工作流的恢复将重新运行该节点,依靠记录的结果来保持一致性。使用幂等性键或验证现有结果以避免意外重复,确保平稳和可预测的工作流执行。
持久化模式
Spring AI Alibaba Graph 支持不同的持久化策略,允许您根据应用程序的要求平衡性能和数据一致性。