1.概述
最近,在研究LangChain时,发现一些比较有意思的点,今天笔者将给大家分享关于LangChain的一些内容。
2.内容
2.1 什么是LangChain?
LangChain是一项旨在赋能开发人员利用语言模型构建端到端应用程序的强大框架。它的设计理念在于简化和加速利用大型语言模型(LLM)和对话模型构建应用程序的过程。这个框架提供了一套全面的工具、组件和接口,旨在简化基于大型语言模型和对话模型的应用程序开发过程。
LangChain本质上可被视为类似于开源GPT的插件。它不仅提供了丰富的大型语言模型工具,还支持在开源模型的基础上快速增强模型的功能。通过LangChain,开发人员可以更轻松地管理与语言模型的交互,无缝地连接多个组件,并集成额外的资源,如API和数据库等,以加强应用的能力和灵活性。
LangChain的优势在于为开发人员提供了一个便捷的框架,使其能够更高效地构建应用程序,利用最先进的语言模型和对话系统,同时能够灵活地定制和整合其他必要的资源,为应用程序的开发和部署提供了更大的灵活性和便利性。
2.2 LangChain框架组成?
1.Model
任何语言模型应用的核心要素是…… 模型。LangChain为您提供了与任何语言模型进行接口的基本构件。
- 提示:模板化、动态选择和管理模型输入
- 语言模型:通过通用接口调用语言模型
- 输出解析器:从模型输出中提取信息
此外,LangChain还提供了额外的关键功能,如:
- 模型适配器:通过适配器将不同类型的语言模型无缝整合到应用程序中。
- 模型优化器:优化和调整模型以提高性能和效率。
- 自定义组件:允许开发人员根据特定需求创建和整合自定义组件,以扩展和改进模型的功能。
2.Retrieval
许多大型语言模型(LLM)应用需要用户特定的数据,这些数据并不属于模型的训练集。实现这一点的主要方法是通过检索增强生成(RAG)。在这个过程中,会检索外部数据,然后在生成步骤中传递给LLM。
LangChain为RAG应用提供了从简单到复杂的所有构建模块。文档的此部分涵盖与检索步骤相关的所有内容,例如数据的获取。尽管听起来简单,但实际上可能相当复杂。这包括几个关键模块。
文档加载器
从许多不同来源加载文档。LangChain提供超过100种不同的文档加载器,并与其他主要提供者(如AirByte和Unstructured)进行集成。我们提供与各种位置(私人S3存储桶、公共网站)的各种文档类型(HTML、PDF、代码)的加载集成。
文档转换器
检索的关键部分是仅获取文档的相关部分。这涉及几个转换步骤,以最佳准备文档进行检索。其中一个主要步骤是将大型文档分割(或分块)为较小的块。LangChain提供了几种不同的算法来执行此操作,同时针对特定文档类型(代码、Markdown等)进行了优化逻辑。
文本嵌入模型
检索的另一个关键部分是为文档创建嵌入。嵌入捕获文本的语义含义,使您能够快速高效地查找其他类似的文本。LangChain与超过25种不同的嵌入提供者和方法进行集成,涵盖了从开源到专有API的各种选择,使您可以选择最适合您需求的方式。LangChain提供了标准接口,使您能够轻松切换模型。
向量存储
随着嵌入技术的兴起,出现了对数据库的需求,以支持这些嵌入的有效存储和搜索。LangChain与超过50种不同的向量存储进行集成,涵盖了从开源本地存储到云托管专有存储的各种选择,使您可以选择最适合您需求的方式。LangChain提供标准接口,使您能够轻松切换向量存储。
检索器
一旦数据存储在数据库中,您仍需要检索它。LangChain支持许多不同的检索算法,这是我们增加最多价值的领域之一。我们支持易于入门的基本方法,即简单的语义搜索。然而,我们还在此基础上添加了一系列算法以提高性能。这些包括:
- 父文档检索器:这允许您为每个父文档创建多个嵌入,使您能够查找较小的块,但返回更大的上下文。
- 自查询检索器:用户的问题通常包含对不仅仅是语义的某些逻辑的引用,而是可以最好表示为元数据过滤器的逻辑。自查询允许您从查询中提取出语义部分以及查询中存在的其他元数据过滤器。
- 组合检索器:有时您可能希望从多个不同来源或使用多种不同算法检索文档。组合检索器可以轻松实现此操作。
3.Chains
单独使用LLM适用于简单的应用程序,但更复杂的应用程序需要将LLM链接起来,要么彼此链接,要么与其他组件链接。
LangChain提供了两个高级框架来“链接”组件。传统方法是使用Chain接口。更新的方法是使用LangChain表达语言(LCEL)。在构建新应用程序时,我们建议使用LCEL进行链式组合。但是,我们继续支持许多有用的内置Chain,因此我们在这里对两个框架进行了文档化。正如我们将在下面提到的,Chain本身也可以用于LCEL,因此两者并不是互斥的。
新内容补充:
此外,LangChain还提供了其他关于链式组合的重要内容:
- 模块兼容性:LangChain旨在确保不同模块之间的兼容性,使得可以无缝地将不同类型的LLMs和其他组件相互链接,以构建更加复杂和高效的应用程序。
- 动态调整:框架允许动态调整不同模块和LLMs之间的连接方式,从而使得应用程序的功能和性能得到灵活的调整和优化。
- 可扩展性:LangChain提供了灵活的扩展机制,允许开发人员根据具体需求定制新的链接策略和模块组合,以适应不同场景下的需求。
LCEL最显著的部分是它提供了直观且易读的组合语法。但更重要的是,它还提供了一流的支持。为一个简单且常见的例子,我们可以看到如何将提示(prompt)、模型和输出解析器结合起来:
from langchain.chat_models import ChatAnthropic from langchain.prompts import ChatPromptTemplate from langchain.schema import StrOutputParser model = ChatAnthropic() prompt = ChatPromptTemplate.from_messages([ ("system", "You're a very knowledgeable historian who provides accurate and eloquent answers to historical questions."), ("human", "{question}"), ]) runnable = prompt | model | StrOutputParser()