学习目标
理解 LangChain 中的 LCEL(LangChain Expression Language)表达式和 Runnable 协议的核心概念。
核心概念
1. Runnable 协议
Runnable 是 LangChain 中的核心接口协议,所有可运行的组件都实现了这个协议。主要方法包括:
invoke(input): 同步调用,传入输入,返回输出batch(inputs): 批量调用stream(): 流式输出
2. LCEL (LangChain Expression Language)
LCEL 是一种声明式的链式调用语法,使用管道操作符 | 将多个组件连接起来,形成处理流程。
示例对比
方式一:手写 Chain 实现(理解原理)
from typing import Any
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 1. 构建组件
prompt = ChatPromptTemplate.from_template("{query}")
llm = ChatOpenAI(model="moonshot-v1-8k")
parser = StrOutputParser()
# 2. 定义链
class Chain:
steps: list = []
def __init__(self, steps: list):
self.steps = steps
def invoke(self, input: Any) -> Any:
for step in self.steps:
input = step.invoke(input)
return input
# 3. 编排链
chain = Chain([prompt, llm, parser])
# 4. 执行
result = chain.invoke({"query": "你好,你是?"})
关键点:
- 手写 Chain 类展示了链的执行原理
- 每个步骤必须实现
invoke方法 - 数据流从前一个组件的输出传递到下一个组件的输入
方式二:LCEL 表达式(推荐使用)
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 1. 构建组件
prompt = ChatPromptTemplate.from_template("{query}")
llm = ChatOpenAI(model="moonshot-v1-8k")
parser = StrOutputParser()
# 2. 使用 LCEL 创建链
chain = prompt | llm | parser
# 3. 调用
result = chain.invoke({"query": "请讲一个程序员的冷笑话"})
关键点:
- 使用
|操作符串联组件 - 简洁、易读、易维护
- 自动处理数据流转
数据流转过程
输入: {"query": "你好"}
↓
Prompt (模板) → "你好"
↓
LLM (模型) → AIMessage(content="我是AI助手...")
↓
Parser (解析器) → "我是AI助手..."
↓
输出: "我是AI助手..."
常见组件
1. Prompt 模板
ChatPromptTemplate.from_template()- 将输入字典转换为提示词
2. LLM 模型
ChatOpenAI- 接收提示词,生成消息
3. Output Parser 解析器
StrOutputParser()- 将 AIMessage 转换为字符串
最佳实践
- 使用 LCEL 语法:简洁且易于维护
- 理解组件职责:每个组件只做一件事
- 注意数据类型:确保上下游组件的输入输出类型匹配
- 调试技巧:可以在链中加入自定义的处理步骤打印中间结果
扩展阅读
- LangChain Runnable 协议文档
- LCEL 高级用法(并行、分支、循环)
- 自定义 Runnable 组件