Skip to main content
Functional API 让你可以用最少的代码改动将 LangGraph 的核心功能(持久化记忆人机协作流式输出)添加到你的现有应用中。
有关 Functional API 的概念信息,请参阅 Functional API

创建简单工作流

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

并行执行

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

调用图

Functional APIGraph API 可以在同一应用中一起使用,因为它们共享相同的底层运行时。

调用其他入口点

你可以从入口点任务内部调用其他入口点

流式输出

Functional API 使用与 Graph API 相同的流式输出机制。请阅读流式输出指南了解更多详情。 使用流式 API 同时流式输出更新和自定义数据的示例。
  1. langgraph.config 导入 get_stream_writer
  2. 在入口点内获取流写入器实例。
  3. 在计算开始前发出自定义数据。
  4. 在计算结果后发出另一条自定义消息。
  5. 使用 .stream() 处理流式输出。
  6. 指定使用哪些流模式。
Python < 3.11 的异步 如果使用 Python < 3.11 并编写异步代码,使用 get_stream_writer 将不起作用。请直接使用 StreamWriter 类。详见 Python < 3.11 的异步

重试策略

设置任务和入口点超时

使用 @task@entrypointtimeout 参数来限制单个异步尝试可以运行的时间。以秒为单位或 datetime.timedelta 提供超时。
超时仅支持异步任务和入口点。如果你在同步函数上设置 timeout,LangGraph 会在声明任务或入口点时抛出错误。 当任务或入口点超过超时时间时,LangGraph 会抛出 NodeTimeoutError(继承自 Python 内置的 TimeoutError)。如果重试策略配置为重试 TimeoutErrorNodeTimeoutError,超时的尝试会被重试。超时独立应用于每次尝试,因此计时器会在每次重试时重置。

缓存任务

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

错误后恢复

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

人机协作

Functional API 支持使用 interrupt 函数和 Command 原语的人机协作工作流。

基本人机协作工作流

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

审核工具调用

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

短期记忆

短期记忆允许在同一线程 ID 的不同调用之间存储信息。详见短期记忆

管理检查点

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

查看线程状态

查看线程历史

解耦返回值和保存值

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

聊天机器人示例

使用 Functional API 和 InMemorySaver 检查点器的简单聊天机器人示例。 该机器人能够记住之前的对话并从中断处继续。

长期记忆

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

工作流

与其他库集成