著名的大模型智能体对象,现在有大版本更新了。
不知不觉,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/