多个技能都要用的那段规矩,别抄进每个技能里,拆成一个独立技能。 拆的判断只有三条:几处都要用、有独立的输入输出、换个场景还成立。 拆完省下 229 token,改一条规则从动三个文件变成动一个——但触发争抢它治不了。
第 4 章写了三个能单独干活的技能,这一章讲它们怎么配合。 配合的第一步不是搭流程,是先看看有没有重复的部分该拆出去。 会议纪要之所以第一个动刀,是因为它的「清洗转写稿」这一段被三个技能共用。
一、为什么先拿纪要开刀
三个技能里,纪要最适合第一个拆。三个原因,都很实际。 它最独立:输入是一份转写稿,输出是一份四段纪要,中间不依赖别的技能。 它格式最固定:四段加一条待办行格式,拆开之后接口不会变。 它的前半段被共用:纪要、访谈、课堂笔记,三份都要先把口语稿洗干净。 第三点是关键。共用就意味着重复,重复就意味着改一处要动三处。 这也是一个通用信号:当你在第二个技能里粘贴同一段规矩时,就该拆了。
二、一段规则抄三遍的代价
先把代价量出来。三个技能各 9 条规矩,其中 6 条是清洗,一字不差。
| 技能 | 规矩条数 | 正文 token |
|---|---|---|
| 会议纪要 | 9 | 199 |
| 访谈整理 | 9 | 198 |
| 课堂笔记 | 9 | 187 |
三份合计 584 token,光清洗那 6 条就占了 429。 429 这个数字单看不吓人,但它是常驻成本之外的重复——每次这三个技能被读到,同一段话都要读一遍。 真正的代价还不是 token,是维护。六条规则改一条,三个文件都得改,漏一个就不一致。 这时候不一致很难被发现:三份技能各自都像对的,只有同时跑三个场景才看得出差别。
三、什么该拆出去:三个判断
不是所有重复都值得拆。三条判断,全中才动手。 一、几处都要用。只有一处用,拆出去反而多一层跳转。 二、有独立的输入输出。清洗的输入是转写稿,输出还是转写稿,边界干净。 三、换个场景还成立。清洗这段在纪要、访谈、课堂三个场景都成立,说明它不是纪要的一部分。 三条里第二条最容易误判。像「把结论段里的模糊词挪进风险」这条,只对纪要有意义。 它没有独立的输入输出,只是纪要格式的一部分,硬拆出去就变成了一个只会干半件事的技能。 判断标准可以压缩成一句:拆出去之后,它自己能不能单独接活。能,就拆。
四、按输入形状切,不按用途切
切法有讲究。按「用途」切会切出一堆碎技能,按「输入形状」切才对。 按用途切:切出「洗口头语」「合并发言」「统一标点」三个技能。 这三个技能的输入都是同一份转写稿,输出也是同一份转写稿——它们本来就该是一件事。 按输入形状切:切出「清洗口语转写稿」一个技能,输入转写稿,输出干净的转写稿。 判断依据是:输入和输出同类型的一串动作,属于同一个技能。 这条规则能挡掉大部分过度拆分。拆得太碎,编排成本会超过省下来的那点重复。
五、拆完的两个后果
拆成「一份清洗技能 + 三份瘦技能」之后,效果是能算的。
| 版本 | 合计 token | 改一条清洗规则要动几个文件 |
|---|---|---|
| 绑死版 | 584 | 3 |
| 拆开版 | 355 | 1 |
少 229 token,改一处从三个文件变成一个。规则越多,这个差距越大。 第二个后果要说清楚:拆开只解决复用,不解决「请求该找谁」。 三个瘦技能的描述一个字没改,拿同一个请求去测,契合度还是 0.750、0.583、0.583——跟绑死版一模一样。 因为让它们打架的不是正文,是描述。正文变短了,描述里那句「整理成纪要」还在。
六、两个技能怎么搭配
拆完之后,两个技能要连着用。衔接处只需要一句话。 瘦技能的正文第一行写:「先跑 clean-transcript 技能清洗转写稿。」 这一行有两个作用:告诉读的人顺序,也告诉模型这一步不用自己重做。 搭配的关键是上一步的产出形状正好是下一步的输入形状。清洗输出转写稿,纪要输入转写稿,正好接上。 接不上的时候不要硬接,中间加一步转换,或者改其中一边的输出格式。 这条原则在第 4 章的流水线里会再用一次,那时候它叫「接口」。
七、动手 Demo:同一段规则抄三遍,还是拆出来共用一遍
这一段把「三个技能各抄一遍六条清洗规则」和「拆成一份共用技能」两种做法都算一遍。 算三样:正文 token、改一条规则要动几个文件、以及拆分到底有没有治好「请求一来三个都抢」。
CLEAN = ['把「嗯」「那个」这类口头语删掉。',
'同一人连续说的几句合并成一段。', ...] # 六条
OWN = {'会议纪要': [...三条...], '访谈整理': [...], '课堂笔记': [...]}
# 绑死版:六条抄三遍
dead = [(n, tokens(body(CLEAN + o))) for n, o in OWN.items()]
# 拆开版:一份清洗 + 三份瘦技能
thin = [(n, tokens(body(['先跑 clean-transcript 技能。'] + o))) for n, o in OWN.items()]
实跑输出:
--------------------------------------------------------------------
同一段规则抄三遍,还是拆出来共用一遍
--------------------------------------------------------------------
① 三个技能,中间有一段长得一样
--------------------------------------------------------------------
会议纪要、访谈整理、课堂笔记,三份技能都要先清洗口语转写稿。
清洗这件事有六条规矩,三个技能一条不差。
| 技能 | 专属规矩 | 清洗规矩(绑死版) |
|---|---:|---:|
| 会议纪要 | 3 | 6 |
| 访谈整理 | 3 | 6 |
| 课堂笔记 | 3 | 6 |
② 绑死版:六条规则抄三遍
--------------------------------------------------------------------
| 技能 | 规矩条数 | 正文 token |
|---|---:|---:|
| 会议纪要 | 9 | 199 |
| 访谈整理 | 9 | 198 |
| 课堂笔记 | 9 | 187 |
三份正文合计 584 token,其中清洗那六条占了 143。
③ 三份写同一个用途,请求一来三个都抢
--------------------------------------------------------------------
| 技能 | 契合度 |
|---|---:|
| 会议纪要 | 0.750 |
| 访谈整理 | 0.583 |
| 课堂笔记 | 0.583 |
请求:「把这段会议转承稿整理成纪要」
三个技能的描述都写着「整理成纪要」,谁都不比谁更对。
④ 拆开:一份清洗技能,三份瘦技能
--------------------------------------------------------------------
| 技能 | 正文条数 | 正文 token |
|---|---:|---:|
| clean-transcript | 6 | 143 |
| 会议纪要 | 3 | 66 |
| 访谈整理 | 3 | 65 |
| 课堂笔记 | 3 | 54 |
拆开之后合计 355 token,比绑死版少 229。
⑤ 省的不只是字数
--------------------------------------------------------------------
| 版本 | 改一处 | 后果 |
|---|---|---|
| 绑死版 | 改一条清洗规则要动 3 个文件 | 三处都得记得改,漏一处就不一致 |
| 拆开版 | 改一条清洗规则要动 1 个文件 | 改完三处同时生效 |
六条规则,改一条的代价差三倍。规则越多,这个差距越大。
⑥ 拆开只解决复用,不解决抢触发
--------------------------------------------------------------------
| 技能 | 契合度 |
|---|---:|
| 会议纪要 | 0.750 |
| 访谈整理 | 0.583 |
| 课堂笔记 | 0.583 |
跟绑死版一模一样。三个技能的描述一个字没动,只是正文变短了。
说明拆技能解决的是「同一段规则只写一遍」,不解决「请求该找谁」。
! 「该找谁」是 description 的事。第 2 章讲过原理,5.5 拿实测再讲一次。
! 顺带一个好消息:clean-transcript 得 0 分直接出局,它不会去抢纪要的活。
第一段先摆事实:三个技能各 9 条规矩,其中 6 条一字不差。 第二段算绑死版:三份合计 584 token,光清洗那 6 条就占 429。 第三段拿同一个请求去测,三个技能的契合度是 0.750、0.583、0.583——都写着「整理成纪要」, 谁都不比谁更对。 第四段拆开:一份清洗技能 143 token 加三份瘦技能,合计 355,少 229。 第五段比维护代价:改一条清洗规则,绑死版动 3 个文件,拆开版动 1 个。 第六段是这一篇最该记住的一句:拆开只解决复用,不解决抢触发。 三个瘦技能的描述一个字没改,重测还是 0.750、0.583、0.583,跟绑死版一模一样。 好消息是 clean-transcript 得 0 分直接出局,它不会去抢纪要的活。
30 秒实验
- 翻你现有的技能,找出被复制粘贴过两遍以上的那一段。它就是该拆出去的候选。
- 给这个候选做三条判断:几处都用、有独立输入输出、换场景还成立。缺一条就先别拆。
- 拆完之后拿同一个请求测一遍。分数没变是正常的,那说明打架的是描述,不是正文。
常见误区
- 看到重复就拆。只有一处用的规矩拆出去,只多一层跳转,一分钱不省。
- 按用途切。 切出「洗口头语」「合并发言」「统一标点」三个技能,它们的输入输出都是同一份转写稿, 本来就该是一件事。
- 以为拆完就不打架了。拆开治的是复用,抢触发是描述的问题。 三个技能都写「整理成纪要」,分数照样一样高。
自测三问(点开对答案)
1. 该不该把一个能力拆成独立技能,看哪三条? —— 几处都要用、有独立的输入输出、换个场景还成立。三条全中才拆。 2. 为什么按「输入形状」切比按「用途」切好? —— 输入输出同一类型的一串动作本来就是一件事。按用途切会把它们切碎,编排成本超过省下的重复。 3. 拆开之后为什么三个技能的契合度一点没变? —— 因为决定契合度的是 description,不是正文。正文变短了,描述里那句「整理成纪要」还在。下一篇讲配合的三种排法:串联、并联、循环。同样七个动作,排法不同差三轮。
- ☐ (本篇完,下一篇 5.2 三种组合方式)