LangChain:链的定义、类型和使用

链(Chain)是LangChain中将多个组件(如模型、提示模板、工具、其他链等)按特定逻辑顺序连接起来,以完成复杂任务的机制。

LangChain 的名字源自其框架的核心设计思路:用最简单的链(Chain),将为大语言模型开发的各个组件链接起来,以构建复杂的应用程序。

概念与定义

链(Chain)是LangChain中将多个组件(如模型、提示模板、工具、其他链等)按特定逻辑顺序连接起来,以完成复杂任务的机制。

简单来说:

  • 单个组件 = 原子能力(如 LLM、Prompt、工具等)
  • Chain = 将这些原子能力串联起来,完成复杂任务

链就是一系列组件的组合,它将一个复杂任务拆解成多个可执行的步骤,形成一个“流水线”。这个流水线的核心在于:前一个步骤的输出会自动成为下一个步骤的输入,确保数据能够流畅地传递和处理,最终完成一个复杂的任务。

这些组件可以是大语言模型、数据查询模块或者文档处理链。链的设计可以灵活地组合使用各种链组件,形成一个完整的数据处理流程,最终完成一个复杂的任务。

如果说大语言模型是功能强大的“大脑”,那么 LangChain 的链(Chain)就是将这些大脑与“手脚”(外部工具、数据源)连接起来的逻辑神经网络。

比喻理解:想象一条自动化流水线水管系统。每个组件(如模型、数据库查询)像一个“处理站”,链就是连接这些站点的“传送带”或“管道”,它规定了数据从哪里来、经过哪些站、如何加工、最终到哪里去。

核心思想

1
2
输入 → [组件A] → [组件B] → [组件C] → 输出
↑_________链(Chain)_________↑
  • 标准化:复杂流程标准化。
  • 组合: 将原子化的功能模块组合成可执行的工作流。
  • 序列化: 定义了组件的执行顺序和数据流向。
  • 复用: 构建好的链本身可以作为新链的组件,实现模块化开发。

核心特点

特点 说明
顺序执行 组件按定义的顺序依次执行
数据传递 前一个组件的输出可作为后一个组件的输入
统一接口 所有 Chain 都实现 invoke() / run() 等标准方法
可组合性 Chain 可以嵌套 Chain,形成更复杂的工作流
可配置性 支持参数化、回调、内存等高级功能

为什么需要链?

如果没有链,需要手动编写代码来处理每个步骤:调用模型、解析输出、将结果传递给下一个函数、处理错误等。链将这些流程抽象化、标准化,让你能:

  • 专注业务逻辑,而非胶水代码(连接不同部分而手动编写的、重复性的、与核心创意无关的代码)。
  • 轻松实验不同的组件组合。
  • 构建稳定、可维护的AI应用。

链的价值

直接与大型语言模型(LLM)对话时,它像一位“纸上谈兵”的专家,能说会道,但缺乏执行能力。链的价值在于:

  • 任务分解与执行:它能将一个复杂任务(如“写一份市场分析报告”)分解为“联网搜索最新趋势” → “总结关键信息” → “基于信息撰写报告”等一系列可执行的步骤。
  • 状态管理与记忆:它可以在多步调用之间保持上下文和状态。例如,将上一个模型总结出的信息,作为下一个模型进行翻译的输入。
  • 逻辑编排:它能组合 PromptLLMTools(工具)等多种组件,构建出强大的工作流

链的类型

LangChain的链世界丰富多样,为满足不同需求,主要分为以下几类:

