所谓条件路由(Conditional Routing),就是在一条 AI 推理/数据处理流水线里,先依据输入内容、上下文或运行时信号做一次判别,再把请求分发到不同的子流程(链)上执行。本质上是受控的 if/else:先“判别”,再“选择”,最后“执行”,避免“一个提示词走天下”。
在 LangChain.js 中,常见做法有两种:
- 用
RunnableBranch声明式按顺序匹配分支(可视作 if/else-if/else 的旧范式) - 用
RunnableLambda在函数里动态返回要执行的子链(官方更推荐,灵活且易组合)
路由条件既可以是规则驱动(正则、关键字、用户角色、租户权限、时间段、阈值等),也可以是模型辅助分类(先用轻量 LLM 判断“数学/SQL/闲聊/RAG”等意图);命中失败时应设置兜底分支,保证可用性。
总结一句话:条件路由让系统不再押注单一路径,而是把“该走哪条路”的选择设计为一等公民。
RunnableBranch#
RunnableBranch 是 LangChain.js 中提供的条件分派器。
它把一条流程拆成多条“候选子链”,并附带各自的触发条件,运行时从左到右依次评估条件,命中第一个就执行对应子链,若都不命中则走默认分支。可以把它理解成链式的 if/else if/else。
适用场景
- 意图分流:把“数学问答 / SQL 咨询 / 常规闲聊”分到不同处理链。
- 策略切换:根据上下文选择不同 Prompt / 模型 / 温度 或不同的工具集合。
- 合规与风控:命中敏感词/权限不足 → 分流到“拒答/脱敏/人工审核”链。
- 降本增效:先走便宜路径(检索/小模型),只有命中特定条件才走贵路径(推理型大模型)。
- 容错兜底:为无法归类或条件未命中的情况提供稳定的默认输出链。
基础语法
RunnableBranch 是一个类,因此使用的时候需要实例化:
new RunnableBranch({ branches, default })- branches:对应的类型为
Branch<Runinput, Runoutput>[],其中 Runinput 是条件,Runoutput 是被选中后的子链。 - default:无分支命中时执行的
Runnable<RunInput, RunOutput>
RunnableBranch 还有一个静态方法 RunnableBranch.from([...BranchLike[], defaultRunnableLike]),该方法接受一个数组,数组的前 N 项是 [条件, 子链] 的数组,最后一项是默认子链。
RunnableBranch.from([[条件1, 子链1], [条件2, 子链2], [条件3, 子链3], 默认子链])课堂练习
使用 RunnableBranch 创建子链
RunnableLambda#
不过现在 官方更加推荐使用 RunnableLambda 的方式。因为 RunnableLambda 更灵活,在函数里可以做复杂判别、动态返回任意子链,便于与外部系统结合。
课堂练习
使用 RunnableLambda 重构上面例子