文章目录
-
- 一、Chains核心基础认知
-
- [1.1 什么是Chains](#1.1 什么是Chains)
- [1.2 LCEL:链的极简构建方式](#1.2 LCEL:链的极简构建方式)
- [二、传统Chains的使用(Legacy Chains)](#二、传统Chains的使用(Legacy Chains))
-
- [2.1 基础链:LLMChain](#2.1 基础链:LLMChain)
- [2.2 顺序链:SimpleSequentialChain](#2.2 顺序链:SimpleSequentialChain)
- [2.3 通用顺序链:SequentialChain](#2.3 通用顺序链:SequentialChain)
- 三、基于LCEL的新一代Chains
-
-
- [3.1 create_sql_query_chain:SQL查询链](#3.1 create_sql_query_chain:SQL查询链)
- [3.2 create_stuff_documents_chain:文档合并处理链](#3.2 create_stuff_documents_chain:文档合并处理链)
- 四、Chains核心使用场景与选型建议
-
- [4.1 核心使用场景](#4.1 核心使用场景)
- [4.2 链的选型建议](#4.2 链的选型建议)
-
在基于大语言模型开发复杂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核心使用步骤
- 初始化语言模型和提示词模板;
- 通过LLMChain类组合组件,配置相关参数;
- 调用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为例)
-
安装数据库驱动:pip install pymysql;
-
连接数据库,初始化SQLDatabase对象;
-
通过create_sql_query_chain组合模型和数据库,构建链;
-
调用链,输入自然语言问题,生成SQL语句。
示例代码from langchain_community.utilities import SQLDatabase
from langchain_openai import ChatOpenAI
from langchain.chains.sql_database.query import create_sql_query_chain1. 连接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) AStotal_employeesFROMemployees;
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 核心使用场景
- 标准化模型调用:通过prompt | model | parser的LCEL链,实现统一的模型调用流程,避免重复代码;
- 多步骤文本处理:如翻译→总结→评论、解释→提取→生成,通过顺序链实现流水线工作流;
- 智能数据操作:通过create_sql_query_chain实现自然语言操作数据库,无需手动编写SQL;
- 文档处理:通过create_stuff_documents_chain实现多文档总结、问答,利用大模型的全局理解能力;
- 检索增强生成(RAG):结合create_history_aware_retriever和create_retrieval_chain,实现基于外部文档的智能问答;
- 多领域/多任务处理:通过路由链实现请求的动态分发,适配不同业务场景的子链。
4.2 链的选型建议
- 简单场景(单输入、单输出):优先使用LCEL基础链(prompt | model | parser),替代传统LLMChain;
- 单输入输出的流水线:使用SimpleSequentialChain(传统)或自行通过LCEL管道符串联多个链;
- 多输入输出的复杂流水线:使用SequentialChain(传统)或基于LCEL的Runnable组合;
- 数学计算:使用LLMMathChain,避免大模型直接计算出错;
- 数据库操作:优先使用create_sql_query_chain(LCEL),实现自然语言转SQL;
- 文档处理:优先使用create_stuff_documents_chain(LCEL),替代传统StuffDocumentsChain;
- 动态任务分发:使用RouterChain(传统),实现请求的智能路由;
- 检索增强生成:使用create_retrieval_chain(LCEL),快速构建RAG应用。