🐦 第10章 实战案例:抖音文案提取与仿写助手
📄 一句话概括

六个节点、五条边:开始、视频解析、字幕获取、提炼金句、二次创作、结束。 两个插件节点是串联的:解析吐视频 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. 把两个插件的位置对调一次,跑一下,看报什么错。记住这个错的样子。
  3. 数一下你的链有几个节点。超过十个的,看看有没有能合并的。

常见误区

  1. 「两个插件并行更快。」后一个依赖前一个的产出,并行就是拿空参白调。
  2. 「插件和插件之间不用管顺序。」连线是有语义的,谁吐的字段喂给谁。
  3. 「节点越多越灵活。」节点越多排错越慢。六步坏了回看五步,二十步要二分。
自测三问(点开对答案) 1. 六个节点是哪六个? —— 开始、视频解析、字幕获取、提炼金句、二次创作、结束。一条直线,五条边。 2. 两个插件能不能并行? —— 不能。字幕节点要吃解析节点吐的视频 ID,并行就是拿空 ID 去调接口。 3. 插件少喂一个参数会怎样? —— 不报「变量不存在」,只是传空串上去,接口返空或 400。这是插件最阴的地方。

骨架通了,下一节把六个节点一个个配起来。这一节最长,也最容易卡住。

相关笔记