目前围绕 LangChain 框架核心模块主要有六个,包括模型输入输出(Model I/O)、数据连接(Data Connection)、链(Chains)、记忆(Memory)、代理(Agents)和回调(Callbacks)。
任何语言模型应用程序的核心元素都是模型。
LangChain提供了与任何语言模型交互的构建块,主要包含以下组件:
LangChain为两种类型的模型提供接口和集成:
大型语言模型(LLM)是 LangChain 的核心组件。LangChain 不提供自己的 LLM,而是提供了一个标准接口,用于与许多不同的LLM进行交互。
聊天模型(ChatModel)是语言模型的变体。虽然聊天模型在底层使用语言模型,但它们暴露的接口有点不同:它们没有暴露“文本输入,文本输出”的 API,而是将聊天消息(ChatMessage)列表作为输入和输出。
目前 LangChain 支持的大语言模型可以查看 LLMs,也可以按照 LangChain LLM 接口标准集成自定义的语言模型。
提示模板是一种预定义的配方,旨在为语言模型生成提示。模板可能包括说明、少量示例适合给定任务的特定上下文和问题。LangChain 提供了创建和使用提示模板的工具,以便在不同的语言模型之间轻松共享现有模板。通常,语言模型需要的提示类型为字符串或聊天消息列表。
LangChain提供了两种主要类型的提示模板:
PromptTemplate
:用于生成字符串提示。它使用 Python 的字符串格式来模板提示。您可以创建自定义子类来实现自定义格式逻辑。ChatPromptTemplate
:用于生成聊天提示作为聊天消息列表。它允许使用元组、 MessagePromptTemplate
实例或 BaseMessage
实例指定消息。这为构建聊天提示提供了灵活性。提示模板的目标是使跨不同模型重用提示变得容易。它们允许将提示工程与模型调用分开。借助对自定义模板的支持,您可以根据用例的需要灵活地参数化和格式化提示。
LangChain 中的 Example Selectors 允许用户为模型提供示例输入和输出,以帮助模型学习执行特定的任务。
这些示例可以用于几个目的:
Example Selectors 为用户提供了一个简单直观的方式来与模型交互,让用户可以更好地训练、测试和控制 LangChain 模型,但具体的实现和作用还需要依赖实际的技术细节才能给出确切的回答。
语言模型输出内容是文本格式,但是开发AI应用的时候,我们希望能拿到的是格式化的内容,例如结果转成目标对象、JSON、数组等,方便程序处理。这就需要 LangChain 提供的输出解析器(Output Parser)格式化模型返回的内容。
输出解析器作用是用于格式化语言模型返回的结果。一个输出解析器必须实现两种必要的方法:
还有一个是可选的:
输出解析器允许我们定义期望的输出结构,如 Pydantic 模型,然后解析语言模型的文本输出来填充该结构。这比简单的文本输出更有用,因为它给了我们一个对象化的表示,可以进行验证、访问特定字段等。
在许多LLM应用程序中,用户特定的数据不在模型的训练集中,这可能是通过检索增强生成(RAG)实现的。RAG 的主要方法是检索外部数据,并在生成步骤中传递给 LLM。这样,LLM 就可以使用外部数据来增强生成的结果,从而提高应用程序的性能和准确性。
LangChain 为 RAG 应用程序提供了所有构建块,这包括几个关键模块。
文档加载器的主要作用是将来自不同数据源的非结构化文本加载为文档对象。这些文档对象包含文本片段和相关元数据,例如简单文本文件、任意网页内容、甚至 YouTube 视频转录等。
文档加载器提供了一个名为"load"的公开方法,用于从配置的源加载数据作为文档对象。此外,它们还支持实现“延迟加载”功能,以便将数据延迟加载到内存中。
文档加载器为从不同数据源加载非结构化文本提供了一致的接口,这为下游任务(例如文本拆分器、检索等)提供了方便。加载后的文档对象可以直接传入文本拆分器进行拆分,也可以直接用于下游任务。
总的来说,文档加载器的引入为 LangChain 提供了更广泛的数据类型和数据来源,从而扩展了其可处理的数据范围。
文档转换器(Document Transformers)的主要作用是对加载的文档进行转换和处理,以便更好地适应下游任务的需求。
文档转换器提供了一致的接口来操作文档,主要包括以下几类:
文档转换器为我们提供了在送入下游任务之前对文档进行各种转换和处理的工具。这大大增强了 LangChain 框架的灵活性,允许我们自定义文档的表示以适应不同的下游任务需求。
总的来说,文档转换器是 LangChain 处理管道中非常重要的一个组件,它丰富了框架对文档的表示和操作能力。
文本嵌入模型是一种将文本转换为向量表示的模型。它们的主要作用包括:
总体来说,文本嵌入模型赋予了文本计算机可理解的数值表示,使文本可用于向量空间中的各种运算,大大拓展了文本分析的可能性,是自然语言处理领域非常重要的技术。
LangChain 通过统一的 API 调用这些不同的文本嵌入模型,用户可以方便地切换使用不同的嵌入模型,或将多个嵌入模型组合使用,以发挥各模型的优势。文本嵌入为 LangChain 中的问答、检索、推荐等功能提供了重要支持。
LangChain 还支持把文本嵌入存储到矢量存储或临时缓存,以避免需要重新计算它们。
存储和搜索非结构化数据的最常见方法之一是嵌入它并存储生成的嵌入向量,然后在查询时嵌入非结构化查询并检索与嵌入查询“最相似”的嵌入向量。矢量存储负责存储嵌入数据并为您执行矢量搜索。
检索器(Retrievers)是一种用于响应非结构化查询的接口,它可以返回符合查询要求的文档。相较于矢量存储,检索器更加通用,因为它不需要在存储文档的同时实现检索功能。矢量存储可以作为检索器的基础,但也有其他类型的检索器可以实现类似的功能。
检索器用于从大规模文本库中检索与查询相关的文本段落。其主要作用包括:
LangChain 提供了一些常用的检索器,如矢量检索器、文档检索器、网站研究检索器等。用户可以根据具体的应用场景进行选择,也可以自定义检索器实现特定的检索逻辑。
通过配置不同的检索器,LangChain 可以灵活地平衡检索的精度、召回率与效率。检索结果将为后续的问答生成提供信息支持,以产生更加准确和完整的回答。
索引 API 能够将来自各种源的文档同步到矢量存储中,并避免不必要的重复写入和重新计算嵌入。这可以帮助您节省时间和金钱,并改善您的矢量搜索结果。更重要的是,它还能处理经过多个转换步骤的文档,而不会影响到其在源文档中的原始内容。
链允许我们将多个组件组合在一起,以创建一个单一的、连贯的应用程序。例如,我们可以创建一个链,该链接受用户输入,使用提示模板对其进行格式化,然后将格式化的响应传递给 LLM。我们可以通过将多个链组合在一起,或者通过将链与其他组件组合在一起来构建更复杂的链。
您可以通过子类Chains
化自定义链实现特定的 NLP 任务。链还支持序列化到磁盘或者从磁盘加载。
LangChain 中主要有以下几种 Chains:
基础链(LLMChain)是一个简单的链,它围绕语言模型添加了一些功能。它在整个 LangChain 中广泛使用,包括其他链和代理。
LLMChain 由 PromptTemplate 和语言模型(LLM 或聊天模型)组成。它使用提供的输入键值(以及内存键值,如果可用)格式化提示模板,将格式化的字符串传递给 LLM 并返回 LLM 输出。
路由链(RouterChain)用于创建可以动态选择下一条链的链。
RouterChain 由两个部分组成:
RouterChain 的几种类型包括:
RouterChain 通常与其他链组合使用,比如 MultiPromptChain,可以根据问题动态选择不同的 prompt 来回答问题。
总之,RouterChain 允许链动态地选择下一步的操作,实现更加智能和灵活的链。它是 Langchain 中实现链组合的重要组件之一。
顺序链(SequentialChain)允许将多个链顺序连接起来,其输出作为下一个链的输入。顺序链允许您连接多个链并将它们组合成执行某些特定场景的管道。
SequentialChain 有两种类型:
SequentialChain 的一些关键特性:
总之,SequentialChain 是 LangChain 中将多个链组合成复杂工作流的关键组件,允许构建功能强大的链式模型。
转换链(TransformChain)允许在链之间添加自定义的转换函数。
TransformChain 的主要组成部分是:
转换函数接受一个字典作为输入,字典中的键是 input_variables 中定义的变量名。
转换函数需要返回一个字典,字典中的键是 output_variables 中定义的变量名。
这样 TransformChain 就可以在链之间添加任意的转换逻辑,如清理、过滤、格式化数据等。
总之,TransformChain 为在链之间添加自定义转换提供了一种简单的方法,使链之间的数据流更加灵活。
文档链(DocumentsChain)用于将多个文档作为输入传递给下游的链。它可以用来从多个文档中抽取信息、进行问答、总结等任务。
DocumentsChain 的一些关键特点:
DocumentsChain 通常与问答链、总结链等结合使用,来利用多个文档的信息。它简化了处理多个输入文档的流程。
总之,DocumentsChain 是 LangChain 中处理多文档输入的重要组件,允许构建更加智能的链式模型。
Memory 组件用于在链之间存储和传递信息,从而实现对话的上下文感知能力。
Memory 的几个关键功能和作用:
总之,Memory 是 LangChain 实现长对话上下文和链间协作的核心组件。它为构建真正智能和上下文感知的链式对话系统提供了基础。
代理(Agents)的核心思想是使用 LLM 作为大脑自动思考,自动决策选择执行不同的动作,最终完成我们的目标任务。
Agents 模块有几个关键组件:
代理(agent)底层的实现方式是通过 LLM 来决定下一步执行什么动作,从而扮演着我们的代理角色。它可以协助我们做出决策,调用相应的 API,为我们提供高效便捷的服务。
工具(Tools)是代理调用的函数或 API,需要被正确调用并以最有帮助的方式描述,以便代理能够顺利运行。LangChain 提供了广泛的入门工具,但也支持定义自己的工具,包括自定义描述。
工具集(Toolkits)通常提供给LLM的工具不仅仅只有一两个,而是一组可供选择的工具集,这样可以让 LLM 在完成任务时有更多的能力和选择。此外,这些工具集还可能包含完成特定目标所需的工具组合。
代理执行器(AgentExecutor)是在代理运行时执行的,它的作用是为您处理代理在选择工具时可能遇到的一些问题,比如代理选择不存在的工具或者工具出现错误等情况。此外,代理执行器还可以处理代理生成的输出无法解析为工具调用的情况,并在所有级别(包括代理决策和工具调用)上进行日志记录和可观察性输出。这样可以更好地保证系统的稳定性和可靠性。
LangChain 提供了一个回调系统,允许您连接到 LLM 申请的各个阶段。这对于日志记录、监控、流传输和其他任务(添加标签、计算 Token 等)非常有用。
本文介绍了 LangChain 框架的核心模块概览。主要包括模型输入输出(Model I/O)、数据连接(Data Connection)、链(Chains)、记忆(Memory)、代理(Agents)和回调(Callbacks)等六个模块。
模型输入输出模块提供了语言模型和大语言模型的接口,可以将文本格式化为模型输入。
数据连接模块提供了文档加载器和文档转换器等工具,用于将非结构化文本转换为可处理的数据。
链模块提供了各种类型的链,如基础链、路由链和顺序链等,用于组合和连接不同的功能。
记忆模块用于在链之间存储和传递信息,实现对话的上下文感知能力。
代理模块通过使用 LLM 来自动决策和执行动作,完成任务。
回调模块提供了连接到 LLM 申请的各个阶段的功能,用于日志记录、监控和流传输等任务。
这些模块的组合可以构建复杂的链式模型,实现各种自然语言处理任务。
理解新范式,拥抱新时代,把握新机会。《LangChain 入门到实战教程》更多内容
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有