【LangChain专栏】LangChain模块中Chains 链的使用

文章目录

在基于大语言模型开发复杂AI应用时,单一的模型调用、提示词模板往往无法满足实际业务需求,而LangChain中的Chains(链) 正是为解决这一问题而生的核心能力。Chains通过将提示模板、LLM模型、输出解析器、记忆、工具等模块化组件串联/组合,形成可复用的AI工作流,让开发者能够轻松实现比单一组件更强大的功能。

一、Chains核心基础认知

1.1 什么是Chains

Chain即链,是LangChain中实现组件组合的核心机制,其核心思想是模块化组合:将不同功能的基础组件按业务逻辑连接,完成单一组件无法实现的复杂任务。常见的组合形式包括:

• LLM与提示模板(Prompt Template)结合,实现标准化的模型调用;

• LLM与输出解析器结合,将模型原生输出转换为结构化数据;

• LLM与外部数据/工具结合,实现智能问答、数据查询等场景;

• LLM与记忆组件结合,维护聊天历史实现多轮对话;

• 多个LLM按顺序串联,前一个模型的输出作为后一个模型的输入。

1.2 LCEL:链的极简构建方式

LangChain表达式语言(LCEL,LangChain Expression Language)是LangChain主推的声明式链构建方法,通过Python原生的管道符|将组件连接成可执行流程,大幅简化了AI工作流的开发,也是构建最简单Chain的核心方式。

LCEL的核心构成

一个标准的LCEL链由三部分组成,执行流程为输入→提示模板→模型→输出解析器→结果:

复制代码
chain = prompt | model | output_parser

• Prompt:基础提示模板(BasePromptTemplate),接收参数字典并生成PromptValue,适配LLM(字符串输入)和ChatModel(消息序列输入);

• Model:语言模型/聊天模型,接收PromptValue并输出字符串或BaseMessage;

• OutputParser:输出解析器(BaseOutputParser),将模型原生输出解析为指定格式(如字符串、JSON)。

Runnable协议:统一的组件调用标准

LCEL的核心底层是Runnable抽象接口,它强制所有LCEL兼容组件实现一组标准方法,解决了传统开发中不同组件调用方式不统一的痛点。

复制代码
class Runnable(Protocol):
    def invoke(self, input: Any) -> Any: ... # 单输入单输出,核心调用方法
    def batch(self, inputs: List[Any]) -> List[Any]: ... # 批量处理
    def stream(self, input: Any) -> Iterator[Any]: ... # 流式输出
    # 异步方法 ainvoke/abatch/astream 等

所有LCEL组件(提示模板、模型、解析器、检索器等)都实现了Runnable协议,这意味着无论组件功能如何,都可以通过invoke/batch/stream实现统一调用,且组件组合后的链也自动继承这些方法。

LCEL解决的传统开发痛点

在没有统一协议的情况下,不同组件的调用方法各异,组合时需要手动适配,代码繁琐且易出错:

复制代码
# 传统方式:各组件调用方法不统一
prompt_text = prompt.format(topic="猫") # 提示词:format
model_out = model.generate(prompt_text) # 模型:generate
result = parser.parse(model_out) # 解析器:parse

而通过LCEL的Runnable协议,所有组件统一使用invoke调用,结合管道符可实现一键组合,无需手动处理中间结果传递和类型匹配:

复制代码
# LCEL方式:统一调用+管道符组合
chain = prompt | model | parser
result = chain.invoke({"topic": "猫"})
LCEL基础使用示例

以"生成指定话题的简短笑话"为例,体验LCEL链的极简开发:

复制代码
from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate

load_dotenv()
# 1. 初始化组件
chat_model = ChatOpenAI(model="gpt-4o-mini")
prompt_template = PromptTemplate.from_template("给我讲一个关于{topic}话题的简短笑话")
parser = StrOutputParser()
# 2. 构建LCEL链
chain = prompt_template | chat_model | parser
# 3. 调用链
output = chain.invoke({"topic": "ice cream"})
print(output)

二、传统Chains的使用(Legacy Chains)

在LCEL推出之前,LangChain提供了一系列传统链(Legacy Chains),虽然目前LangChain官方推荐使用LCEL,但传统链的设计思想仍对理解复杂工作流有重要意义,且部分场景仍有使用需求。以下介绍最常用的传统链类型。

2.1 基础链:LLMChain

LLMChain是最基础、最核心的传统链,至少包含提示词模板和语言模型两个组件,适用于无上下文的单次问答场景(如翻译、摘要、分类),特点是无记忆能力,无法自动维护聊天历史。

⚠️ 官方提示:LLMChain在LangChain 0.1.17中已被弃用,1.0版本将彻底移除,推荐使用prompt | llm的LCEL方式替代。

LLMChain核心使用步骤
  1. 初始化语言模型和提示词模板;
  2. 通过LLMChain类组合组件,配置相关参数;
  3. 调用invoke()方法执行链,获取结果。

2.2 顺序链:SimpleSequentialChain

顺序链用于将多个链按顺序串联,前一个链的输出作为后一个链的输入,形成流水线工作流。SimpleSequentialChain是最简单的顺序链,适用于单输入、单输出的子链串联,无需手动映射变量,框架自动完成参数传递。

2.3 通用顺序链:SequentialChain

SequentialChain是更灵活的通用顺序链,解决了SimpleSequentialChain单输入输出的限制,支持多输入、多输出的子链串联,需显式定义变量映射关系,适用于复杂的多变量业务场景。

核心特点

• 支持子链的多输入、多输出变量;

