图片
图片
图片
图片

引言

图片
图片
图片

LangChain 是当下最流行的为大语言模型(LLM)提供工具和接口的开源框架,让开发者可以利用语言模型的能力构建复杂大模型应用相关的应用程序。由于LandChain及相关的技术细节更新迭代较快,本文以2024年03月08日的官网文档(python)为基础,讲解LandChain的技术栈相关概念及API。为后续的LandChain实战出真知系列开发提供认识基础。

图片
图片
图片

LangChain

图片
图片
图片

什么是LangChain?

图片

LangChain是一个流行的用于开发由语言模型支持的应用程序的框架。它使应用程序能够:

i.上下文感知【Are context-aware】:将语言模型连接到上下文源(提示说明、一些镜头示例、响应的内容等)

ii.逻辑推理【Reason】:依靠语言模型进行推理(关于如何根据提供的上下文回答、采取什么操作等)

图片
图片
图片

LangChain

图片
图片
图片

LangChain部分组成有哪些?

LangChain 库:Python 和 JavaScript 库。包含无数组件的接口和集成、将这些组件组合成链和代理的基本运行时,以及链和代理的现成实现。

LangChain 模板:一系列易于部署的参考架构,适用于各种任务。

LangServe:用于将 LangChain 链部署为 REST API 的库。

LangSmith:一个开发者平台,提供全流程的观测,可让您调试、测试、评估和监控基于任何 LLM 框架构建的链,并与 LangChain 无缝集成。

图片
  • 这些产品一起简化了整个应用程序的生命周期。

  • 开发:在LangChain/LangChain.js中编写您的应用程序。使用模板作为参考开始运行。

  • 生产:使用LangSmith检查、测试和监控您的链,以便您可以充满信心地不断改进和部署。

  • 部署:使用LangServe将任何链转换为API。

图片
图片
图片

LangChain Libraries

图片
图片
图片
  • LangChain软件包的主要价值:

  • 组件:可组合的工具和集成,用于处理语言模型。组件是模块化且易于使用,无论您是否使用LangChain框架的其余部分。

  • 标准化链条:用于完成更高级任务的内置组件组合 现成的链条使开始变得容易。组件使定制现有链条和构建新链条变得容易。

  • LangChain库本身由几个不同的软件包组成:

  • langchain-core:基本抽象和LangChain表达语言。

  • langchain-community:第三方集成。

  • langchain:构成应用程序认知架构的链条、代理和检索策略。

图片
图片
图片

LangChain表达式语言(LCEL)

图片
图片
图片

LangChain Expression Language

是什么?

LCEL是一种基于声明式的方式来构建链条的方法。它从设计之初就考虑到了将原型快速投入生产的需求,无需修改任何代码,无论是简单的“提示+LLM”模式,还是更为复杂的链条结构,都能够得到有效支持。

LCEL通过提供以下方式,使得从基本组件构建复杂链条变得更加容易:

1. 统一接口:每个LCEL对象都实现了Runnable接口,该接口定义了一组公共的调用方法(invoke、batch、stream、ainvoke等)。这使得LCEL对象的链条也能自动支持这些调用。也就是说,每个LCEL对象的链条本身也是一个LCEL对象。

2. 组合原语:LCEL提供了许多原语,使得组合链条、并行化组件、添加回退、动态配置链条内部等变得更加容易。

图片
图片
图片

LangChain的API

图片
图片
图片

LangChain接口如何定义?

为了尽可能地简化创建自定义链条的过程,我们实现了一个“Runnable”协议。Runnable协议已被大多数组件实现。这是一个标准接口,可以轻松地定义自定义链条并以标准方式调用它们。

标准接口调用方法包括:

stream:将响应的块返回流

invoke:调用输入上的链条

batch:在输入列表上调用链条

这些还有对应的异步方法

astream:异步返回响应块流

ainvoke:异步调用输入上的链条

abatch:异步调用输入列表上的链条

astream_log:流式返回中间步骤,以及最终响应

astream_events:beta版流式传输链条中发生的事件(在langchain-core 0.1.14中引入)

