奋战一年,LangChain首个稳定版本终于发布,LangGraph把智能体构建为图

2024-01-11 18:55 318 阅读 ID:1798
机器学习算法与自然语言处理
机器学习算法与自然语言处理

不知不觉,LangChain 已经问世一年了。作为一个开源框架,LangChain 提供了构建基于大模型的 AI 应用所需的模块和工具,大大降低了 AI 应用开发的门槛,使得任何人都可以基于 GPT-4 等大模型构建自己的创意应用。

在过去的一年中,LangChain 自身也一直在进化。刚刚,LangChain 官方宣布,他们的首个稳定版本 ——LangChain v0.1.0 问世了。

新版本有以下几个重要特点:   

  • 可观察性:构建复杂的 LLM 应用是困难的。为了更好地进行调试,你需要知道采取的确切步骤以及每个步骤的输入 / 输出。通过与 LangSmith 的紧密集成,LangChain 在可观察性方面做到了业界领先;
  • 集成:拥有近 700 个集成,无论你想使用什么技术栈,LangChain 都能支持;
  • 可组合性:使用 LangChain 表达式语言,轻松创建任意 chain,为你带来数据编排框架的所有好处;
  • 流式处理:官方团队投入了大量精力,以确保所有使用 LangChain 表达式语言创建的 chain 都能以一流的方式支持流 —— 包括中间步骤的流;
  • 输出解析:使 LLM 以特定格式返回信息对于使其能够采取行动至关重要;
  • 检索:添加先进但适用于生产环境的检索方法,包括文本分割、retrieval 和索引管道;
  • 工具使用 + 智能体:智能体集合(决定采取哪些行动),工具集合,定义工具的简单方法。

此外,这次更新还有一个「One More Thing」:能够将语言智能体构建为图的 LangGraph。它带来的主要新功能是允许用户创建更多的自定义循环行为。这对于智能体来说非常重要,智能体通常被描述为在 for 循环中运行 LLM。LangChain 官方还发布了一系列视频来介绍新功能。

视频地址:https://www.youtube.com/playlist?list=PLfaIDFEXuae0gBSJ9T0w7cu7iJZbH3T31

以下是这次更新的详细内容。

第三方集成

LangChain 最受欢迎的特点之一是它极大地简化了在任何技术栈上开始构建的过程。LangChain 拥有近 700 个集成,涵盖从 LLM 到向量存储,再到智能体工具的广泛领域。

LangChain 通常被用作「粘合剂」,将构建 LLM 应用所需的所有不同部分连接在一起,因此,优先考虑构建一个稳健的集成生态系统对他们来说非常重要。大约一个月前,LangChain 开始进行一些改变,他们认为这将提升集成的稳健性、稳定性、可扩展性以及一般开发者的体验。他们将所有第三方集成分离到 langchain-community 中 —— 这使得他们能够集中处理特定于集成的工作。他们还开始将单独的集成分离到它们自己的包中。到目前为止,他们已经对大约 10 个包进行了这样的处理,包括 OpenAI、Google 和 Mistral。

其中一个好处是更好的依赖管理 —— 以前,所有依赖都是可选的,这在尝试安装特定版本时会导致一些困扰。现在,如果集成位于它们自己的包中,LangChain 可以更严格地对它们的需求进行版本控制,从而简化安装过程。

另一个好处是版本控制。通常情况下,第三方集成会有变化,需要进行重大更改。现在,这些更改可以在独立的集成包中以适当的版本控制反映在单个集成的基础上。

可观察性

构建 LLM 应用涉及到在系统核心放置一个非确定性组件。这些模型往往会产生意想不到的结果,因此,能够清晰地了解系统内部确切发生的情况极为重要。

官方团队希望使 langchain 尽可能具有可观察性和可调试性,无论是通过架构决策还是他们构建的辅助工具。

他们通过几种方式着手解决这一问题。

他们的主要方式是构建了 LangSmith。LangSmith 提供的主要价值之一是为你的 LLM 应用提供一流的调试体验。它准确地记录下每个步骤发生的情况、每个步骤的输入、输出、所需时间以及更多数据。它以用户友好的方式展示这些信息,让你能够识别哪些步骤耗时最长、进入一个沙盒环境来调试意外的 LLM 响应、跟踪 token 使用情况等。

即使在私人测试版中,对 LangSmith 的需求也是压倒性的,LangChain 正在投入大量资源提高其可扩展性,以便在未来几个月发布公开测试版,然后普及应用。他们也已经支持企业版本,该版本为具有严格数据隐私策略的企业提供 VPC 内部署。

