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

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

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

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

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

用 Jev 做决策

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

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

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

  • 结构化:答案以带概率的类型化答案返回,因此代码可以根据结果可预测地分支
  • 并行:你可以同时针对同一状态提出许多问题
  • 快速:决策足够廉价,可以在单次运行中做出许多决策
  • 自洽:system one 被设计为在重复评估中返回稳定的答案。
💡 Jev 的一致性相较于 LLM 的非确定性是一个令人欣喜的改变。向 LLM 提出同一个问题,多次运行可能会得到不同的答案。Jev 被设计为返回相同的答案对于相同的输入。在一项早期的Jev-as-a-judge 实验中,它的分数在 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的审阅和意见。

‍