不同组件调用方法下传的的输入参数类型及输出的参数类型表如下(不同接口数据使用Pydantic库进行了转换):

图片
图片
图片
图片

LangChain模块

图片
图片
图片

LangChain主要功能模块有哪些?

一、I/O模块(Model I/O):任何大语言模型应用的核心元素是…模型。LangChain为您提供了与任何语言模型进行接口的构建模块。主要交互如下:

图片

二、检索模块(Retrieval):很多LLM应用需要用到用户特有的数据,这部分数据通常不包含在模型的训练集里。要做到这点,主要的方法就是通过检索增强生成(RAG)。这个过程中,会先找到外部的数据,然后在生成步骤时把这些数据提供给LLM。LangChain提供了从简单到复杂的RAG应用所需的全部工具。主要流程如下:

图片

1.文档加载器(Document loaders):文档加载器从许多不同的来源加载文档。LangChain 提供超过 100 种不同的文档加载器,以及与其他主要提供商(如 AirByte 和 Unstructured)的集成。LangChain 提供集成,可从各种位置(私人 S3 存储桶、公共网站)加载所有类型的文档(HTML、PDF、代码)。

2.文本拆分(Text Splitting):检索的关键部分是仅提取文档的相关部分。这涉及几个转换步骤,以准备文档进行检索。这里的一个主要部分是将大型文档拆分(或分块)为较小的块。LangChain 提供几种用于执行此操作的转换算法,以及针对特定文档类型(代码、标记等)进行优化的逻辑。

3.文本嵌入模型(Text embedding models):检索的另一个关键部分是为文档创建嵌入。嵌入捕获文本的语义含义,使您能够快速高效地找到与文本相似的其他部分。LangChain 与超过 25 种不同的嵌入提供商和方法集成,从开源到专有 API,让您可以选择最适合您需求的方法。LangChain 提供标准接口,使您可以轻松切换模型。

4.向量存储(Vector stores):随着嵌入的兴起,出现了对数据库的需求,以支持这些嵌入的高效存储和搜索。LangChain 与超过 50 种不同的向量存储进行集成,从开源本地存储到云托管专有存储,让您可以选择最适合您需求的方法。LangChain 提供标准接口,使您可以轻松切换向量存储。

5.检索器 (Retrievers):一旦数据存储在数据库中,您仍然需要检索它。LangChain 支持许多不同的检索算法,并且是我们增加最多价值的地方之一。LangChain 支持易于入门的基本方法 – 即简单的语义搜索。但是,我们还添加了一系列算法来提高性能。其中包括:

1)父文档检索器:这允许您为每个父文档创建多个嵌入,使您可以查找较小的块但返回更大的上下文。

2)自查询检索器:用户问题通常包含对不仅仅是语义的内容的引用,而是表达一些最好表示为元数据筛选器的逻辑。自查询允许您从查询中提取出语义部分以及查询中存在的其他元数据筛选器。

3)集成检索器:有时您可能希望从多个不同来源检索文档,或者使用多种不同的算法。集成检索器使您可以轻松实现这一点。以及更多。

6.索引(Indexing):LangChain 索引 API 将您的数据从任何来源同步到向量存储中,帮助您:避免将重复的内容写入向量存储,避免重新编写未更改的内容,避免在未更改的内容上重新计算嵌入 。所有这些都应该为您节省时间和金钱,并改善您的向量搜索结果。

三、代理模块(Agents):代理的主要思想是使用语言模型来决定要执行的一系列动作。在链式操作中,动作序列是提前设定好的(通过编程实现)。而在代理中,我们用语言模型来做决策,它帮助我们决定哪些动作需要执行,以及执行的顺序。【Tips:这部分也是研究领域的热点,例如:多模态Agent。这意味着当下的API实现可能不足以涵盖大模型agent应用的交互

代理模块主要有以下部分:

图片

1.代理交互模式(Schema)类:LangChain通过引入几个关键的抽象概念,简化了与代理(agent)交互的过程。

