六个节点、五条边:开始、视频解析、字幕获取、提炼金句、二次创作、结束。 两个插件节点是串联的:解析吐视频 ID,字幕拿 ID 去换字幕。 位置换了就是空参:字幕在前拿不到 ID,两个并行等于白调一次。
上一节定了设计,这一节摆出来。和 9.2 节一样,先摆骨架、先空跑、先校验。 唯一的新东西是插件节点。它的脾气和大模型节点不一样,这一节把差别讲清楚。 六个节点不算多,但这两个插件的位置是整条链的命门——摆错了,后面全白配。
一、六个节点排出来
| 节点 | 类型 | 吐什么 |
|---|---|---|
| 开始 | 开始 | share_text |
| 视频解析 | 插件 | video_id |
| 字幕获取 | 插件 | subtitle |
| 提炼金句 | 大模型 | points |
| 二次创作 | 大模型 | draft |
| 结束 | 结束 | — |
六个节点、五条边,一条直线。这一章没有分支——除了 10.4 节加的那条兜底支路。 为什么不做分支?因为这条链的失败处理放在智能体那一层:链挂掉,智能体用一句话告诉用户。 工作流里加一堆兜底分支,图会变得没人看得懂。 能在外层兜的,别在里层兜。 这是张图的复杂度管理。
二、插件节点和大模型节点的区别
两者都要喂输入,但脾气完全不同:
| 情况 | 大模型节点 | 插件节点 |
|---|---|---|
| 少喂一个变量 | 自己圆场,输出照样有 | 参数为空,接口报错或返空 |
| 字段名写错 | 多半能猜对意思 | 直接取不到,传空串 |
| 上游没产出 | 胡说一段 | 请求失败 |
根子上是因为一个是概率的,一个是确定的。大模型见到残缺输入会补,接口见到残缺参数只会拒绝。
所以插件节点的变量引用要格外小心:{{视频解析.video_id}} 少一个点、多一个空格,都取不到。
而它不报「变量不存在」这种错——它只是传了个空字符串上去,然后接口回你一个空结果。
这就是插件最阴的地方。
三、位置换了会怎样
三种排法,只有一种对:
| 排法 | 结果 |
|---|---|
| 字幕在前、解析在后 | 字幕拿不到 ID,接口 400 或返空 |
| 两个插件并行 | 字幕不等解析,拿到空 ID,白调一次 |
| 解析在前、字幕在后 | 顺序正确 |
第二种最容易被误以为「优化」:两个插件互不依赖,并行不是更快? 它们不是互不依赖,是后一个依赖前一个的产出。 画图时看着像两条平行线,变量引用一拉就现原形。 判断方法很简单:打开后一个节点,看它的输入框里绑的是不是前一个节点的输出。是,就必须在后。
四、先空跑一遍
六个节点的实现全部写成占位,跑一次:六步全走完,五个中间端口吐的都是「待配置」。 校验四项全过:无环、无孤儿、无悬空出口、结束节点一个。 这一步和第 9.2 节完全一样,不重复讲了。差别只在节点数:九个变六个,链路更短,出错的位置更少。
短链路的好处是排错快。 六个节点里坏了,最多往回看五步;二十个节点里坏了,得一段一段二分。
五、动手 Demo:六个节点,两个插件的位置不能换
先列出六个节点和它们吃什么吐什么,再故意换三种排法看结果。 最后空跑一遍,确认六步都通。
f.add(start, parse, subtitle, llm1, llm2, end)
f.link(u's', u'pv').link(u'pv', u'ps') # 解析 -> 字幕,不能反
f.link(u'ps', u'l1').link(u'l1', u'l2').link(u'l2', u'e')
bad = f.check() # 四项:有环 / 孤儿 / 悬空 / 结束节点个数
实跑输出:
--------------------------------------------------------------------
六个节点,两个插件的位置不能换
--------------------------------------------------------------------
① 先把六个节点排出来
--------------------------------------------------------------------
| 节点 | 类型 | 吐什么 | 吃什么 |
|---|---|---|---|
| 开始 | 开始 | share_text | — |
| 视频解析 | 插件 | video_id | share_text |
| 字幕获取 | 插件 | subtitle | video_id |
| 提炼金句 | 大模型 | points | subtitle |
| 二次创作 | 大模型 | draft | points |
| 结束 | 结束 | — | draft |
六个节点、五条边。注意两个插件是串联的:解析吐 video_id,字幕拿 video_id 去换字幕。
② 位置换了会怎样
--------------------------------------------------------------------
| 排法 | 问题 | 结果 |
|---|---|---|
| 字幕在前、解析在后 | 字幕节点拿不到 video_id | 参数为空,接口返回 400 |
| 两个插件并行 | 字幕节点不等解析 | 拿到空 ID,白调一次 |
| 解析在前、字幕在后 | 顺序正确 | 字幕接口拿到 ID,正常返回 |
插件节点不像大模型节点那么宽容:大模型少喂一个变量,它自己会圆场;接口少一个参数,直接报错。
! 插件的连线是有语义的,不是画着玩。 谁吐的字段谁喂给谁,顺序错了就是空参。
③ 空骨架先跑一遍
--------------------------------------------------------------------
存盘校验:四项全过
| 步 | 节点 | 类型 | 输出端口 | 毫秒 |
|---:|---|---|---|---:|
| 1 | 开始 | 开始 | share | 0.0 |
| 2 | 视频解析 | 插件 | id | 0.0 |
| 3 | 字幕获取 | 插件 | text | 0.0 |
| 4 | 提炼金句 | 大模型 | pts | 0.0 |
| 5 | 二次创作 | 大模型 | draft | 0.0 |
| 6 | 结束 | 结束 | out | 0.0 |
六步全走完,五个中间端口吐的都是「待配置」。线路没问题,可以开始填了。
①第一张表六行,第三列是「吐什么」。注意两个插件吐的是 ID 和字幕,不是文章。 ②第二张表三种排法:反了、并行、正确。只有第三种能跑。 ③后面那句讲插件的脾气:大模型少喂变量会圆场,接口少一个参数就报错。 ④第三段空跑:六步全走完,校验四项全过,五个端口吐「待配置」。 ⑤这一步和第 9.2 节一样,只是链路更短——短链路排错快,最多回看五步。
30 秒实验
- 把你的六个节点摆出来,每个只写「吃什么、吐什么」,先别配。
- 把两个插件的位置对调一次,跑一下,看报什么错。记住这个错的样子。
- 数一下你的链有几个节点。超过十个的,看看有没有能合并的。
常见误区
- 「两个插件并行更快。」后一个依赖前一个的产出,并行就是拿空参白调。
- 「插件和插件之间不用管顺序。」连线是有语义的,谁吐的字段喂给谁。
- 「节点越多越灵活。」节点越多排错越慢。六步坏了回看五步,二十步要二分。
自测三问(点开对答案)
1. 六个节点是哪六个? —— 开始、视频解析、字幕获取、提炼金句、二次创作、结束。一条直线,五条边。 2. 两个插件能不能并行? —— 不能。字幕节点要吃解析节点吐的视频 ID,并行就是拿空 ID 去调接口。 3. 插件少喂一个参数会怎样? —— 不报「变量不存在」,只是传空串上去,接口返空或 400。这是插件最阴的地方。骨架通了,下一节把六个节点一个个配起来。这一节最长,也最容易卡住。
- ☐ (本篇完,下一篇 10.3 配置工作流节点)
相关笔记
- 如何使用插件:插件的参数怎么写
- 创建基础工作流:上一个案例的骨架
- 扣子工作流的常见节点:节点类型一览
- 🐦 扣子开发 AI Agent · 索引