LangChain框架总结纯干货
LangChain是什么?LangChain是一个用于构建由 LLM 提供支持的代理和应用程序的框架。作用简化 LLMs 应用的开发难度方便开发者快速地开发复杂的 LLMs 应用。官网地址https://python.langchain.com/docs/introduction/从LangChain0.3到LangChain1.0发展上线时间LangChain V1.0 于 2025 年 10 月 23 日正式发布。 2025 年 10 月 22 日LangChain 官方团队宣布 LangChain 1.0 与 LangGraph 1.0 即将发布 LangChain V1.0 相较于 V0.3 是一次面向生产级工程化的重大升级不仅在 API 设计上大幅简化还在架构、可维护性、稳定性与扩展能力方面实现了质的飞跃。1. 统一 Agent 创建接口——create_agent( )2. 中间件系统Middleware——细粒度流程控制3. 标准化输出.content_blocks ——无论使用哪家模型输出统一为结构化内容块4. 结构化输出原生支持—— 将结构化输出直接集成到主循环中5. 基于 LangGraph 的底层架构—— Agent 实际是 LangGraph 编排的状态图(StateGraph)6. 包结构精简与迁移路径——移除冗余模块核心包更轻量。旧版功能如 LLMChain, ConversationBufferMemory迁移到 langchain-classic。LangChain体系核心组件核心组件早期分类LangChain中组件其实相当多的大致上可以分为6大部分1.模型包装器模型输入/输出Model I/O与语言模型交互的接口 语言模型 Language Models、提示模板 Prompt Templates、 输出解析器 Output Parsers等等2.数据连接Data connection与特定应用程序的数据进行交互的接口 文档加载器 、文档切分、文本嵌入、矢量、检索器等等3.链Chains将组件组合实现端到端应用。 链允许我们将多个组件组合在一起以创建一个单一的、连贯的应用程序。4.记忆Memory用于链的多次运行之间持久化应用程序状态。5.代理Agents与工具扩展模型的推理能力用于复杂的应用的调用序列。6.中间件Middleware控制和自定义每个步骤的代理执行。开发第一个LangChain应用程序模型包装器Model I/O主要包含三部分提示词、调用模型、输出解析(Parse)Model I/O之模型包装器LangChain 提供通用接口调用不同类型的语言模型这个通用接口被称为模型包装器。LangChain支持的模型有三大类1.非对话模型LLM包装器。2.对话聊天模型Chat Model包装器。3.文本嵌入模型Embedding Model这些模型将文本作为输入并返回词向量。在后面RAG的课程会单独学习和使用。模型类型详解1.非对话模型LLM包装器 也叫文本补全模型接收文本字符串作为输入并返回一个补全字符串作为输出。它基于Transformer架构通过大规模训练数据学习语言规律适用于文本生成、摘要、翻译、代码生成等任务。可以理解为只能一问一答。OpenAI的文本补全模型如GPT-3、text-davinci-003是通用文本生成工具而聊天模型如GPT-3.5 Turbo是对话专用模型。OpenAI的文本补全类型API在2023年7月进行了最后一次更新该API现在只能用于访问较旧的历史遗留模型。而且目前国内的大模型厂商普遍对该API也未提供支持。所以该包装器我们不予学习和考虑。2.聊天模型Chat Model主要代表Open AI的ChatGPT系列模型。这些模型通常由语言模型支持但它们的API更加结构化。是专门为多轮对话设计的模型其核心目标是模拟人与AI之间的自然交互。它基于LLM构建但通过特定优化如对话历史管理、角色区分来提升对话连贯性和上下文理解能力。聊天模型包装器为 ChatOpenAlBaseChatModel等。准备工作1.参数准备对应模型的API_KEYbase_url等2.配置好环境变量。从代码运行可以看到虽然我们和大模型能正常的交互但是有两个问题1、提示词是固定无法根据实际情况灵活变动。2、大模型原始答复比较复杂包含了很多额外的信息。要解决这两个问题就需要分别使用提示词模板、输出解析器。提示词模板通俗点说prompt template 是一个模板化的字符串可以用来生成特定的提示prompts。你可以将变量插入到模板中从而创建出不同的提示。优势1. 清晰易懂的提示2. 增强可重用性3. 简化维护。常见提示词模板1. LLM提示模板 PromptTemplate常用的String提示模板。2. 聊天提示模板 ChatPromptTemplate 常用的Chat提示模板用于组合各种角色的消息模板传入聊天模型。3. 少样本提示模板 FewShotPromptTemplate、提示模板部分格式化、管道提示模板 PipelinePrompt等等。链如何将前面的提示词模版、模型包装器和输出解析器串起来这时可以使用链。 链可以将模型输入输出整合在一个链中操作。 它利用提示模板格式化输入将格式化后的字符串传递给LLM模型并返回LLM的输出。 这样使得整个处理过程更加高效和便捷。输出解析器输出解析器负责获取 LLM 的输出并将其转换为更合适的格式。有许多不同类型的输出解析器StrOutputParser- CSV解析器:CommaSeparatedListOutputParser,模型的输出以逗号分隔以列表形式返回输出。- 日期时间解析器:DatetimeOutputParser,可用于将 LLM 输出解析为日期时间格式。- JSON解析器:JsonOutputParser,确保输出符合特定JSON对象格式。那什么是链呢实际上LangChain的名字源自其框架的核心设计思路:用链(Chain)将大语言模型开发的各个组件链接起来以构建复杂的应用程序。 链的主要功能是管理应用程序中的数据流动它将不同的组件(或其他链)链接在一起形成一个完整的数据处理流程。每个组件都是链中的一个环节它们按照预设的顺序接力完成各自的任务就好比工厂里的流水线。所以我们以LCEL链为主要学习对象如无特殊情况遗留链不会进行说明和学习。LCEL 也被称为LangChain表达式(LangChain Expression Language)是一种用声明式的方法来链接LangChain组件。所有可以被链起来的组件如大语言模型、输出解析器、检索器、提示词模板一般都支持下面三个方法stream: 流式返回响应的块invoke: 接受输入返回输出batch: 接受批量输入返回输出列表所以最终组成的链在使用上也是调用这三个方法。如何把组件链起来最简单最常见的就是用管道操作符 “ | ”或者使用RunnableSequenceLCEL高级特性与组件RunnableLambda很多的时候LangChain组件未提供的功能需要我们自己写函数实现但是这个函数我们也需要把它加入链作为工作流程的一部分此时就需要使用RunnableLambda。RunnableParallel/ RunnableMap把组件链起来前面我们使用了RunnableSequence。Sequence的中文意思“顺序一连串”也就是所有的组件或多个任务都是按顺序一个个执行的。 但是有时候我们希望多个任务能够同时执行这时可以使用RunnableParallel / RunnableMap。RunnablePassthroughRunnablePassthrough类允许我们在LangChain的链中传递数据1、确保数据保持不变直接用于后续步骤的输入。 RunnablePassthrough常用在链的第一个位置用于接收用户的输入也可以用在中间位置则用于接收上一步的输出。2、RunnablePassthrough也允许通过assign对数据增强后再往后传。 它会创建一个新的字典包含原始的所有字段以及你新指定的字段。常用预制LCEL链LangChain已经事先做好了很多LCEL链可以到LangChain官方API查询 https://reference.langchain.com/python/langchain_classic/chains/但是注意在“Deprecated classes”和“Deprecated functions”中的属于被声明废弃不建议使用。create_stuff_documents_chain将多个文档内容合并成一个长文本然后一次性交给LLM处理。更多的LCEL链的使用请查看官网文档。记忆Memory用于链的多次运行之间持久化应用程序状态。大模型是无状态的也就是大模型是记不住我们聊天中每次的对话内容的。早期LangChain中有ConversationBufferMemory之类的记忆组件现在这些组件已经被声明为废弃。新版本的LangChain提供了专门的消息历史组件ChatMessageHistory和自动会话历史管理组件RunnableWithMessageHistory记忆持久化方法ChatMessageHistory 是在内存中存储那怎么长久保存存储在redis数据库中记忆自动化管理开发完一个大模型应用程序如何让这个程序和其他的应用程序一起协同工作完成企业的复杂业务开启LangChain应用程序的调试功能1.发布我们的应用程序2.访问我们的应用程序通过HTTP访问、客户端访问LangChain与RAG数据连接Data connection组件: LangChain中的数据连接组件包括几个关键模块 文档加载、切割、转换、嵌入、向量存储和检索与大模型生成 完成一个基础RAG应用。文档与文档加载文档类型有很多可以是简单的文本文件、Word文档、Excel表格、Pdf文件等等。LangChain有很强的数据加载能力提供了很多常见的数据格式的支持例如CSV、文件目录、HTML、JSON、Markdown及PDF等。TXT文档:TextLoaderPDF文档:PyPDFLoaderCSV文档:CSVLoaderJSON文档:JSONLoaderHTML文档:UnstructuredHTMLLoaderMD文档:UnStructuredMarkdownLoader文件目录:DirectoryLoader加载器有 load方法用于从指定的数据源读取数据并将其转换成一个或多个文档。文档转换器 – 切割在前面的RAG基础章节我们已经了解了文本的分割。LangChain为此也提供了很多现成的分割器CharacterTextSplitter 基于字符(默认为\n\n)进行切割并通过字符数量来测量文本块的大小。使用chunk_size属性可设置文本块的大小使用chunk_overlap 属性设置文本块之间的最大重叠。RecursiveCharacterTextSplitter 在前面我们已经了解过除了自然语言它也支持对特定的编程语言(‘JavaScript’、‘cpp’、‘go’、‘java’ 、‘php’、‘python’等等)的代码进行切割。MarkdownHeaderTextSplitter可以根据指定的一组标题来切割一个Markdown 文档。内置分割器https://python.langchain.com/api_reference/text_splitters/index.html文档转换器LangChain文档转换器处理任务分为两个步骤:第一步是对文档进行切割主要由切割器完成;第二步是将切割后的文档转换为 Document 对象/数据格式。LangChain中数据以 Document 对象和向量形式在各个包装器中流通。Document 对象包含文本及其相关元数据它是LangChain在RAG处理中非常重要的概念。嵌入模型包装器和向量数据库文本嵌入模型Embedding Model这些模型将文本作为输入并返回词向量。LangChain 框架提供了一个名为Embeddings 的类它为多种文本嵌入模型(如OpenAI、Cohcre、HuggingFace 等)提供了统一的接口。通过该类实例化的嵌入模型包装器可以将文档转换为向量数据同时将搜索的问题也转换为向量数据这使得可通过计算搜索问题和文档在向量空间中的距离来寻找在向量空间中最相似的文本。实例化的 Embeddings 类被称为嵌入模型包装器同Model I/O 模块的 LLM 模型包装器和聊天模型包装器(Chat Model)并称为三大模型包装器。检索检索器 (Retriever) 是 RAG (检索增强生成) 系统的核心组件负责从知识库中查找与用户查询相关的文档片段。# 1.创建 FAISS 检索器 retriever_faiss FAISS.from_texts(texts, embeddings).as_retriever()# 2.创建 Chroma 检索器 retriever_chroma Chroma.from_documents(docs, embeddings).as_retriever()# 3.关键词检索器 retriever_bm25 BM25Retriever.from_texts(texts)# 4.混合检索器 (结合语义关键词) ensemble_retriever EnsembleRetriever( retrievers[retriever_faiss, retriever_bm25], weights[0.7, 0.3] # 权重分配大模型中工具使用 – Function Call自定义工具调用工具是AIAgent、链或LLM可以用来与世界互动的接口也包括物理世界从前面大模型中工具使用例子可以看出工具的定义要素工具的名称工具的描述该工具接收的参数 要调用的函数工具返回结果预定义工具调用LangChain 允许用户自定义Tools组件以满足特定的需求。同时也提供了一组预定义的Tools 组件Toolkits 组件是一个特殊的组件集合它包括了多个用于实现特定目标的 Tools组件LangChain 提供了预定义的 Toolkits 组件。例如 Arxiv是一个用于检索学术论文的工具它让Agent能够搜索和获取科学文献。中间件系统Middleware什么是中间件Middleware 是一种细粒度流程控制机制用于在智能体执行过程中拦截、修改或增强请求与响应的处理逻辑而无需修改核心 Agent 或工具的代码。 中间件在每个步骤之前和之后都会暴露钩子函数中间件Middleware能做什么内置中间件常用的中间件SummarizationMiddleware 总结摘要中间件上下文压缩当接近会话次数上限时自动汇总对话历史记录。自定义Middleware提供了两种拦截Agent执行的钩子before_agent - 在Agent启动之前每次调用一次before_model - 每次模型调用之前。after_model - 每次模型响应之后。after_agent - Agent完成后每次调用一次。wrap_model_call - 围绕每次模型调用wrap_tool_call - 围绕每次工具调用。自定义中间件Middleware通过在代理执行流程的特定点运行钩子来构建自定义中间件。基于装饰器的 适用于单钩中间件的快速简便。基于类的对于具有多个钩子的复杂中间件来说功能更强大。