Skip to content

链 (Chains) 与 LCEL

LangChain 表达式语言 (LCEL) 是一种声明式的方式,用于轻松地将多个组件组合成一条处理链。它是构建 LangChain 应用的现代标准。

什么是 LCEL?

LCEL 使用管道操作符 | 将组件连接起来,类似于 Unix 的管道。

python
chain = prompt | model | output_parser

这意味着:

  1. 用户输入传给 prompt
  2. prompt 的输出传给 model
  3. model 的输出传给 output_parser
  4. 最终返回解析后的结果。

Runnable 协议

LCEL 中的每个组件(Prompt, Model, Parser, Chain 等)都实现了 Runnable 协议,这意味着它们都支持统一的调用方法:

  • invoke(input): 同步调用,处理单个输入。
  • stream(input): 流式回传结果。
  • batch(inputs): 批量处理输入列表。
  • ainvoke(input): 异步调用。

实战示例

让我们构建一个简单的翻译链。

python
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# 1. 定义组件
prompt = ChatPromptTemplate.from_template("将以下文本翻译成{language}:\n{text}")
model = ChatOpenAI(model="gpt-3.5-turbo")
parser = StrOutputParser()

# 2. 组合链
chain = prompt | model | parser

# 3. 调用
result = chain.invoke({"language": "法语", "text": "你好,世界"})
print(result)
# 输出: Bonjour le monde

RunnableParallel (并行运行)

有时你需要并行处理多个任务,或者在传递输入的同时保留原始输入。RunnableParallel (通常通过字典隐式创建) 可以做到这一点。

python
from langchain_core.runnables import RunnablePassthrough

# 示例:RAG 链中的常见模式
# 这里的 setup_and_retrieval 就是一个并行的 Runnable
# 它可以同时获取检索到的文档 (context) 和用户原始问题 (question)
retrieval_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model
    | parser
)

LCEL 的优势在于它自动支持流式输出和异步调用,非常适合生产环境。


链不仅能串联逻辑,还能串联时间。下一章我们学习如何让 AI 拥有记忆:记忆 (Memory)

LangChain中文文档