跳到正文
北京时间
原文
LangChain:Blog·· 18 天前精选AI 评分63

LangChain 讲解如何用 Jev 和 LangGraph 构建生产级智能体

Building Production Agents with Jev and LangGraph

AI 导读

LangChain 发布教程,讲解如何结合 TypeSafe 新发布的决策模型 Jev 与 LangGraph 构建“prod, not god”的生产系统。

推荐理由

文章用文档审查和浏览器自动化案例演示了决策模型加 LangGraph 的组合方式,读者可以借鉴把确定性代码与模型判断拆开编排的思路。

正文 · AI 翻译

上周,TypeSafe AI 发布了 Jev,一种新型模型。与传统 LLM 不同,Jev 不生成文本。它做出的决策可直接由你的代码执行,这正是 TypeSafe 所称的 AI 驱动的软件,即“代码掌控工作流,AI 处理狭窄、结构化的决策”。TypeSafe 将其理念概括为构建“prod,而非 god”。

随着前沿 LLM 能力越来越强,我们开始把它们当作神来对待,任何输入模糊的任务都求助于它们:文本生成、文档提取、搜索、排序、研究、分类等等。遗憾的是,神既昂贵又缓慢。每一次调用你都要为这种通用性付出代价,哪怕你需要的只是一个“是”或“否”。

这就是 Jev 的发布引起如此多关注的原因。在狭窄的决策任务上,比如许多智能体所围绕构建的路由和分类步骤,TypeSafe 的基准测试显示 Jev 的运行速度比领先的 LLM 快达 200 倍,成本低 400 倍。

TypeSafe 的方法让我们 LangChain 感到几乎有些怀旧。我们的使命是让智能体变得有用且无处不在,我们的开源生态也随着模型格局的演变而演进,但每一步我们都回到同样两个问题:我们如何让模型做出有用的决策,以及我们如何可靠地执行这些决策?

LangGraph 是我们对这两个问题的回答。我们基于帮助数千家公司将 AI 投入生产所积累的经验构建了它,它让你在可靠且可观测的系统中,将模型驱动的决策与确定性代码结合起来。Jev 为这些系统提供了一种更快、更便宜的决策方式。在本文中,我们将介绍如何用 Jev 和 LangGraph 构建“prod,而非 god”。

用 Jev 做决策

Jev 从前沿 LLM 的能力包中取出了一项能力——判断力,并将其变成一种便宜到无需计量的原语。这就是 TypeSafe 所称的 系统一 模型,或者更常见的叫法:决策模型。你给它状态和一组问题,它返回带概率的类型化答案。

TypeSafe 的 文档 列出了三种构建软件的方式。传统软件由显式逻辑构成,每个分支都手写且可审计,但因此也很僵化。智能体则走向另一个极端:一个模型在每一步都兼顾决策,控制流从代码转移到提示词中。AI 驱动的软件走中间路线。代码保留结构并处理精确计算,模型只出现在需要语义判断的分支上。

以下几个特性帮助 Jev 成为生产 系统 的一个组件:

  • 结构化:答案以带概率的类型化答案返回,因此代码可以根据结果可预测地分支
  • 并行:你可以同时针对同一状态提出许多问题
  • 快速:决策足够便宜,可以在单次运行中做出许多决策
  • 自洽:系统一被设计为在重复评估中返回稳定的答案。
💡 Jev 的一致性是对 LLM 非确定性的一种可喜改变。向 LLM 提出同一个问题,多次运行可能得到不同的答案。Jev 被设计为对相同输入 返回相同的答案。在一项早期的 Jev 作为评判者的实验 中,其分数在 100 次重复运行中几乎不变,远小于我们测试过的任何 LLM 评判者。

例如,这个视频帮助你直观地了解 Jev 与 LLM 的工作方式有何不同。这里的任务是判断输入是否包含各种类型的 PII:

真实应用会做出大量决策,每个决策都 intricately 依赖于之前的选择。一旦决策变得如此廉价,挑战就变成了如何编排它们,而这正是 LangGraph 的用武之地。

用 LangGraph 进行编排

多年来我们一直帮助团队围绕 LLM 构建系统,几乎每个团队都会遇到同样的两个问题:

  1. 管理上下文很难。 要让模型做出正确的决策,它的上下文窗口需要“恰好是下一步所需的信息”。这些信息是模糊的,并且会随着应用的运行而变化。
  2. 模型驱动的系统仍然需要可靠。 它们必须能够承受故障、支持人工干预,并让每一步都可观测。

现有框架解决了部分问题,但没有任何一个能在不限制人们构建方式的前提下同时解决这两个问题。所以我们构建了 LangGraph。它现在每月下载量超过 6000 万次,并被许多构建 AI 的财富 50 强公司使用。

状态即上下文

一个 LangGraph 应用由三部分组成。节点是工作单元:普通代码、模型调用、工具调用或整个子图。状态是节点读取和更新的信息。边决定下一个运行哪个节点,可以沿固定路径,也可以根据当前状态动态决定。

