【LangChain+RAG实战宝典 10】链(Chains)的构建与组合(端到端RAG闭环)
文章目录前言【LangChain+RAG实战宝典 10】链(Chains)的构建与组合(端到端RAG闭环)摘要一、什么是链?为什么RAG离不开链?1.1 链的核心定义1.2 无链 vs 有链(代码对比)1.3 链的核心价值二、基础链:从零搭建简单工作流2.1 LLMChain:最基础的单步链(提示词+模型)2.2 SequentialChain:多链顺序串联2.3 TransformChain:自定义数据转换链三、高级链:RouterChain 智能路由链3.1 核心原理3.2 实战:多场景智能路由问答四、RAG核心实战:RetrievalQA 检索问答链4.1 完整实战代码(从向量库到问答链)4.2 chain_type 四种文档处理策略(核心选型)4.3 自定义提示词(约束LLM行为)五、链的组合与调试(工程化必备)5.1 LCEL管道式组合(新版LangChain主推)5.2 链的调试技巧5.3 链的输入输出规范六、小结下篇预告✍️ 专栏互动思考题前言前9篇我们已经逐一掌握了RAG的所有核心组件:文档加载、文本分割、向量嵌入、向量存储、检索器。但这些组件都是独立模块,无法直接响应用户的端到端提问。想要实现「用户输入问题→自动检索知识库→LLM生成答案」的完整流程,就必须依靠链(Chain)将所有模块串联封装。链是LangChain的工作流核心,也是搭建可落地AI应用的关键一步。本文从基础链到高级路由链,再到RAG专属的RetrievalQA链,带你彻底掌握链的构建、组合与调试,完成端到端RAG系统闭环。【LangChain+RAG实战宝典 10】链(Chains)的构建与组合(端到端RAG闭环)专栏导语:前9篇我们已经逐一掌握了RAG的所有核心组件:文档加载、文本分割、向量嵌入、向量存储、检索器。但这些组件都是独立模块,无法直接响应用户的端到端提问。想要实现「用户输入问题→自动检索知识库→LLM生成答案」的完整流程,就必须依靠链(Chain)将所有模块串联封装。链是LangChain的工作流核心,也是搭建可落地AI应用的关键一步。本文从基础链到高级路由链,再到RAG专属的RetrievalQA链,带你彻底掌握链的构建、组合与调试,完成端到端RAG系统闭环。摘要本文为《LangChain+RAG实战宝典》系列第十篇,聚焦LangChain核心工作流抽象——链(Chains)。文章先明确链的定义与核心价值,详解LLMChain、SequentialChain、TransformChain三大基础链的用法与实战;讲解RouterChain路由链的分支逻辑,实现多场景智能分流;重点实战RAG必备的RetrievalQA链,拆解chain_type四种文档处理策略;补充新版LangChain主推的LCEL管道式链式写法、链的调试技巧与输入输出规范;完整实现从零散组件到端到端RAG问答链的搭建,为后续添加记忆模块实现多轮对话打下基础。关键词:LangChain;RAG;Chain;LLMChain;RetrievalQA;SequentialChain;RouterChain;LCEL;端到端问答一、什么是链?为什么RAG离不开链?1.1 链的核心定义链(Chain)是LangChain对AI工作流的标准化封装,它将模型、提示词、检索器、解析器、自定义函数等组件,按照固定顺序组合成可执行的流水线。每个组件作为链的一个节点,接收前序节点的输出,处理后传递给下一个节点,最终完成端到端任务。1.2 无链 vs 有链(代码对比)无链(零散代码):手动调用检索器→拼接提示词→调用LLM→解析结果,代码冗余、复用性差、难以调试;有链(模块化封装):一行代码调用整个工作流,组件可替换、可复用、可嵌套,工程化极强。1.3 链的核心价值模块化解耦:每个组件独立开发、测试,替换模型/检索器不影响整体流程;可复用嵌套:子链可作为父链的节点,复杂任务拆分为简单子链;标准化执行:统一的invoke/run调用方式,适配同步/异步/流式输出;易于调试:可逐节点打印中间结果,快速定位问题。所有链均继承自BaseChain基类,核心调用方法:invoke(input):新版标准调用,传入字典格式输入;run(input):旧版简化调用,仅支持单变量输入;input_keys/output_keys:查看链的输入/输出键,规范接口。二、基础链:从零搭建简单工作流基础链是LangChain的入门核心,覆盖单步调用、多步串联、自定义数据转换三大场景,新版LangChain逐步弃用LLMChain,主推LCEL写法,本文同步保留兼容写法与新版推荐写法。2.1 LLMChain:最基础的单步链(提示词+模型)LLMChain是LangChain最经典的基础链,封装提示词模板+LLM模型,实现单步文本生成。fromdotenvimportload_dotenvfromlangchain_openaiimportChatOpenAIfromlangchain.promptsimportPromptTemplatefromlangchain.chainsimportLLMChain# 加载环境变量load_dotenv()# 1. 初始化LLMllm=ChatOpenAI(model="gpt-3.5-turbo",temperature=0.7)# 2. 定义提示词模板prompt=PromptTemplate(input_variables=["product"],template="请为产品'{product}'创作一句简洁有记忆点的广告语,不超过15字。")# 3. 构建LLMChainchain=LLMChain(llm=llm,prompt=prompt)# 4. 调用链result=chain.run(product="便携咖啡杯")print("广告语:",result)新版LCEL替代写法(推荐):# LCEL管道式写法,无LLMChain,更简洁fromlangchain_core.output_parsersimportStrOutputParser lcel_chain=prompt|llm|StrOutputParser()result=lcel_chain.invoke({"product":"便携咖啡杯"})print("LCEL生成广告语:",result)2.2 SequentialChain:多链顺序串联SequentialChain用于多步流水线任务,前一个链的输出作为后一个链的输入,适合需要分步生成的场景(如生成产品名→写广告语→做产品介绍)。fromlangchain.chainsimportSequentialChain# 链1:生成产品名称name_chain=LLMChain(llm=llm,prompt=PromptTemplate(input_variables=["category"],template="为{category}品类生成1个创新产品名,仅输出名称。"),output_key=