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