为什么选择 LangGraph?¶
大型语言模型 (LLM) 非常强大,特别是当它们与其他系统(如检索器或 API)连接时。这就是为什么许多 LLM 应用在调用 LLM 之前和/或之后会使用一系列的控制流步骤。例如,RAG 会检索与问题相关的文档,并将这些文档传递给 LLM 以使回答有依据。通常,在 LLM 调用之前和/或之后的控制流步骤被称为“链”(chain)。链是使用 LLM 进行编程的一种流行范式,并提供高度可靠性;每次调用链时都会运行相同的步骤集。
然而,我们常常希望 LLM 系统能够选择自己的控制流!这就是智能体的一个定义:智能体是一个使用 LLM 来决定应用程序控制流的系统。与链不同,智能体赋予 LLM 对应用程序中步骤序列的某种程度的控制权。使用 LLM 决定应用程序控制的例子:
- 使用 LLM 在两个潜在路径之间进行路由
- 使用 LLM 决定调用众多工具中的哪一个
- 使用 LLM 决定生成的答案是否足够,或者是否需要更多工作
有许多不同类型的智能体架构可以考虑,这些架构赋予 LLM 不同级别的控制权。一个极端是路由器,它允许 LLM 从一组指定的选项中选择单个步骤;另一个极端是完全自主的长期运行智能体,它可以完全自由地为一个特定问题选择任何想要的步骤序列。
许多智能体架构都利用了以下几个概念:
- 工具调用:这通常是 LLM 做出决策的方式
- 执行动作:通常,LLM 的输出被用作某个动作的输入
- 记忆:可靠的系统需要知道已经发生的事情
- 规划:规划步骤(无论是显式的还是隐式的)对于确保 LLM 在做决策时以最高准确度进行非常有帮助。
挑战¶
在实践中,控制性和可靠性之间往往存在权衡。当我们赋予 LLM 更多控制权时,应用程序通常会变得不那么可靠。这可能是由于 LLM 的非确定性以及/或者智能体选择和使用的工具(或步骤)出现错误等因素造成的。
核心原则¶
LangGraph 的目标是帮助“弯曲”这条曲线,在赋予智能体更多应用程序控制权的同时保持更高的可靠性。我们将概述 LangGraph 的几个关键支柱,这些支柱使其非常适合构建可靠的智能体。
可控性
LangGraph 通过将应用程序流程表达为一组节点和边,为开发者提供了高度的可控性。所有节点都可以访问和修改一个共享状态(记忆)。应用程序的控制流可以使用连接节点的边来设置,这些边可以是确定性的,也可以是通过条件逻辑实现的。
持久化
LangGraph 为开发者提供了多种选项,用于使用短期或长期(例如,通过数据库)记忆来持久化图状态。
人类在环
持久化层支持多种不同的人类在环与智能体的交互模式;例如,可以暂停智能体,查看其状态,编辑其状态,并批准后续步骤。
流式处理
LangGraph 提供一流的流式处理支持,可以在智能体执行过程中向用户(或开发者)暴露状态。LangGraph 支持事件流(例如工具调用的发生)以及 LLM 可能发出的 token 流。
调试¶
构建图后,您通常希望对其进行测试和调试。LangGraph Studio 是一个专门用于可视化和调试 LangGraph 应用程序的集成开发环境 (IDE)。
部署¶
当您对 LangGraph 应用程序有信心后,许多开发者希望有一个简单的部署路径。LangGraph Cloud 是 LangChain 团队提供的一种有特定倾向性且简单的部署 LangGraph 对象的方式。当然,您也可以使用诸如 Express.js 之类的服务,并根据需要从 Express.js 服务器内部调用您的图。