if 语句、for 循环和函数调用)进行分支和控制流的现有代码中。与许多要求将代码重构为显式管道或 DAG 的数据编排框架不同,函数式 API 允许您在不强制执行固定执行模型的情况下引入这些功能。
函数式 API 使用两个关键构建块:
@entrypoint– 将函数标记为工作流的起点,封装逻辑并管理执行流程,包括处理长时间运行的任务和中断。@task– 代表一个离散的工作单元,例如 API 调用或数据处理步骤,可在入口点内异步执行。任务返回一个类似 future 的对象,可以同步等待或解析。
函数式 API 与图 API
对于偏好声明式方法的用户,LangGraph 的 图 API 允许您使用图范式定义工作流。两个 API 共享相同的底层运行时,因此您可以在同一应用程序中同时使用它们。 以下是主要区别:- 控制流:函数式 API 不需要考虑图结构。您可以使用标准 Python 结构定义工作流。这通常会减少您需要编写的代码量。
- 短期记忆:GraphAPI 要求声明一个 State,并可能需要定义 reducers 来管理图状态的更新。
@entrypoint和@tasks不需要显式状态管理,因为它们的状态作用域限定在函数内,不跨函数共享。 - 检查点:两个 API 都会生成和使用检查点。在 Graph API 中,每个 超级步骤 后都会生成一个新的检查点。在 函数式 API 中,当任务执行时,其结果会保存到与给定入口点关联的现有检查点中,而不是创建新检查点。
- 可视化:图 API 便于将工作流可视化为图,这对调试、理解工作流和与他人共享非常有用。函数式 API 不支持可视化,因为图是在运行时动态生成的。
示例
下面演示一个编写文章并中断以请求人工审核的简单应用程序。详细说明
详细说明
此工作流将撰写一篇关于“猫”主题的文章,然后暂停以获取人工审核。工作流可以无限期中断,直到提供审核。当工作流恢复时,它会从头开始执行,但由于 文章已撰写完毕,准备审核。一旦提供审核,我们可以恢复工作流:工作流已完成,审核已添加到文章中。
writeEssay 任务的结果已保存,任务结果将从检查点加载,而不是重新计算。入口点
@entrypoint 装饰器可用于从函数创建工作流。它封装工作流逻辑并管理执行流程,包括处理_长时间运行的任务_和中断。
定义
通过使用@entrypoint 装饰器装饰函数来定义 入口点。
函数必须接受一个位置参数,该参数作为工作流输入。如果需要传递多个数据片段,请使用字典作为第一个参数的输入类型。
使用 entrypoint 装饰函数会产生一个 Pregel 实例,用于帮助管理工作流的执行(例如,处理流式传输、恢复和检查点)。
通常,您需要向 @entrypoint 装饰器传递一个 检查点器 以启用持久化并使用人在回路等功能。
- 同步
- 异步
可注入参数
声明entrypoint 时,您可以请求在运行时自动注入的附加参数。这些参数包括:
| 参数 | 说明 |
|---|---|
| previous | 访问给定线程的上一个 checkpoint 关联的状态。请参阅 短期记忆。 |
| store | [BaseStore][langgraph.store.base.BaseStore] 的实例。用于 长期记忆。 |
| writer | 在使用 Async Python < 3.11 时访问 StreamWriter。请参阅 使用函数式 API 进行流式传输的详细信息。 |
| config | 用于访问运行时配置。请参阅 RunnableConfig 了解信息。 |
请求可注入参数
请求可注入参数
执行
使用@entrypoint 会产生一个 Pregel 对象,可以使用 invoke、ainvoke、stream 和 astream 方法执行。
- 调用
- 异步调用
- 流式传输
- 异步流式传输
恢复
在 interrupt 后恢复执行可以通过向 Command 原语传递 resume 值来完成。- 调用
- 异步调用
- 流式传输
- 异步流式传输
None 和相同的 线程 ID(配置)运行 entrypoint。
这假设底层错误已解决,执行可以成功继续。
- 调用
- 异步调用
- 流式传输
- 异步流式传输
短期记忆
当使用checkpointer 定义 entrypoint 时,它会在同一线程 ID的连续调用之间将信息存储在检查点中。
这允许使用 previous 参数访问上一次调用的状态。
默认情况下,previous 参数是上一次调用的返回值。
entrypoint.final
entrypoint.final 是一个可以从入口点返回的特殊原语,允许解耦保存在检查点中的值与入口点的返回值。
第一个值是入口点的返回值,第二个值是将保存在检查点中的值。类型注解为 entrypoint.final[return_type, save_type]。
entrypoint.final 是