创建时间: 2026-08-12最后更新: 2026-08-12作者: yangbo(445bdcbd2)
1. 节点编排
上一篇的执行器已经能够依次查询天气、生成清单并验证结果。不过,那段代码仍然更像一个专门解决上海出差问题的异步函数:每一步直接写在函数体里,步骤一多,主流程就会越来越长。
先不考虑「节点」这个词,一段最普通的异步串行代码大致如下:
serial.ts
01const intent = await recognizeIntent(input)02const information = await extractInformation(input, intent)03const gap = await analyzeInformationGap(intent, information)0405if (!gap.readyToPlan) return gap.nextQuestion0607const plan = await makePlan(intent, information)08const weather = await queryWeather(information.destination)09const draft = await generatePackingList({ intent, information, plan, weather })10const result = await validatePackingList(draft, weather)11const reply = await formatReply(result)
它有一个非常清楚的特点:前一个 await 没有结束,下一行就不会开始。因此,数据会按照固定方向从理解需求流向最终回复。
节点编排并没有推翻这种写法。它只是把每个异步步骤变成一个拥有统一输入和输出的「节点」,再把执行顺序交给一个独立的编排器管理。这样,步骤实现和流程控制就不再挤在同一个函数里。
本案例使用 LangChain 的 Runnable API 实现这层编排:RunnableLambda 把普通异步函数包装成节点,RunnableSequence 按顺序连接节点。
节点是什么?
在 LangChain 中,节点不是一个必须继承的特殊类,而是一个遵守统一调用约定的 Runnable。它接收当前的 AgentState,只负责完成一项边界清楚的工作,然后返回需要合并回状态的增量,例如天气节点读取 information.destination 后返回 { weather }。RunnableLambda 可以把普通函数包装成这样的节点,RunnableSequence 再把多个节点按顺序连接起来。
因此,节点描述“做什么”,并规定“下一步交给谁”。
正在加载图示...
订阅后可阅读剩余内容
AI 电子伴侣企业级项目实战
已发布239节计划发布120节目标已完成199%