🐦 第4章 扣子工作流详解
📄 一句话概括

从空画布到一条能跑的链,顺序是:先写六步表、再连、再校验、最后真跑。 六步表不是给别人看的,是给你自己看的——写不出来就别动鼠标。 这一节还看一件真机上看不清的事:分支跳步的时候,被跳过的节点在轨迹里还占一行。

📝 本章和前面几章的关系

前三节讲形状、价值、结构,这一节把三样合起来用一次。 这条链只有六个节点, 但它是第 8 章推文生成器的骨架——后面九个案例没有一个是全新的图,全是这张图加节点。 沙箱里没有画布,所以「连」这一步是用代码连的。 连的逻辑和拖鼠标完全一样:加节点、连边、校验、跑。

一、第一步:先在纸上写六行

打开画布之前,先写一张表:第几步、用什么节点、干什么。六行就够。 演示里那张表是:开始收文章、代码数字数、选择器判长短、大模型压三句、代码抽关键词定分类、 结束交出三样。 写这张表的好处是它逼你面对「这一步到底干什么」。 写不出「干什么」的那一行,就是多余的节点。

表写完再打开画布,顺序就不会乱。反过来先连后想,连到第五个节点就会发现要重来。

二、第二步:连

按表加节点,一个节点一个节点接。接的时候只做一件事:把上游的出参接到下游的入参上。 接不上就是「这一步要吃什么,上一步给不出」。回头改表,别硬接。 演示里那个选择器有两条出边,一条去大模型,一条直接去结束。两条出边都连上,不然平台报悬空出口。

这一处是新手最常漏的:只连了「长」那一条,忘了「短」那一条。运行时短文走不通。

三、第三步:校验,不是可选项

连完点校验。四道检查:有环、孤儿、悬空出口、结束节点个数。 演示里这条链是「校验:通过」。但通过不等于能用——校验只查结构,不查数据。 校验查不出来的三类问题: 引用写错(取到空值)、条件写反(走错分支)、 字段名对不上(下游拼出缺角的句子)。

这三类只能靠真跑发现。所以校验之后一定跟一次真跑,别直接发布。

四、第四步:真跑,看两遍

真跑要跑两遍:一遍走「长」那条分支,一遍走「短」那条。每条分支都要有人走过。 演示里长文那次六个节点全跑;短文那次大模型节点标着「跳过」。 两次的轨迹表一比,分支对不对一眼就看出来。 看轨迹表要盯三列:走了几步、哪一步跳了、每步吐了什么。第三列最有价值——吐出来是空的那一步, 就是引用写错了。

真机上被跳过的节点是变灰,不占一行。轨迹表把它留着,标「跳过」——因为「跳过」本身就是一个信息。

五、第五步:这条链能长成什么

六个节点的链很短,但它已经有了一条完整的骨架:输入、判断、处理、输出。 往里加东西,就是往这四段里塞。要事实,在判断后面塞知识库检索;要排版,在输出前塞卡片; 要抓数据,在输入后塞插件。 第 8 章的推文生成器是它加了热点抓取和配图;第 12 章的海报助手是它加了画板和图像生成。

骨架不变,长出来的都是枝。 这句话是这一章最该带走的一句——学会了画一条六节点的链, 剩下的九个案例都是同一件事。

六、调试的三个习惯

一、逐节点看输出。 别只看最后那句答复。哪一步开始不对,问题就在那一步的前一步。 二、先换成常量试。 某个节点老是取不到值,把它的入参直接写死一个常量,看下游对不对。 对,说明是上游的问题;不对,说明是这一步的问题。 三、一次只改一处。 同时改三处,跑通了也不知道是哪一处的功劳,跑不通也不知道是哪一处的错。

三个习惯都不需要工具,但能省掉一半的调试时间。

七、动手 Demo:从空画布连出一条能用的链

一条文章摘要链:收文章、数字数、判长短、长的摘要、抽关键词定分类、交出三样。 先看六步表,再连起来真跑一次长文,最后换一段短文看分支怎么跳。

f = Flow()
f.add(Node('start', 'start', '开始', lambda g: {'text': ART}, outs=('text',)),
      Node('cnt',  'code',  '代码节点', _count, ins=('text',), outs=('n',)),
      Node('sel',  'select', '选择器', _pick, ins=('n',), outs=('long', 'short')),
      Node('llm',  'llm',   '大模型', _sum,  ins=('text',), outs=('s',)),
      Node('ext',  'code',  '代码节点', _kw, ins=('text',), outs=('kw', 'cat')),
      Node('end',  'end',   '结束', _out, ins=('s', 'kw', 'cat'),
           outs=('s', 'kw', 'cat')))
