LCEL和Runnable在Langchain 1.2.0中如何?
摘要:LangChain LCEL学习笔记 本来第三章应该学一下Tools和Agent的,后来发现这两个东西是核心,越学东西越多,于是就让G老师帮忙重新列了一下学习路线,按照G老师的路线,这一段应该学习LCEL相关的信息。回归正题,本文将带您深入
LangChain LCEL学习笔记
本来第三章应该学一下Tools和Agent的,后来发现这两个东西是核心,越学东西越多,于是就让G老师帮忙重新列了一下学习路线,按照G老师的路线,这一段应该学习LCEL相关的信息。回归正题,本文将带您深入探索 LCEL 与 Runnable 接口的奥秘。
1. 引言:从“链”说起
1.1 为什么要了解 LCEL?
在 LangChain 的世界里,有一个词贯穿始终——Chain(链)。
想象一下:用户输入一段文字,你需要先做情感分析,再根据情感结果选择不同的回复策略,最后将结果格式化输出。如果不用 LCEL,你可能需要写一堆嵌套函数、回调逻辑,代码像意大利面条一样纠缠不清。
但有了 LCEL,一切变得清晰优雅:
chain = (
sentiment_prompt # 第一步:情感分析
| llm # 第二步:LLM 处理
| output_parser # 第三步:格式化输出
)
这就是 LCEL 的魅力所在——用管道操作符声明式地组合数据流,让复杂的 AI 工作流变得像搭积木一样简单。
1.2 LCEL 的核心优势
LCEL(LangChain Expression Language)不仅仅是一个语法糖,它为 LangChain 带来了质的飞跃:
优势
说明
声明式
用管道操作符清晰表达数据流,阅读代码如读业务流程
组合性
轻松组合提示词、模型、输出解析器构建复杂链
流式支持
原生支持流式输出,用户体验更佳
并行执行
支持批量和并行处理,性能与效率兼得
错误处理
内置错误处理机制,链更健壮
追踪支持
与 LangSmith 无缝集成,调试不再抓狂
2. LCEL 基础:一切的开始
2.1 核心概念:Runnable 接口
LCEL 的核心是 Runnable 接口。你可以把它想象成 LangChain 世界的“统一身份证”——无论是提示词模板、LLM 模型,还是输出解析器,都实现了这个接口。
这意味着它们都有共同的方法:
# 基本调用
chain.invoke(input) # 同步调用
chain.batch(inputs) # 批量调用
chain.stream(input) # 流式调用
# 异步调用
await chain.ainvoke(input) # 异步调用
await chain.abatch(inputs) # 异步批量调用
async for chunk in chain.astream(input): # 异步流式调用
这就是 Runnable 的核心方法三剑客:invoke、batch、stream。无论你组合什么样的链,都用这几种方式调用。
2.2 第一个 LCEL 链
让我们用一个完整的例子来感受 LCEL 的魅力:
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
# 初始化模型
base_url = "https://api.minimax.chat/v1"
api_key = "your-api-key"
model = ChatOpenAI(
model="MiniMax-M2.7",
base_url=base_url,
api_key=api_key,
)
# 构建链
prompt = ChatPromptTemplate.from_template("用{language}翻译:{text}")
output_parser = StrOutputParser()
chain = prompt | model | output_parser
# 调用链
result = chain.invoke({
"language": "中文",
"text": "Hello, World!"
})
print(result) # 你好,世界!
这就是一个完整的 LCEL 链。数据像水流一样经过三个处理单元:prompt → model → output_parser。
