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