Appearance
26. LCEL 的 | 管道符背后是什么原理?
难度 P1 高频 · 岗位 应用 · 频率 ★★★ · 预计阅读 5 min
本题阅读地图
- 💡 简要回答
- 📝 详细解析
- 🎯 面试总结
👔面试官:LCEL 的 | 管道符背后是什么原理?
🙋♂️我:就是链式调用,把前一个的输出传给下一个。
👔面试官:不只是传递,而是Runnable 协议的实现。每个组件实现 invoke 方法,| 操作符重载为组合两个 Runnable。你能讲清楚内部机制吗?
🙋♂️我:就是重载了 __or__ 方法?
👔面试官:对,但还有:延迟执行、类型传递、异步支持。而且 | 组合后是新的 Runnable,可以继续组合。这是函数式编程的思想。
💡 简要回答
原理:运算符重载 + Runnable 协议。
__or__重载:每个组件(Prompt、LLM、Parser)都继承Runnable,重载|操作符- Runnable 协议:定义标准接口
invoke/ainvoke/stream/batch - 延迟执行:
a | b返回新的 Runnable,不立即执行 - 类型传递:输入输出类型可追踪
本质:函数式编程的管道模式(Pipeline Pattern)。
📝 详细解析
Runnable 协议
python
class Runnable(ABC):
@abstractmethod
def invoke(self, input: Input) -> Output: ...
async def ainvoke(self, input: Input) -> Output: ...
def stream(self, input: Input) -> Iterator[Output]: ...
def batch(self, inputs: List[Input]) -> List[Output]: ...所有组件(Prompt、ChatModel、OutputParser)都实现这个接口。
运算符重载
python
class Runnable(ABC):
def __or__(self, other: Runnable) -> Runnable:
# 返回新的 RunnableSequence
return RunnableSequence(self, other)组合过程
python
chain = prompt | llm | parser
# 等价于
chain = RunnableSequence(
first=prompt,
middle=[llm],
last=parser
)延迟执行
python
# 定义时不执行
chain = prompt | llm | parser # 只是组合
# 调用时才执行
result = chain.invoke({"question": "..."}) # 真正运行🎯 面试总结
| 是 __or__ 重载,实现 Runnable 协议的组合。延迟执行、类型友好、支持异步流式。