虽然代理可以很强大,但它们并非完美。这通常使得在构建代理时保持人工“在环内”非常重要。例如,在我们与 Replit 总裁 Michele Catasta 针对他们的 Replit 代理进行的炉边谈话中,他多次提到人工参与环路组件对于他们的代理设计至关重要。
从一开始,我们在设计 LangGraph 时就考虑到了这一点,这也是许多 公司 选择 在 LangGraph 上构建的关键原因之一。今天,我们很高兴宣布一种新的方法,可以更轻松地在您的 LangGraph 代理中包含人工参与环路步骤:interrupt
我们如何为人工参与环路工作流构建 LangGraph
LangGraph 的一个与众不同的方面是,我们是为人工参与环路工作流构建它的。我们认为这些工作流在构建代理时非常重要,因此我们在 LangGraph 中内置了对它们的一流支持。
我们通过使持久化成为 LangGraph 中的一等公民来实现这一点。图的每一步都从该图状态的检查点读取,然后写入。该图状态存储了代理执行其工作所需的一切。
这使得可以暂停图的执行过程,然后在一段时间后恢复 - 因为检查点在那里,我们可以直接从那里继续。
这也使得可以暂停,让人工编辑检查点,然后从新的更新后的检查点恢复。
在某种程度上,您可以将此持久化层视为人/代理协作的草稿本。
interrupt
:一种全新的人工参与环路开发者体验
我们之前有一些构建人工参与环路交互的方法(断点,NodeInterrupt)。在过去的几个月中,我们看到开发者想要做越来越复杂的事情,因此我们添加了一个新工具来帮助解决这个问题。
在将人工参与环路构建到 Python 程序中时,一种常见的方法是使用 input
函数。使用此函数,您的程序会暂停,终端中会弹出一个文本框,您输入的任何内容都将用作该函数的响应。您可以像下面这样使用它
response = input("Your question here")
这是一种相当简单直观的添加人工参与环路功能的方法。这种方法的缺点是它是同步的,会阻塞进程,并且在命令行(或笔记本)之外无法真正工作。因此,这根本无法在生产环境中工作。
我们尝试通过向 LangGraph 添加一个新函数来模拟这种开发者体验:interrupt
。您可以像使用 input
一样使用它
response = interrupt("Your question here")
这旨在在生产环境中工作。当您这样做时,它将暂停图的执行,将您正在运行的线程标记为 interrupted
,并将您作为输入传递给 interrupt
的任何内容放入持久化层。这样,您可以检查线程状态,查看它是否已中断,检查消息,然后根据该消息再次调用图(以特殊方式)以将您的响应传递回去
graph.invoke(Command(resume="Your response here"), thread)
请注意,它的功能与 input
不完全相同(它会重新运行在该节点中调用此函数之前完成的任何工作,但不会重新运行之前的节点)。这确保了中断的线程不会占用任何资源(存储空间除外),并且可以在几个月后在不同的机器上等恢复。
有关更多信息,请参阅 Python 和 Javascript 文档。
常见的人工参与环路工作流
我们看到正在实施几种不同的人工参与环路工作流。
在关键步骤(例如 API 调用)之前暂停图,以审查和批准该操作。如果该操作被拒绝,您可以阻止图执行该步骤,并可能采取替代操作。

人工可以审查和编辑图的状态。这对于纠正错误或使用其他信息更新状态非常有用。

人工可以在继续之前审查和编辑来自 LLM 的输出。这在 LLM 请求的工具调用可能很敏感或需要人工监督的应用程序中尤其重要。

一个 多轮对话 涉及代理和人类之间的多次来回交互,这可以使代理以对话方式从人类那里收集更多信息。
这种设计模式在由 多个代理 组成的 LLM 应用程序中很有用。一个或多个代理可能需要与人类进行多轮对话,其中人类在对话的不同阶段提供输入或反馈。为了简单起见,下面的代理实现被说明为一个单节点,但实际上它可能是由多个节点组成的更大图的一部分,并且包括条件边。

结论
我们正在构建 LangGraph,使其成为人工参与环路交互模式的最佳代理框架。我们认为 interrupt
使其比以往任何时候都更容易。我们已经更新了所有使用人工参与环路的示例,以使用此新功能。我们希望尽快发布更多端到端项目,以展示其在实际应用中的作用。
观看我们的 YouTube 演示 了解更多信息
我们很高兴看到您构建的内容!