“什么是代理?”
我几乎每天都被问到这个问题。在 LangChain,我们构建工具来帮助开发者构建 LLM 应用程序,尤其是那些充当推理引擎并与外部数据和计算源交互的应用程序。这包括通常被称为“代理”的系统。
每个人似乎对代理的定义都有略微不同。我的定义可能比大多数人的更技术化
即使在这里,我承认我的定义并不完美。人们通常将代理视为先进、自主且像人类一样——但一个简单的系统,其中 LLM 在两个不同的路径之间进行路由呢?这符合我的技术定义,但不符合人们对代理应该具备的能力的普遍看法。很难准确地定义什么是代理!
这就是为什么我很喜欢 Andrew Ng 上周的推文。在推文中,他建议“与其争论哪些工作应该包含或排除在真正的代理之外,不如承认系统可以具有不同程度的代理能力。”就像自动驾驶汽车一样,例如,具有不同的自主程度,我们也可以将代理能力视为一个频谱。我非常同意这种观点,我认为 Andrew 表达得很不错。将来,当我被问到什么是代理时,我会转而讨论“代理”意味着什么。
什么是代理能力?
我去年做了一个关于 LLM 系统的 TED 演讲,并使用了下面的幻灯片来谈论 LLM 应用程序中存在的不同自主级别。
一个系统越“代理”,LLM 就越能决定该系统如何运作。
使用 LLM 将输入路由到特定下游工作流中具有少量“代理”行为。这将属于上面图表中的路由器
类别。
如果你使用多个 LLM 来执行多个路由步骤?这将在路由器
和状态机
之间。
如果其中一个步骤是确定是否继续或完成——有效地允许系统循环运行直到完成?这将属于状态机
。
如果系统正在构建工具,记住这些工具,然后在未来的步骤中使用它们?这类似于Voyager 论文中实现的,并且具有极强的代理能力,属于更高的自主代理
类别。
这些“代理”的定义仍然很技术化。我更喜欢“代理”的更技术化的定义,因为我认为它在设计和描述 LLM 系统时非常有用。
为什么“代理”是一个有用的概念?
与所有概念一样,值得询问为什么我们甚至需要“代理”的概念。它有什么用处?
了解你的系统有多代理化可以指导你在开发过程中的决策——包括构建、运行、交互、评估,甚至监控它。
你的系统越代理化,编排框架就越有帮助。如果你正在设计一个复杂的代理系统,拥有一个具有适当抽象概念的框架可以实现更快的开发。此框架应该为分支逻辑和循环提供一流的支持。
你的系统越代理化,运行起来就越困难。它将变得越来越复杂,某些任务将需要很长时间才能完成。这意味着你将希望将作业作为后台运行。这也意味着你希望持久化执行以处理执行过程中出现的任何错误。
你的系统越代理化,你就越希望在它运行时与它进行交互。你希望能够观察内部发生的事情,因为事先可能无法知道确切的步骤。你希望能够在特定时间修改代理的状态或指令,以便在它偏离预期路径时将其引导回正轨。
你的系统越代理化,你越希望为这些类型的应用程序构建一个评估框架。你希望多次运行评估,因为存在大量随机性。你希望能够测试最终输出,以及中间步骤,以测试代理的行为效率。
你的系统越代理化,你越希望使用一种新的监控框架。你希望能够深入了解代理执行的所有步骤。你还要能够根据代理执行的步骤查询运行。
理解和利用系统中的代理能力谱可以提高开发过程的效率和稳健性。
代理是新的
我经常思考的一件事是,在这股热潮中,真正的新是什么。我们是否需要为人们正在构建的 LLM 应用程序构建新的工具和新的基础设施?或者说,来自 LLM 时代之前的通用工具和基础设施就足够了?
对我来说,你的应用程序越代理化,拥有新的工具和基础设施就越重要。这正是我们构建LangGraph的动力,LangGraph 是一种代理编排器,可以帮助构建、运行和与代理交互,以及LangSmith,一个用于 LLM 应用程序测试和可观察性的平台。随着我们在代理能力谱上不断前进,支持工具的整个生态系统都需要重新构想。