f.link('start', 'cnt'); f.link('cnt', 'sel')
f.link('sel', 'llm', when='long')      # 长:走摘要
f.link('sel', 'ext', when='short')     # 短:直接抽词
f.link('llm', 'ext'); f.link('ext', 'end')

print(f.check())                       # 四道校验
rec = f.run({})                        # 真跑一次

实跑输出:

--------------------------------------------------------------------
从空画布连出一条能用的链
--------------------------------------------------------------------


  ① 先想要几步
  --------------------------------------------------------------------

| 步 | 节点 | 干什么 |
|---:|---|---|
| 1 | 开始 | 接收一段文章 |
| 2 | 代码节点 | 数字数,判断长不长 |
| 3 | 选择器 | 长的走摘要,短的直通 |
| 4 | 大模型 | 压成三句话 |
| 5 | 代码节点 | 抽关键词、定分类 |
| 6 | 结束 | 三样一起交出 |


  ② 连起来,真跑
  --------------------------------------------------------------------
  校验:通过

| 步 | 节点 | 类型 | 输出端口 | 毫秒 |
|---:|---|---|---|---:|
|  1 | 开始 | 开始 | text | 0.0 |
|  2 | 代码节点 | 代码 | n | 0.0 |
|  3 | 选择器 | 选择器 | (无输出) | 0.0 |
|  4 | 大模型 | 大模型 | s | 0.0 |
|  5 | 代码节点 | 代码 | cat、kw | 0.0 |
|  6 | 结束 | 结束 | cat、kw、s | 0.0 |

  摘要:新版平台下月上线,支持工作流、知识库与多智能体;重点是不写代码也能搭。
  关键词:平台/工作流/知识库;分类:产品发布

  ③ 换一段短文章,看分支怎么走
  --------------------------------------------------------------------

| 步 | 节点 | 类型 | 输出端口 | 毫秒 |
|---:|---|---|---|---:|
|  1 | 开始(短文) | 开始 | text | 0.0 |
|  2 | 代码节点 | 代码 | n | 0.0 |
|  3 | 选择器 | 选择器 | (无输出) | 0.0 |
|  4 | 大模型 | 大模型 | 跳过 | — |
|  5 | 代码节点 | 代码 | cat、kw | 0.0 |
|  6 | 结束 | 结束 | cat、kw、s | 0.0 |

  短文那一路跳过了大模型节点——因为选择器判成「短」,摘要那枝整枝被跳过。
  跳过的节点在轨迹里还占一行,标着「跳过」。真机上你看到的是它变灰。
  ! 这条链五个节点、两条分支,就是第 8 章推文生成器的骨架。
  后面九个案例没有一个是全新的图,全是这张图加节点。

①第一张表只有六行,六行里第三行是「选择器判长短」——整条链的唯一岔口。其余五行都是直线。 ②第二段连完立刻校验,输出「校验:通过」。注意选择器有两条出边,少连一条就报悬空出口。 ③长文那次的轨迹是六步全跑。结束节点吐了三个端口:s、kw、cat——三个端口说明它交出去三样东西。 ④短文那次第五行标着「跳过」。被跳过的节点在轨迹里还占一行,因为「跳过」本身就是信息。 真机上它是变灰。 ⑤最后一句:这条链五个节点、两条分支,就是第 8 章推文生成器的骨架。后面九个案例没有一个是全新的图。

30 秒实验

  1. 把这条六步链自己连一遍(真机或代码都行),然后故意漏一条出边,看校验报什么。
  2. 跑两遍:一遍长文,一遍短文。把两张轨迹表并排放,找出哪一步不同。
  3. 往里塞一个节点:要么在判断后加知识库检索,要么在输出前加卡片。塞完再跑两遍。

常见误区

  1. 「先连起来再说。」连到第五个节点就会发现要重来。先写六行表,两分钟的事。
  2. 「校验通过就能发布。」校验只查结构。引用错、条件反、字段名不对,它一个都查不出。
  3. 「跑通一次就行了。」至少跑两次——每条分支都要有人走过。只跑长文的,短文那路一直坏着。
自测三问(点开对答案) 1. 画图之前先做什么? —— 写一张六行表:第几步、用什么节点、干什么。写不出「干什么」的那行就是多余节点。 2. 校验查不出哪三类问题? —— 引用写错取到空值、条件写反走错分支、字段名对不上。这三类只能靠真跑发现。 3. 为什么要跑两遍? —— 每条分支都要有人走过。只跑一条,另一条可能一直是坏的,而你不知道。

图会画了,下一个问题是:模型凭什么回答关于你公司的问题。 下一章讲知识库——先把「为什么不能只靠模型记忆」这件事算清楚。

相关笔记