• 需通过input_variables定义初始入参,output_variables定义最终输出;

• 子链通过output_key定义输出变量,后续子链可直接引用该变量作为入参;

• 支持分支、条件逻辑,是处理复杂流水线的核心传统链。

三、基于LCEL的新一代Chains

随着LCEL的成熟,LangChain官方推出了基于LCEL构建的新一代链,替代传统链的同时,结合了LCEL的统一调用、管道符组合、Runnable协议优势,更适合现代AI应用开发。以下介绍最常用的新一代链类型。

3.1 create_sql_query_chain:SQL查询链

核心功能是将自然语言转换为结构化的SQL查询语句,实现自然语言操作数据库,适用于智能数据查询、数据分析等场景,支持MySQL、PostgreSQL、SQLite等主流数据库。

使用步骤(以MySQL为例)

  1. 安装数据库驱动:pip install pymysql;

  2. 连接数据库,初始化SQLDatabase对象;

  3. 通过create_sql_query_chain组合模型和数据库,构建链;

  4. 调用链,输入自然语言问题,生成SQL语句。
    示例代码

    from langchain_community.utilities import SQLDatabase
    from langchain_openai import ChatOpenAI
    from langchain.chains.sql_database.query import create_sql_query_chain

    1. 连接MySQL数据库

    db = SQLDatabase.from_uri("mysql+pymysql://root:root@127.0.0.1:3306/test")

    2. 初始化模型

    llm = ChatOpenAI(model="gpt-4o-mini")

    3. 构建SQL查询链

    chain = create_sql_query_chain(llm=llm, db=db)

    4. 自然语言生成SQL

    res = chain.invoke({"question": "查询employees表中一共有多少个员工?", "table_names_to_use": ["employees"]})
    print(res) # 输出:SELECT COUNT(employee_id) AS total_employees FROM employees;

3.2 create_stuff_documents_chain:文档合并处理链

是传统StuffDocumentsChain的LCEL升级版,核心功能是将多个文档合并为单个文本,传递给LLM处理,保持文档上下文的完整性,适用于多文档总结、多文档问答,仅支持少量/中等长度文档(避免提示词超限)。

示例代码:多文档问答

复制代码
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.documents import Document

# 1. 初始化组件
llm = ChatOpenAI(model="gpt-4o-mini")
prompt = PromptTemplate.from_template("如下文档{docs}中说,香蕉是什么颜色的?")
# 2. 构建文档处理链
chain = create_stuff_documents_chain(llm, prompt, document_variable_name="docs")
# 3. 准备文档
docs = [
    Document(page_content="苹果是红色的水果,产自温带地区。"),
    Document(page_content="香蕉是白色的水果,主要产自热带地区。"),
    Document(page_content="蓝莓是蓝色的浆果,含有抗氧化物质。")
]
# 4. 调用链
res = chain.invoke({"docs": docs})
print(res) # 模型会纠正错误,输出香蕉成熟时为黄色

四、Chains核心使用场景与选型建议

4.1 核心使用场景

  1. 标准化模型调用:通过prompt | model | parser的LCEL链,实现统一的模型调用流程,避免重复代码;
  2. 多步骤文本处理:如翻译→总结→评论、解释→提取→生成,通过顺序链实现流水线工作流;
  3. 智能数据操作:通过create_sql_query_chain实现自然语言操作数据库,无需手动编写SQL;
  4. 文档处理:通过create_stuff_documents_chain实现多文档总结、问答,利用大模型的全局理解能力;
  5. 检索增强生成(RAG):结合create_history_aware_retriever和create_retrieval_chain,实现基于外部文档的智能问答;
  6. 多领域/多任务处理:通过路由链实现请求的动态分发,适配不同业务场景的子链。

4.2 链的选型建议

  1. 简单场景(单输入、单输出):优先使用LCEL基础链(prompt | model | parser),替代传统LLMChain;
  2. 单输入输出的流水线:使用SimpleSequentialChain(传统)或自行通过LCEL管道符串联多个链;
  3. 多输入输出的复杂流水线:使用SequentialChain(传统)或基于LCEL的Runnable组合;
  4. 数学计算:使用LLMMathChain,避免大模型直接计算出错;
  5. 数据库操作:优先使用create_sql_query_chain(LCEL),实现自然语言转SQL;
  6. 文档处理:优先使用create_stuff_documents_chain(LCEL),替代传统StuffDocumentsChain;
  7. 动态任务分发:使用RouterChain(传统),实现请求的智能路由;
  8. 检索增强生成:使用create_retrieval_chain(LCEL),快速构建RAG应用。
相关推荐
GuokLiu1 小时前
260223-Gartner Hype Cycle 2026 AI 报告调研与解读
人工智能
量子-Alex1 小时前
【大模型综述】Large Language Models: A Survey
人工智能
Main. 241 小时前
LangChain - AI应用开发利器(一)
langchain
艾醒(AiXing-w)1 小时前
打破信息差——2月22日AI全景:算力理性、视频革命、安全合规,行业正式进入下半场
人工智能
天一生水water1 小时前
MCP入门教程
人工智能·microsoft
土拨鼠烧电路1 小时前
笔记08:供应链的生命线:预测、库存与韧性
人工智能·笔记
小雨中_1 小时前
1.1 模型显存总体分析
人工智能·深度学习·机器学习·自然语言处理
程序员的那些事_2 小时前
宕机瘫痪 13 小时!官方甩锅人类员工,内部员工:自家 AI 干的
人工智能
vm322 小时前
02:Agent Loop 深度剖析:ReAct 循环的工程实现
人工智能·python