
LangChain 中的 Chain(链) 是其最核心的组件之一,可以把它理解为一个可编排、可复用、按顺序执行的任务流水线。
简单来说,Chain 允许把“调用大模型”、“检索文档”、“处理文本”等多个步骤串联起来,上一个步骤的输出自动成为下一个步骤的输入。这让你能像搭积木一样,构建出从简单问答到复杂知识库检索等各式各样的 AI 应用。
链条怎么搭
目前的 LangChain 推荐使用一种函数式编程风格的LCEL(LangChain 表达式语言) 来构建链。它使用管道符 | 将不同组件连接起来,代码非常简洁直观。
1. 基础单步链:最简单的“一问一答”
这是最基础的用法,将一个提示模板(Prompt)和模型(Model)连接起来。
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
# 1. 定义提示模板
prompt = PromptTemplate.from_template("为'{city}'这个城市写一句旅游宣传语。")
# 2. 定义模型
model = ChatOpenAI(model="gpt-3.5-turbo")
# 3. 用 | 运算符构建链
chain = prompt | model
# 4. 运行链
response = chain.invoke({"city": "成都"})
print(response.content) # 例如:输出“成都,一座来了就不想走的城市。”
2. 顺序链:搭积木式组合
这是最常用的模式,能实现更复杂的工作流,例如“先生成一份大纲,再根据大纲扩写成完整文章”。
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-3.5-turbo")
# 步骤 1: 生成大纲的链
outline_prompt = PromptTemplate.from_template("为'{topic}'写一份文章大纲")
outline_chain = outline_prompt | model
# 步骤 2: 根据大纲扩写文章的链
article_prompt = PromptTemplate.from_template("根据下面的大纲,写一篇完整的文章:\n\n大纲: {outline}")
article_chain = article_prompt | model
# 将两个链组合起来
full_chain = outline_chain | (lambda x: {"outline": x.content}) | article_chain
# 运行
result = full_chain.invoke({"topic": "人工智能发展史"})
print(result.content)
3. RAG 检索链:让模型“开卷考试”
这是目前最主流的用法之一,让模型先从一个知识库(如向量数据库)中检索相关文档,再根据这些文档来回答问题,可以有效减少“幻觉”。
from langchain_openai import ChatOpenAI
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
# 假设已有一个 retriever(检索器)
retriever = ...
model = ChatOpenAI(model="gpt-3.5-turbo")
# 1. 定义“整合文档并提问”的链
combine_chain = create_stuff_documents_chain(model, prompt)
# 2. 创建最终的 RAG 检索链
rag_chain = create_retrieval_chain(retriever, combine_chain)
# 3. 运行链
response = rag_chain.invoke({"input": "根据文档,2026年公司的主要战略是什么?"})
print(response["answer"])
Chain 的主要类型
除了 LCEL,LangChain 也保留了更显式的链类型,以应对特定场景。
| 链类型 | 核心原理 | 适用场景 |
|---|---|---|
| LLMChain | 最基础的链,直接将提示模板和语言模型组合。 | 单一的LLM调用任务。 |
| 顺序链 (SequentialChain) | 按固定顺序执行多个链,上一个的输出是下一个的输入。 | 线性、多步骤的任务,如内容提炼、翻译、代码生成流水线。 |
| 路由链 (RouterChain) | 根据输入内容动态选择后续的子链来执行。 | 多领域问答、客户服务分流等需要条件分支的场景。 |
| 检索链 (RetrievalQA) | 先从向量库检索相关文档,再将这些文档作为上下文交给LLM生成答案。 | 构建基于私有数据的问答系统(RAG应用)。 |
| 转换链 (TransformChain) | 用于在链中对数据进行清洗、格式化等预处理或后处理。 | 清洗用户输入、解析LLM的输出为特定格式(如JSON)。 |
Chain 这种模块化设计,可以轻松地构建、调试和维护复杂的 AI 应用。它最大的价值在于,将“模型的强大推理能力”与“具体的业务逻辑”完美地衔接了起来。
如果正在用 LangChain 开发,建议优先使用 LCEL 语法。

1463

被折叠的 条评论
为什么被折叠?