LangChain 还通过其他方式解决了可观察性问题。他们长期以来一直内置了 verbose 和 debug 模式,用于整个管道中不同级别的日志记录。他们最近引入了可视化你创建的 chain 的方法,以及获取所有使用的提示的方法。

可组合性

LangChain 表示,虽然预构建的 chain 有助于上手,但他们经常看到有些团队希望跳出这些架构,并定制他们自己的 chain。不仅是定制提示,还包括定制编排的不同部分。

这也为 LLM 工作负载带来了一些独特的好处 —— 主要是针对 LLM 的可观察性以及流式处理(sreaming)。

在过去的几个月里,官方团队大力投入了 LangChain 表达式语言(LCEL)的开发。LCEL 允许组合任意序列,提供了类似于数据工程管道中数据编排工具的许多优势,包括 batching、并行化和 fallback 等功能。

用于 LCEL 的组件位于 langchain-core 中。官方已经开始为 LangChain 中特定的 chain 创建更高级别的入口点。这些将逐渐取代原有(现在称为「Legacy」)的 chain,因为使用 LCEL 构建的 chain 将自带流式处理、易定制性、可观察性、batching、retries 等功能。LangChain 的目标是使这一转变无缝进行。以前你可能会这样做:

ConversationalRetrievalChain.from_llm(llm, …)

现在做法更简单了:

