Skip to main content
函数式 API 允许你以对现有代码的最小改动,将 LangGraph 的关键功能(持久化记忆人机协作流式处理)添加到你的应用程序中。
关于函数式 API 的概念信息,请参阅 函数式 API

创建一个简单的工作流

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

并行执行

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

调用图

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

调用其他入口点

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

流式处理

函数式 API 使用与 图 API 相同的流式处理机制。请阅读 流式处理指南 部分以获取更多详细信息。 使用流式 API 同时流式传输更新和自定义数据的示例。
  1. 在计算开始前发出自定义数据。
  2. 在计算结果后发出另一条自定义消息。
  3. 使用 .stream() 处理流式输出。
  4. 指定要使用的流式模式。

重试策略

缓存任务

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

错误后恢复

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

人机协作

函数式 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 参数的内容。

聊天机器人示例

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

长期记忆

长期记忆 允许在不同 线程 ID 之间存储信息。这对于在一个对话中学习关于给定用户的信息并在另一个对话中使用它可能很有用。

工作流

  • 工作流与代理 指南,包含更多关于如何使用函数式 API 构建工作流的示例。

与其他库集成