在基于大语言模型开发复杂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应用。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