核心要点

  • 流式输出:调用 .stream() / .astream() 逐 token 产出,.astream_events() 还能拿到链内每一步的中间事件

  • 条件分支:RunnableBranch 按一组 (条件函数, 子链) 规则匹配,命中谁走谁,类似 if/elif/else

  • 动态路由:RunnableLambda 根据输入语义/分类「返回」一个 Runnable,由它接管后续执行,实现按问题选链或选检索源

  • 并行执行:RunnableParallel(或字典语法)让多个分支同时跑,结果汇成一个字典

标准回答

流式输出

LCEL 链原生支持流式,无需改造。同步用 for chunk in chain.stream(input) 逐块产出,异步用 async for chunk in chain.astream(input),配合 Web 框架(SSE/WebSocket)即可边生成边推送,显著降低首字延迟、提升体感。若要观测链内部(哪一步开始、检索器返回了什么、token 级输出),用 .astream_events(),它会发出 on_chain_start、on_llm_stream、on_retriever_end 等结构化事件,适合做调试面板或细粒度前端展示。

条件分支:RunnableBranch

当路由规则是明确的布尔条件时用 RunnableBranch,它接收若干 (condition, runnable) 对加一个默认分支,按顺序匹配第一个为真的条件并执行对应子链,语义等价于 if/elif/else。适合「按输入长度、按是否含某关键字、按用户等级」这类规则化分流。

动态路由:RunnableLambda 返回 Runnable

更灵活的做法是用一个自定义函数(包成 RunnableLambda)先对输入做判断——比如调一个轻量分类 LLM 判定问题属于「数学 / 编程 / 闲聊」,或判断该查哪个知识库——然后直接返回对应的 Runnable(链)对象。LCEL 会自动把返回的 Runnable 继续执行下去。这就实现了按语义动态选择不同的子链、不同的 Prompt 或不同的检索源。

并行执行:RunnableParallel

互不依赖的多个分支可用 RunnableParallel 同时跑,例如同时检索多个数据源、或并行让多个模型作答再聚合,结果合并成字典。它能减少串行等待、压缩端到端延迟,常与上面的路由配合:先路由选路,命中分支内部再做并行召回。

常见误区

⚠️ 常见踩坑

把含阻塞 I/O 的普通函数塞进链却仍用同步 .invoke(),流式与并行优势全失;动态路由里在 RunnableLambda 中直接「执行」子链并返回其结果,而非「返回」子链对象,破坏了流式与可组合性;RunnableBranch 忘记给默认分支,未匹配输入直接报错;以为只要用了 LLM 就自动流式,其实要显式调 .stream() 且中间不能有破坏流的聚合步骤。

追问

追问 1RunnableBranch 和用 RunnableLambda 做路由,分别适合什么场景?

RunnableBranch 适合规则清晰、分支固定的情况——条件能用确定的布尔判断写出来(如按关键字、长度、类型),可读性好、声明式。RunnableLambda 返回 Runnable 适合需要「计算后才知道走哪条」的动态场景,比如先调分类模型判定意图、或根据运行时配置/用户画像决定走哪条链、查哪个库。简单固定用 Branch,语义级或运行时决策用 Lambda 路由。

追问 2流式输出时链路中间有非流式步骤(如解析/聚合)会怎样?

流式是逐块向下游传递的,如果中间某步必须拿到完整输入才能产出(如把全部 token 解析成 JSON、或对多路结果做聚合),它会成为「缓冲点」——在此之前的流会被攒齐才往下走,下游就丧失了流式效果。解决办法:尽量把非流式步骤放到链末端、或用支持增量解析的流式 Parser(如 JsonOutputParser 的流式模式),让结构化输出也能边到边解析。

追问 3如何用 .astream_events() 给前端做更丰富的进度展示?

.astream_events() 会输出带 event 类型、name、run_id、data 的结构化事件流。前端可据此做分阶段提示:收到 on_retriever_end 时展示「已检索到 N 篇资料」并附来源;收到 on_chain_start 区分进入了哪个路由分支;on_chat_model_stream 逐 token 渲染答案;on_tool_start/end 显示工具调用进度。按 name/run_id 过滤可只订阅关心的节点,避免事件刷屏,实现类似「思考过程」的透明化体验。

🔗 相似问题

同一考点的不同问法,面试官可能换着问,一起刷更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习