链 (Chains) 与 LCEL
LangChain 表达式语言 (LCEL) 是一种声明式的方式,用于轻松地将多个组件组合成一条处理链。它是构建 LangChain 应用的现代标准。
什么是 LCEL?
LCEL 使用管道操作符 | 将组件连接起来,类似于 Unix 的管道。
python
chain = prompt | model | output_parser这意味着:
- 用户输入传给
prompt。 prompt的输出传给model。model的输出传给output_parser。- 最终返回解析后的结果。
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 mondeRunnableParallel (并行运行)
有时你需要并行处理多个任务,或者在传递输入的同时保留原始输入。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中文文档