类型 核心逻辑 适用场景 关键组件/特点
基础链 最简单的链,将 PromptTemplate 与一个LLM直接组合。 单次文本生成、情感分析、基础问答等一次性任务。 PromptTemplate, LLM, LCEL管道符 `
顺序链 将多个链按固定顺序串联,前一个的输出作为后一个的输入。 多步骤文本处理,如“文章摘要” → “翻译”的流水线。 SimpleSequentialChain(单输入/输出)、SequentialChain(多输入/输出)
路由链 根据输入内容,动态判断并选择最合适的子链来处理。 多领域智能客服(如区分“退货”和“产品咨询”)、智能分发系统。 RouterChain, MultiPromptChain
工具/检索链 将检索器(Retriever)与LLM结合,先搜索再生成答案,或集成外部工具。 RAG应用(如私有知识库问答)、AI Agent的工具调用基础。 RetrievalQA, VectorDBQA, SQLDatabaseChain
高级/特定链 为复杂场景设计的专用链,如带记忆的对话、内容检查等。 客服机器人、内容审核、防幻觉应用等。 ConversationChain, LLMCheckerChain

链的使用

从“经典”到“现代”:随着LangChain的演进,构建链的方式发生了革命性变化。

传统的“链式类”方法

早期的 LangChain 通过特定的类(如 LLMChain, SequentialChain)来构建链。这种方式在代码中显式地定义了每个环节,如下面的“生成笑话”链所示。

1
2
3
4
5
6
7
8
9
10
11
# 经典的LLMChain示例(已不推荐)
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI

llm = OpenAI()
prompt = PromptTemplate.from_template("讲一个关于{topic}的笑话")
chain = LLMChain(llm=llm, prompt=prompt)

result = chain.run(topic="程序员")
print(result)

现代的LCEL声明式方法

现在官方推荐使用LangChain表达式语言(LCEL, LangChain Expression Language)。它使用管道操作符 | 来连接组件,代码更简洁直观。

  • 基础链:直接连接 PromptModel
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from langchain.prompts import PromptTemplate
    from langchain_openai import ChatOpenAI

    prompt = PromptTemplate.from_template("描述一下在{city}的理想一天")
    model = ChatOpenAI(model="gpt-4o-mini")
    chain = prompt | model # 使用 | 将Prompt和Model组合成链

    # 执行链,传入初始输入
    response = chain.invoke({"city": "厦门"})
    print(response.content)
  • 多步骤链:可以将多个 PromptModel 甚至普通Python函数组合起来,形成复杂的工作流。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 用LCEL完成 总结 → 翻译 的两步任务
    from langchain.prompts import PromptTemplate
    from langchain_openai import ChatOpenAI

    summarize_prompt = PromptTemplate.from_template("用中文总结这段文本:\n\n{text}")
    translate_prompt = PromptTemplate.from_template("将以下内容翻译成英文:\n\n{summary}")

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

    summarize_chain = summarize_prompt | model
    translate_chain = translate_prompt | model

    # 组合链,并在中间使用一个lambda函数提取文本内容
    # (lambda x: {"summary": x.content}) 类型转换桥接:提取内容并包装成字典,满足下游的输入格式
    full_chain = summarize_chain | (lambda x: {"summary": x.content}) | translate_chain

    # 执行
    result = full_chain.invoke({"text": "人工智能正在改变世界..."})
    print(result.content)

LCEL的核心优势

LCEL不仅语法更优雅,其底层基于 Runnable 协议的设计也带来了强大功能:

  • 声明式语法:使用 | 管道符连接,让代码直观地反映业务逻辑流,直观易懂。
  • 开箱即用的并行处理RunnableParallel 类能轻松实现任务的并行执行,提升效率。
  • 原生支持批处理和异步batch()abatch() 方法让你轻松处理批量请求或异步调用。
  • 统一接口: 所有链都有 .invoke().ainvoke().stream().batch()方法。
  • 组件化设计:将Python函数用 RunnableLambda 包装后,即可无缝集成到LCEL链中,自由组合。

最佳实践与建议

  • 优先选择LCEL:在新项目中,官方推荐优先使用LCEL语法构建链,以获得更佳的开发体验。
  • 遵循”从简到繁”原则:从一个最简单的 Prompt + Model 链开始,再根据需要逐步增加步骤,这样更容易定位问题。
  • 善用输出解析器:通过 StrOutputParserJsonOutputParser 等解析器,可以让LLM的输出格式更规范,便于后续处理。
  • 优雅处理LLM输出:当需要从一个链的输出中提取特定字段作为下一个链的输入时,使用 RunnableLambda 或自定义函数进行数据清洗,如上面多步骤链示例中提取 x.content 所示。
  • **为链添加”记忆”**:对于需要上下文的对话场景,使用 RunnableWithMessageHistoryConversationChain 类为链添加记忆能力。
  • 理解invoke的输入/输出: 明确你的链需要什么输入变量,它会返回什么。使用chain.input_schemachain.output_schema查看。
  • **善用verbose=True**: 在开发和调试时打开,清晰看到链的每一步执行过程和中间结果。
  • 从用例出发: 不要死记硬背所有链。先想清楚你要做什么(如“文档问答”、“总结网页”、“分析结构化数据”),然后去文档找对应的专用链或组合模式。
  • 查阅官方文档: LangChain的概念指南和“如何使用”是极佳的学习资源,提供了大量链的示例。

总结

LangChain中的链是实现复杂AI应用的基石。从 PromptTemplateLLM 构建基础单元,到通过 LCEL 的 | 管道符串联组件,再到利用并行、批处理等高级功能,链的概念贯穿始终。随着官方推荐的LCEL声明式方法的普及,现代LangChain开发变得更加简洁、强大和灵活。

作者

光星

发布于

2026-04-07

更新于

2026-04-11

许可协议

评论