函数式 API 允许您以最少的代码改动,将 LangGraph 的关键特性(持久化、记忆、人在环中 和 流式传输)添加到您的应用程序中。
有关函数式 API 的概念性信息,请参阅 函数式 API。

创建一个简单的工作流

定义 entrypoint 时,输入仅限于函数的第一个参数。要传递多个输入,可以使用字典。
此示例展示了如何在语法上使用 @task 和 @entrypoint 装饰器。 假设提供了检查点器,工作流结果将被持久化到检查点器中。

并行执行

任务可以通过并发调用并等待结果来并行执行。这对于提高 I/O 密集型任务(例如调用 LLM API)的性能非常有用。
此示例展示了如何使用 @task 并行运行多个 LLM 调用。每个调用生成关于不同主题的段落,并将结果合并为单个文本输出。
此示例使用 LangGraph 的并发模型来提高执行时间,特别是当任务涉及像 LLM 补全这样的 I/O 时。

调用图

函数式 API 和 图 API 可以在同一个应用程序中一起使用,因为它们共享相同的底层运行时。

调用其他入口点

您可以在一个 entrypoint 或 task 内部调用其他 entrypoint。

流式传输

函数式 API 使用与 图 API 相同的流式传输机制。更多详情请阅读 流式传输指南 部分。 使用流式 API 从工作流运行中流式传输数据块的示例。
  1. 在计算开始之前发出自定义数据。
  2. 在计算结果之后发出另一个自定义消息。
  3. 使用 streamEvents() 处理流式输出。
  4. 迭代 stream.values 以接收值快照。

重试策略

缓存任务

  1. ttl 以秒为单位指定。缓存将在此时间后失效。

出错后恢复

当我们恢复执行时,我们不需要重新运行 slowTask,因为其结果已保存在检查点中。

人在环中

函数式 API 使用 interrupt 函数和 Command 原语支持人在环中工作流。

基本人在环中工作流

我们将创建三个任务:
  1. 附加 "bar"。
  2. 暂停以等待人工输入。恢复时,附加人工输入。
  3. 附加 "qux"。
我们现在可以在一个入口点中组合这些任务:
在任务内部调用 interrupt(),使人类能够审查和编辑前一个任务的输出。先前任务的结果——在本例中是 step_1——被持久化,因此在 interrupt 之后不会再次运行。 让我们发送一个查询字符串:
请注意,我们在 step_1 之后使用 interrupt 暂停了。中断提供了恢复运行的说明。要恢复,我们发出一个 Command,其中包含 human_feedback 任务预期的数据。
恢复后,运行将完成剩余的步骤并按预期终止。

审查工具调用

为了在执行前审查工具调用,我们添加了一个 review_tool_call 函数,该函数调用 interrupt。当调用此函数时,执行将暂停,直到我们发出恢复它的命令。 给定一个工具调用,我们的函数将 interrupt 以供人工审查。此时我们可以:
  • 接受工具调用
  • 修改工具调用并继续
  • 生成自定义工具消息(例如,指示模型重新格式化其工具调用)
我们现在可以更新我们的入口点来审查生成的工具调用。如果工具调用被接受或修改,我们像以前一样执行。否则,我们只需附加人类提供的 ToolMessage。先前任务的结果——在本例中是初始模型调用——被持久化,因此在 interrupt 之后不会再次运行。

短期记忆

短期记忆允许在同一个线程 ID 的不同调用之间存储信息。更多详情请参阅短期记忆。

管理检查点

您可以查看和删除检查点器存储的信息。

查看线程状态

查看线程历史记录

解耦返回值与保存值

使用 entrypoint.final 将返回给调用方的内容与持久化在检查点中的内容解耦。这在以下情况下很有用:
  • 您想要返回一个计算结果(例如,摘要或状态),但保存一个不同的内部值以供下次调用时使用。
  • 您需要控制下次运行时传递给 previous 参数的内容。

聊天机器人示例

一个使用函数式 API 和 InMemorySaver 检查点器的简单聊天机器人示例。 机器人能够记住之前的对话并从中断的地方继续。

长期记忆

长期记忆允许在不同的线程 ID 之间存储信息。这对于在一次对话中学习关于某个用户的信息,并在另一次对话中使用它非常有用。

工作流

  • 工作流和代理指南提供了更多关于如何使用函数式 API 构建工作流的示例。

与其他库集成