AgentAction(代理行为):这是一个数据类,用于表示代理应执行的具体操作。其中包含两个重要属性:tool(指代需要调用的工具名称)和 tool_input(即对该工具的具体输入)。

AgentFinish(代理完成):当代理完成其任务,准备将结果返回给用户时,将使用此类表示其最终结果。它主要包含一个return_values 键值对映射,内含代理的最终输出。一般而言,这里会有一个 output 键,其值为代理响应的字符串内容。

中间步骤(Intermediate Steps):这部分记录了在当前代理运行过程中,之前的代理行为及其相应的输出结果。将这些信息传递给未来的迭代步骤非常关键,因为这有助于代理了解自己已完成的工作内容。这些信息被组织为一个列表,列表中的每个元素都是一个元组(Tuple),包含 AgentAction 和任意类型(Any)的观察结果。在这里,观察结果被保留为最灵活的Any类型,但在实际应用中,这通常是一个字符串。

2.代理(Agent)类:代理是一个决策链,负责确定接下来采取哪些步骤。这通常由语言模型、提示语和输出解析器共同驱动。

不同的代理具有不同的推理提示风格、输入编码方式以及输出解析方法。想要查看所有内置代理的完整列表,请参阅代理类型如下。

图片

如果您需要更多自定义的控制,也可以轻松创建自定义代理。

代理输入(Agent Inputs)类:代理的输入是一个键-值映射。只有一个必需的键:intermediate_steps,对应上述的中间步骤。一般来说,PromptTemplate 负责将这些键值对转换成最适合输入到LLM的格式。

代理输出(Agent Outputs)类:输出是下一步要采取的行动或者要发送给用户的最终响应(AgentActions 或 AgentFinish)。具体来说,这可以被定义为 Union[AgentAction, List[AgentAction], AgentFinish]。输出解析器的职责是将原始的LLM输出转换成这三种类型中的一种。

3.代理执行器(AgentExecutor)类:代理执行器是代理的运行时。这实际上是调用代理,执行它选择的动作,将动作输出传递回代理并重复的部分。

运行时的复杂性其中包括:

1)处理代理选择不存在的工具的情况

2)处理工具出错的情况

3)处理代理产生的输出无法解析为工具调用的情况 在所有级别(代理决策,工具调用)

4)记录和监控到标准输出和/或到LangSmith(LangChain的可观测组件)。

4.工具(Tool)类:工具是代理可以调用的功能。工具抽象由两个组件组成:工具的输入模式。这告诉LLM调用工具需要哪些参数。没有这个,它将不知道正确的输入是什么。这些参数应该被合理地命名和描述。要运行的功能。通常只是一个被调用的Python函数。

1)其中有两个关于工具的重要设计考虑:

2)为代理提供正确的工具访问权限

以对代理最有帮助的方式描述工具 如果不仔细考虑这两点,你将无法构建一个有效的代理。如果你不给代理正确的工具访问权限,它将永远无法完成你给定的目标。同时你不能正确的描述工具,代理就不会知道如何正确使用它们。LangChain提供了一套广泛的内置工具,同时也可以轻松定义您自己的工具(包括自定义描述)。

工具包(Toolkits)类:对于许多常见任务,代理将需要一组相关工具。为此,LangChain提供了工具包的概念 – 大约3-5个工具组成的组,用于实现特定目标。例如,GitHub工具包有一个用于搜索GitHub问题的工具,一个用于读取文件的工具,一个用于评论的工具等。

图片
图片
图片

总结

图片
图片
图片

LangChain 是当下最流行的为大语言模型(LLM)提供工具和接口的开源框架,本文从概念,LangChain大模型开发技术栈组件,LangChain主要模块及API,介绍LangChain大模型开发技术栈的相关概念,并简述了相关的设计理念

下一篇,将会对LangChain表达式语言(LCEL)进行实战详细介绍。如果关于LangChain有哪些问题?👏欢迎评论区留言讨论。

END

图片
图片
图片

  点击 在看 你最好看  

作者 52AI

52人工智能社区管理员