核心模块概览
目前围绕 LangChain 框架核心模块主要有六个,包括模型输入输出(Model I/O)、数据连接(Data Connection)、链(Chains)、记忆(Memory)、代理(Agents)和回调(Callbacks)。
模型输入输出 Model I/O
任何语言模型应用程序的核心元素都是模型。
LangChain提供了与任何语言模型交互的构建块,主要包含以下组件:
语言模型 Language Models
LangChain为两种类型的模型提供接口和集成:
- LLM:将文本字符串作为输入并返回文本字符串的模型。
- ChatModel:由语言模型支持将聊天消息列表作为输入并返回聊天消息的模型。
大型语言模型(LLM)是 LangChain 的核心组件。LangChain 不提供自己的 LLM,而是提供了一个标准接口,用于与许多不同的LLM进行交互。
聊天模型(ChatModel)是语言模型的变体。虽然聊天模型在底层使用语言模型,但它们暴露的接口有点不同:它们没有暴露“文本输入,文本输出”的 API,而是将聊天消息(ChatMessage)列表作为输入和输出。
目前 LangChain 支持的大语言模型可以查看 LLMs,也可以按照 LangChain LLM 接口标准集成自定义的语言模型。
提示模板 Prompt Templates
提示模板是一种预定义的配方,旨在为语言模型生成提示。模板可能包括说明、少量示例适合给定任务的特定上下文和问题。LangChain 提供了创建和使用提示模板的工具,以便在不同的语言模型之间轻松共享现有模板。通常,语言模型需要的提示类型为字符串或聊天消息列表。
LangChain提供了两种主要类型的提示模板:
PromptTemplate
:用于生成字符串提示。它使用 Python 的字符串格式来模板提示。您可以创建自定义子类来实现自定义格式逻辑。ChatPromptTemplate
:用于生成聊天提示作为聊天消息列表。它允许使用元组、MessagePromptTemplate
实例或BaseMessage
实例指定消息。这为构建聊天提示提供了灵活性。
提示模板的目标是使跨不同模型重用提示变得容易。它们允许将提示工程与模型调用分开。借助对自定义模板的支持,您可以根据用例的需要灵活地参数化和格式化提示。
示例选择器 Example Selectors
LangChain 中的 Example Selectors 允许用户为模型提供示例输入和输出,以帮助模型学习执行特定的任务。
这些示例可以用于几个目的:
- 训练新模型:Example Selectors可以为全新的模型提供训练数据,让模型学习执行给定的任务。
- 调优现有模型:对于现有的模型,Example selectors可以提供新的示例来继续训练和调优模型,提高其在特定任务上的表现。
- 测试模型:Example Selectors也可以用来提供测试用例,评估模型在给定任务上的性能。
- 说明模型能力:通过Example selectors,用户可以直观地了解模型的能力范围,看它能处理什么样的输入并给出什么样的输出。
- 调试模型:如果模型在某些示例上表现不佳,Example selectors可以帮助用户定位并解决问题。
- 控制模型行为:通过提供特定的输入输出示例,用户可以在一定程度上控制和指导模型的行为。
Example Selectors 为用户提供了一个简单直观的方式来与模型交互,让用户可以更好地训练、测试和控制 LangChain 模型,但具体的实现和作用还需要依赖实际的技术细节才能给出确切的回答。
输出解析器 Output Parsers
语言模型输出内容是文本格式,但是开发AI应用的时候,我们希望能拿到的是格式化的内容,例如结果转成目标对象、JSON、数组等,方便程序处理。这就需要 LangChain 提供的输出解析器(Output Parser)格式化模型返回的内容。
输出解析器作用是用于格式化语言模型返回的结果。一个输出解析器必须实现两种必要的方法:
- Get format instructions:返回一个字符串,其中包含要求语言模型应该返回什么格式内容的提示词。
- Parse:将模型返回的内容,解析为目标格式。
还有一个是可选的:
- Parse with prompt:这是一种解析字符串和提示的方法,用于处理从语言模型生成的响应。该方法需要一个提示来重试或修复输出,并从提示中获取信息以执行这些操作。这种方法接受来自语言模型的响应和提示,并将它们转换为某种结构,以便更好地处理和重试。
输出解析器允许我们定义期望的输出结构,如 Pydantic 模型,然后解析语言模型的文本输出来填充该结构。这比简单的文本输出更有用,因为它给了我们一个对象化的表示,可以进行验证、访问特定字段等。
数据连接Data Connection
在许多LLM应用程序中,用户特定的数据不在模型的训练集中,这可能是通过检索增强生成(RAG)实现的。RAG 的主要方法是检索外部数据,并在生成步骤中传递给 LLM。这样,LLM 就可以使用外部数据来增强生成的结果,从而提高应用程序的性能和准确性。
LangChain 为 RAG 应用程序提供了所有构建块,这包括几个关键模块。
文档加载器 Document Loaders
文档加载器的主要作用是将来自不同数据源的非结构化文本加载为文档对象。这些文档对象包含文本片段和相关元数据,例如简单文本文件、任意网页内容、甚至 YouTube 视频转录等。
文档加载器提供了一个名为”load”的公开方法,用于从配置的源加载数据作为文档对象。此外,它们还支持实现“延迟加载”功能,以便将数据延迟加载到内存中。
文档加载器为从不同数据源加载非结构化文本提供了一致的接口,这为下游任务(例如文本拆分器、检索等)提供了方便。加载后的文档对象可以直接传入文本拆分器进行拆分,也可以直接用于下游任务。
总的来说,文档加载器的引入为 LangChain 提供了更广泛的数据类型和数据来源,从而扩展了其可处理的数据范围。
LangChain 目前支持的文档加载器文档查看。
文档转换器 Document Transformers
文档转换器(Document Transformers)的主要作用是对加载的文档进行转换和处理,以便更好地适应下游任务的需求。
文档转换器提供了一致的接口来操作文档,主要包括以下几类:
- 文本拆分器(Text Splitters):将长文本拆分成语义上相关的小块,以适应语言模型的上下文窗口限制。
- 冗余过滤器(Redundancy Filters):识别并过滤重复的文档。
- 元数据提取器(Metadata Extractors):从文档中提取标题、语调等结构化元数据。
- 多语言转换器(Multi-lingual Transformers):实现文档的机器翻译。
- 对话转换器(Conversational Transformers):将非结构化对话转换为问答格式的文档。
文档转换器为我们提供了在送入下游任务之前对文档进行各种转换和处理的工具。这大大增强了 LangChain 框架的灵活性,允许我们自定义文档的表示以适应不同的下游任务需求。
总的来说,文档转换器是 LangChain 处理管道中非常重要的一个组件,它丰富了框架对文档的表示和操作能力。
文本嵌入模型 Text Embedding Models
文本嵌入模型是一种将文本转换为向量表示的模型。它们的主要作用包括:
- 文本检索:通过计算不同文本之间的向量相似度,可以实现语义搜索,找到向量空间中最相似的文本。
- 信息推荐:可以根据用户的历史记录或兴趣嵌入生成用户向量,计算不同信息的向量与用户向量的相似度,推荐相似的信息。
- 知识挖掘:可以通过聚类、降维等手段分析文本向量的分布,发现文本之间的潜在关联,挖掘知识。
- 自然语言处理:将词语、句子等表示为稠密向量,为神经网络等下游任务提供输入。
- 语义匹配:通过计算两个文本的向量余弦相似度,判断它们在语义上的相似程度,实现语义匹配。
总体来说,文本嵌入模型赋予了文本计算机可理解的数值表示,使文本可用于向量空间中的各种运算,大大拓展了文本分析的可能性,是自然语言处理领域非常重要的技术。
LangChain 通过统一的 API 调用这些不同的文本嵌入模型,用户可以方便地切换使用不同的嵌入模型,或将多个嵌入模型组合使用,以发挥各模型的优势。文本嵌入为 LangChain 中的问答、检索、推荐等功能提供了重要支持。
LangChain 还支持把文本嵌入存储到矢量存储或临时缓存,以避免需要重新计算它们。
LangChain 目前支持的文本嵌入模型文档查看。
矢量存储 Vector Stores
存储和搜索非结构化数据的最常见方法之一是嵌入它并存储生成的嵌入向量,然后在查询时嵌入非结构化查询并检索与嵌入查询“最相似”的嵌入向量。矢量存储负责存储嵌入数据并为您执行矢量搜索。
LangChain 目前支持的矢量存储文档查看。
检索器 Retrievers
检索器(Retrievers)是一种用于响应非结构化查询的接口,它可以返回符合查询要求的文档。相较于矢量存储,检索器更加通用,因为它不需要在存储文档的同时实现检索功能。矢量存储可以作为检索器的基础,但也有其他类型的检索器可以实现类似的功能。
检索器用于从大规模文本库中检索与查询相关的文本段落。其主要作用包括:
- 提高问答系统的覆盖面:通过检索相关文本段落,问答系统可以回答更多不在知识库中的新问题。
- 提供额外的上下文:检索出的相关文本为后续的语言生成提供额外的上下文信息。
- 支持开放域问答:依靠大规模文本库,可以实现开放域的问答而不仅限于知识库。
LangChain 提供了一些常用的检索器,如矢量检索器、文档检索器、网站研究检索器等。用户可以根据具体的应用场景进行选择,也可以自定义检索器实现特定的检索逻辑。
通过配置不同的检索器,LangChain 可以灵活地平衡检索的精度、召回率与效率。检索结果将为后续的问答生成提供信息支持,以产生更加准确和完整的回答。
索引 Indexing
索引 API 能够将来自各种源的文档同步到矢量存储中,并避免不必要的重复写入和重新计算嵌入。这可以帮助您节省时间和金钱,并改善您的矢量搜索结果。更重要的是,它还能处理经过多个转换步骤的文档,而不会影响到其在源文档中的原始内容。
链 Chains
链允许我们将多个组件组合在一起,以创建一个单一的、连贯的应用程序。例如,我们可以创建一个链,该链接受用户输入,使用提示模板对其进行格式化,然后将格式化的响应传递给 LLM。我们可以通过将多个链组合在一起,或者通过将链与其他组件组合在一起来构建更复杂的链。
您可以通过子类Chains
化自定义链实现特定的 NLP 任务。链还支持序列化到磁盘或者从磁盘加载。
LangChain 中主要有以下几种 Chains:
基础链 LLMChain
基础链(LLMChain)是一个简单的链,它围绕语言模型添加了一些功能。它在整个 LangChain 中广泛使用,包括其他链和代理。
LLMChain 由 PromptTemplate 和语言模型(LLM 或聊天模型)组成。它使用提供的输入键值(以及内存键值,如果可用)格式化提示模板,将格式化的字符串传递给 LLM 并返回 LLM 输出。
路由链RouterChain
路由链(RouterChain)用于创建可以动态选择下一条链的链。
RouterChain 由两个部分组成:
- 路由链本身(负责选择下一条链)
- destination_chains:RouterChain 可以路由到的链
RouterChain 的几种类型包括:
- LLMRouterChain:使用一个语言模型来决定如何路由
- EmbeddingRouterChain:使用嵌入和相似性来路由到不同的链
RouterChain 通常与其他链组合使用,比如 MultiPromptChain,可以根据问题动态选择不同的 prompt 来回答问题。
总之,RouterChain 允许链动态地选择下一步的操作,实现更加智能和灵活的链。它是 Langchain 中实现链组合的重要组件之一。
顺序链 SequentialChain
顺序链(SequentialChain)允许将多个链顺序连接起来,其输出作为下一个链的输入。顺序链允许您连接多个链并将它们组合成执行某些特定场景的管道。
SequentialChain 有两种类型:
- SimpleSequentialChain:最简单的顺序链,每个步骤有单个输入和输出,一个步骤的输出就是下一个步骤的输入。
- SequentialChain:更通用的顺序链,允许多个输入和输出。
SequentialChain 的一些关键特性:
- 可以将多个链组合成一个流水线,实现从输入到输出的完整工作流程。
- 支持在链之间传递多个变量,而不仅仅是单个字符串。
- 可以添加 SimpleMemory 来在链之间传递上下文。
- 支持同时返回多个输出变量。
- 可以通过命名输入输出变量来明确链之间的关系。
- 支持调试和可视化链的执行过程。
总之,SequentialChain 是 LangChain 中将多个链组合成复杂工作流的关键组件,允许构建功能强大的链式模型。
转换链 TransformChain
转换链(TransformChain)允许在链之间添加自定义的转换函数。
TransformChain 的主要组成部分是:
- input_variables:输入变量名列表
- output_variables:输出变量名列表
- transform:自定义的转换函数
转换函数接受一个字典作为输入,字典中的键是 input_variables 中定义的变量名。
转换函数需要返回一个字典,字典中的键是 output_variables 中定义的变量名。
这样 TransformChain 就可以在链之间添加任意的转换逻辑,如清理、过滤、格式化数据等。
总之,TransformChain 为在链之间添加自定义转换提供了一种简单的方法,使链之间的数据流更加灵活。
文档链 DocumentsChain
文档链(DocumentsChain)用于将多个文档作为输入传递给下游的链。它可以用来从多个文档中抽取信息、进行问答、总结等任务。
DocumentsChain 的一些关键特点:
- 可以将多个文档合并成一个虚拟的大文档,传递给下游链。
- 支持从文档中抽取关键词,命名实体等信息。
- 可以针对每个文档单独处理,然后合并结果。
- 支持根据文档内容进行路由,选择不同的下游链。
- 可以跟踪每个结果来自哪个文档。
- 支持各种文档格式,如文本、PDF、HTML等。
DocumentsChain 通常与问答链、总结链等结合使用,来利用多个文档的信息。它简化了处理多个输入文档的流程。
总之,DocumentsChain 是 LangChain 中处理多文档输入的重要组件,允许构建更加智能的链式模型。
记忆 Memory
Memory 组件用于在链之间存储和传递信息,从而实现对话的上下文感知能力。
Memory 的几个关键功能和作用:
- 存储之前对话和验证信息的状态,用于后续链的输入。这使得后续的链可以感知到之前的上下文。
- 允许链访问和操作共享的内存,实现链之间的协作。
- 支持不同的内存存储后端,如字典、数据库等。
- 可以存储各种数据类型,如文本、图像、音频等。
- 可以用于实现对话系统的用户个性化、任务跟踪等功能。
- 可以存储验证信息,确保链只依据可信来源生成输出。
- 可以存储链的中间执行状态,实现断点恢复等功能。
总之,Memory 是 LangChain 实现长对话上下文和链间协作的核心组件。它为构建真正智能和上下文感知的链式对话系统提供了基础。
代理 Agents
代理(Agents)的核心思想是使用 LLM 作为大脑自动思考,自动决策选择执行不同的动作,最终完成我们的目标任务。
Agents 模块有几个关键组件:
代理 Agent
代理(agent)底层的实现方式是通过 LLM 来决定下一步执行什么动作,从而扮演着我们的代理角色。它可以协助我们做出决策,调用相应的 API,为我们提供高效便捷的服务。
工具 Tools
工具(Tools)是代理调用的函数或 API,需要被正确调用并以最有帮助的方式描述,以便代理能够顺利运行。LangChain 提供了广泛的入门工具,但也支持定义自己的工具,包括自定义描述。
LangChain 目前支持的工具文档查看。
工具集 Toolkits
工具集(Toolkits)通常提供给LLM的工具不仅仅只有一两个,而是一组可供选择的工具集,这样可以让 LLM 在完成任务时有更多的能力和选择。此外,这些工具集还可能包含完成特定目标所需的工具组合。
LangChain 目前支持的工具集文档查看。
代理执行器 AgentExecutor
代理执行器(AgentExecutor)是在代理运行时执行的,它的作用是为您处理代理在选择工具时可能遇到的一些问题,比如代理选择不存在的工具或者工具出现错误等情况。此外,代理执行器还可以处理代理生成的输出无法解析为工具调用的情况,并在所有级别(包括代理决策和工具调用)上进行日志记录和可观察性输出。这样可以更好地保证系统的稳定性和可靠性。
回调 Callbacks
LangChain 提供了一个回调系统,允许您连接到 LLM 申请的各个阶段。这对于日志记录、监控、流传输和其他任务(添加标签、计算 Token 等)非常有用。
小结
本文介绍了 LangChain 框架的核心模块概览。主要包括模型输入输出(Model I/O)、数据连接(Data Connection)、链(Chains)、记忆(Memory)、代理(Agents)和回调(Callbacks)等六个模块。
模型输入输出模块提供了语言模型和大语言模型的接口,可以将文本格式化为模型输入。
数据连接模块提供了文档加载器和文档转换器等工具,用于将非结构化文本转换为可处理的数据。
链模块提供了各种类型的链,如基础链、路由链和顺序链等,用于组合和连接不同的功能。
记忆模块用于在链之间存储和传递信息,实现对话的上下文感知能力。
代理模块通过使用 LLM 来自动决策和执行动作,完成任务。
回调模块提供了连接到 LLM 申请的各个阶段的功能,用于日志记录、监控和流传输等任务。
这些模块的组合可以构建复杂的链式模型,实现各种自然语言处理任务。
理解新范式,拥抱新时代,把握新机会。如果对你有帮助记得点赞收藏哦~ 关注公众号【码森林】~ 《LangChain 入门到实战教程》更多内容