Skip to content

26. LCEL 的 | 管道符背后是什么原理? ​

难度 P1 高频 · 岗位 应用 · 频率 ★★★ · 预计阅读 5 min

本题阅读地图 ​

  1. 💡 简要回答
  2. 📝 详细解析
  3. 🎯 面试总结

👔面试官:LCEL 的 | 管道符背后是什么原理?

🙋‍♂️我:就是链式调用,把前一个的输出传给下一个。

👔面试官:不只是传递,而是Runnable 协议的实现。每个组件实现 invoke 方法,| 操作符重载为组合两个 Runnable。你能讲清楚内部机制吗?

🙋‍♂️我:就是重载了 __or__ 方法?

👔面试官:对,但还有:延迟执行、类型传递、异步支持。而且 | 组合后是新的 Runnable,可以继续组合。这是函数式编程的思想。

💡 简要回答 ​

原理:运算符重载 + Runnable 协议。

  1. __or__ 重载:每个组件(Prompt、LLM、Parser)都继承 Runnable,重载 | 操作符
  2. Runnable 协议:定义标准接口 invoke/ainvoke/stream/batch
  3. 延迟执行:a | b 返回新的 Runnable,不立即执行
  4. 类型传递:输入输出类型可追踪

本质:函数式编程的管道模式(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 协议的组合。延迟执行、类型友好、支持异步流式。


章节首页 · ← Q25 · Q27 →

最后更新2026-05-01
难度P1
频率medium
阅读5 min
主题llm
觉得有帮助?把这个链接转给正在求职的朋友 · 用 Ctrl + K 全站搜索其它题