任何图也可以成为更大图中的一个节点,因此小而经过测试的部件可以组合成更大的系统。TypeSafe 的宣言对智能做出了同样的押注:小而清晰的基元才能让复杂系统保持可信。

随着图的运行,每一步的结果都会累积到状态中。该状态成为后续每一步的上下文,同时也决定接下来运行哪些节点。

与其将领域知识塞进提示词,不如将其编码到图的拓扑结构中:做出哪些决策、以什么顺序、每个决策能看到什么状态。正如 TypeSafe 所说,这就是软件能够根据意图和常识进行分支的方式。判断来自模型,但流程保留在你可以检查和测试的代码中。

可靠的运行时

正如 TypeSafe 宣言所主张的,只有当组件可靠时,你才会让它无人值守地运行;只有当你能够检查、测试和约束它时,才会在其上构建。LangGraph 在运行时中处理了这一点:

  • 持久化执行:模型驱动的步骤是非确定性的,因此相同的输入可能导致模型做出不同的调用,并使运行走向不同的路径。失败后从头重新开始比慢更糟糕,因为重新运行可能不会重走同一条路径。检查点会在每一步持久化状态,因此失败的运行会带着已经做出的决策继续执行
  • 人在回路中:当某个步骤在系统行动前需要审查时,中断可以让你暂停、批准,并从上次中断的地方继续
  • 可观测性:模型驱动的步骤每次不会做同样的事情,因此你需要在 LangSmith 中查看追踪,以了解做出了什么决策以及为什么

这些都不是 LLM 特有的。Jev 仍然接收非结构化文本上下文并返回判断,因此它需要同样的保证,而图会自动为每个节点提供这些保证。

示例:用于证据开示的文档审查

在诉讼中,公司必须在将文件提交(移交)给另一方之前审查每一页,而单个案件可能涉及数十万页。大部分审查都是同样的有限判断反复进行,这使其天然适合 Jev。

对于每一页,Jev 在一次请求中回答三个问题,每个答案对应图中的一条路径:

  1. 这一页是否与请求相关?如果不相关,就将其搁置。
  2. 它是否包含个人信息?如果包含,由 LLM 对 PII 进行脱敏。
  3. 它是否可能享有特权?如果是,则转到 attorney_review,这会暂停图以等待人工介入。

剩下的任何内容都可以移交了。以下是该流程的快速演示(实际运行时,页面是并行处理的):

Jev 处理所有分类,只有当某一页需要更多处理时,图才会升级:交给 LLM 进行脱敏,或交给律师进行特权判断。

我们运行了同一个图,分别由Jev 处理分类和由Sonnet 作为判断者,在多次试验中,Jev 在分类步骤上快了 5–6 倍。两次运行都在 LangSmith 中进行了追踪,因此你可以打开任意页面,查看它走了哪条路径以及背后的概率。LangSmith 还为像 Jev 这样的决策模型提供了专门的视图,展示每个决策的输入和校准后的输出:

这就是智能的大解绑

在过去三年里,大多数智能体都将一切路由到一个前沿 LLM。Jaya Gupta 将接下来发生的事称为“智能的大解绑”:这些能力被拆分开来,每一项都交给能够处理它的最便宜的模型。Jev 将判断能力抽离出来,返回结构化决策而不是生成的文本。一旦这些部分被分开,就必须有东西通过路由每一步并决定何时升级,将它们重新拼接起来。这就是运行时的工作。

浏览器自动化展示了这在实践中是什么样子。浏览器智能体读取页面并决定下一步做什么:点击按钮、填写字段、滚动。这听起来很开放,但在任何给定时刻,页面只提供有限的一组交互元素,因此下一步操作实际上是从列表中选择。

Browserbase 围绕这一理念重建了 Stagehand 的 act()。Stagehand 标记页面上的交互元素,Jev 选择操作类型和最佳候选元素,任何低于 0.7 置信度阈值的内容都会回退到 LLM。在早期测试中,act() 延迟中位数从 1.97 秒降至 0.46 秒,快了约 4.3 倍。

在大多数用例中,Jev 并不会完全取代 LLM。它处理自己有把握的有限选择,其余一切交给 LLM。这就是 Gupta 所描述的转变:从“默认使用前沿模型,之后再优化”到“默认使用便宜模型,例外时使用前沿模型”。我们预计会看到更多这种模式:在动作空间受限的地方,由决策模型进行快速、廉价的调用,而将 LLM 保留用于开放式推理以及较小模型不确定的情况。

开发者已经在朝这个方向前进。正如本周一位开发者告诉我们的:“我基本上正在把我们现有的每一个智能体都转换成由 Jev 驱动的工作流。”

开始使用

致谢

由 Sydney Runkle 和 Hunter Lovell 撰写。

感谢 Kevin Frank、Harrison Chase、Eugene Yurtsev 和 Nathan Drezner 的审阅和意见。

‍

来源:LangChain:Blog · langchain.com