create_conversational_retrieval_chain(llm, …

在幕后,它将创建一个特定的 LCEL chain 并返回它。如果你想修改逻辑 —— 没问题,因为它全部用 LCEL 编写,所以在不需要对任何东西进行子类化或覆盖任何方法的情况下,修改其中的一部分是很容易的。

LangChain 中有很多 chain,其中许多都被广泛使用。官方表示他们不会废弃遗留版本的 chain,直到存在一个可以用来替代的构造函数,并且该函数已被使用并经过良好测试。

流式处理

LLM 有时可能需要一段时间才能响应。向终端用户展示工作正在进行,而不是让他们盯着空白屏幕,这一点很重要。这可以通过从 LLM 流式传输 token 或流式传输中间步骤的形式实现(如果 chain 或智能体运行时间较长的话)。

LangChain 对这两个方面都进行了深入的开发和优化工作。所有用 LCEL 构建的 chain 都提供了标准的 stream 和 astream 方法,官方也做了大量工作以确保流式处理不仅仅局限于 LLM 调用(例如,在输出解析器中)。所有 chain 还提供了一个标准的 astream_log 方法,它能够流式传输 LCEL chain 中的所有步骤。然后可以对这些步骤进行筛选,以轻松获取中间步骤所采取的操作和其他信息。

在大多数 LLM 应用中,流式处理(包括 token 和中间步骤)是一个关键的用户体验组成部分。而使用 LangChain,你可以免费获得这一功能。

输出解析

LangChain 的一个主要用例是「工具使用」—— 使用 LLM 来调用其他工具。

确保 LLM 以一种结构化的格式返回信息,使得信息可以在下游应用中使用,对于让 LLM 采取行动至关重要。

官方在围绕这一点的开发者体验上投入了大量资源,特别是在输出解析器的概念上。实现这一点的一个主要方法是使用 OpenAI 函数调用。他们不仅简化了指定输出格式(使用 Pydantic、JSON schema 甚至是一个函数),而且简化了处理响应。当你想要使用不支持 OpenAI 函数调用的模型并转而使用提示时,LangChain 还支持几种不同的编码方法(JSON、XML、Yaml)。当你使用提示时,还需要适当的指令来告诉 LLM 如何响应 —— 所有输出解析器都配备了 get_format_instructions 方法来获取这些指令。

他们还围绕输出解析器设计了更高级的功能,例如允许它们在生成时流式传输部分结果,以改善用户体验。这包括从结构化格式(如 JSON、XML 和 CSV)中流式传输部分结果。在输出解析方面,这有时可能是棘手的 —— 为了解析一个 JSON 块,大多数 JSON 解析器需要一个完整的 JSON 块。LangChain 的许多输出解析器包含了内置逻辑来进行这种部分解析。

检索

LangChain 开发者主要构建的一种应用类型是那些能够与他们自己的私有数据进行交互的应用程序。

能够轻松地将你的数据与 LLM 结合起来是 LangChain 的一个非常重要的部分。

这通常涉及两个不同的组件 —— 摄取(准备数据)和检索(检索数据),LangChain 已经构建了这两个组件。

在数据摄取方面,摄取的一个重要部分是将你正在处理的文本分割成块。虽然这看起来可能微不足道,但最佳的分割方式通常是微妙的,并且通常特定于你正在处理的文档类型。LangChain 有 15 种不同的文本分割器,一些针对特定文档类型(如 HTML 和 Markdown)进行了优化,以便开发者最大限度地控制这一过程。然而,相关数据通常是在变化的,LangChain 的摄取系统是为生产、规模化应用而设计的。他们提供了一个索引 API,允许你重新摄取内容,同时忽略那些没有改变的部分,这可以为大容量工作负载节省时间和成本。

在检索方面,他们设计了更先进的方法,同时也使检索更适合生产环境。他们实现了来自学术界的高级检索策略(如 FLARE 和 Hyde),创造了他们自己的策略(如 Parent Document 和 Self-Query),并改编了一些来自其他行业解决方案的策略(如 Multi-Query)。他们还特别支持了生产环境中的需求,例如针对每个用户的检索,这对于将多个用户的文档存储在一起的任何应用程序来说都是至关重要的。

值得注意的是,虽然 LangChain 提供了构建高级检索系统的所有必要组件,但他们对具体实现方式并不固执己见,这也促使许多其他库在 LangChain 的基础上进行构建,以提供更有特色的检索方法,例如 EmbedChain 和 GPTResearcher。

智能体

LangChain 最早出名的东西之一是智能体工作负载。这可能包括两个方面:

1. 工具使用:让 LLM 调用函数或工具;

2. 推理:如何以最佳方式让 LLM 多次调用工具,以及以什么顺序调用(或者根本不调用工具)。

在工具使用方面,LangChain 大致介绍了他们认为至关重要的组件:

1. 与大量第三方工具的集成;

2. 构建 LLM 响应以适配这些工具输入模式的方法;

3. 提供了一种灵活的方法,允许用户自定义调用这些工具的方式(LCEL)。

在推理方面,LangChain 有几种不同的「智能体」方法,这些方法主要可以被看作是 LLM 在循环中运行,每次迭代决定它需要调用哪个工具,然后观察该工具的结果。LangChain 从一开始就集成了 ReAct(一种早期的用于此目的的提示策略),并且很快添加了许多其他类型,包括那些使用 OpenAI 函数调用的、使用他们的新工具调用 API 的、为对话优化的类型等等。

通过灵活和可扩展的工具支持和先进的推理能力,LangChain 已经成为使 LLM 采取行动的默认方式。

与检索类似,虽然 LangChain 提供了构建智能体的基础模块,但也可以看到基于 LangChain 构建的几个更有特色的框架。其中一个很好的例子是 CrewAI,它在 LangChain 之上构建,为多智能体工作负载提供了一个更简单的界面。

LangChain 0.2

虽然 LangChain 0.1 版本刚刚才发布,但其实官方团队已经在考虑 0.2 版本了。一些重要的改进包括:   

  • 用 LCEL 重写遗留 chain(提供更好的流式处理和调试支持);
  • 添加新类型的 chain;
  • 添加新类型的智能体;
  • 改进生产场景的摄取能力;
  • 移除旧的和未使用的功能。

One More Thing

LangChain 受欢迎的主要原因之一是它对智能体的支持。大多数智能体主要定义为以某种循环方式运行 LLM。到目前为止,他们实现这一点的唯一方式是使用 AgentExecutor。他们为 AgentExecutor 添加了很多参数和功能,但它仍然只是运行循环的一种方式。

在新版本中,LangChain 官宣了 langgraph,这是一个可以将语言智能体创建为图的新库。

这将允许用户创建更加定制化的循环行为。你可以定义明确的计划步骤、明确的反思步骤,或者轻松地硬编码,以便始终首先调用特定的工具。值得注意的是,这不是一个 DAG 框架。如果你想构建一个 DAG,你应该直接使用 LangChain 表达式语言。它的灵感来自于 Pregel 和 Apache Beam。目前公开的接口受到 NetworkX 的启发,看起来像这样:

from langgraph.graph import END, Graph

workflow = Graph()

workflow.add_node("agent", agent)
workflow.add_node("tools", execute_tools)

workflow.set_entry_point("agent")

workflow.add_conditional_edges(
    "agent",
    should_continue,
    {
        "continue": "tools",
        "exit": END
    }
)

workflow.add_edge('tools', 'agent')

chain = workflow.compile()

LangChain 表示,他们过去六个月一直在研发这个功能,并且与用户进行了 Beta 测试。它目前支持 OpenGPTs。

参考链接:

https://blog.langchain.dev/langchain-v0-1-0/

免责声明:作者保留权利,不代表本站立场。如想了解更多和作者有关的信息可以查看页面右侧作者信息卡片。
反馈
to-top--btn