42md 知识编排(4):让编排更灵活、更可靠
自己写编排写顺手后,会先后撞上三件事,每件都有一招:同一条流程想换语言,用参数;一步产出多个文件,指定主产物,中间产物也能都留下;以及该养成习惯的一招——跑前先校验、预检,把工具名写错、引用写错这类问题查出来,别跑到一半才炸、白花了钱。
自己写编排写顺手了,你会先后撞上三件事。一件比一件实用,第三件尤其该养成习惯。
一、同一条流程,想换个语言
你写了「外文 PDF 转中文」,过几天又想转英文。总不能复制一份只改一个词。把那个会变的地方声明成参数:
name: pdf2any
params:
- name: lang # 声明一个变量
description: 目标语言
default: 中文 # 不传就用它
steps:
- id: extract
run: acquire
with: ["{{ input }}"]
- id: translate
run: tools.translate
with: ["{{ steps.extract.output }}", "--target", "{{ params.lang }}"]
billed: true
output: "{{ steps.translate.output }}"
运行时用 --set 传值,不传就走默认:
42md recipe run pdf2any 论文.pdf # 默认中文
42md recipe run pdf2any 论文.pdf --set lang=英文 # 这次要英文
一条编排,多种用法。想让某个参数必填,标 required: true,不传就报错。
二、一步产出好几个文件,该传哪个
大多数步骤只产出一个文件,引擎自动认。但偶尔一步会同时产出几个——这时用 produces 指定主产物的扩展名,告诉它把哪个往下传:
- id: extract
run: acquire
with: ["{{ input }}"]
produces: md # 主产物是 .md
还有个相关的:默认情况下编排只把最后一步的产物交给你。但有些流程里,中间产物你也想留——比如「提取英文原文 → 翻译成中文 → 提炼摘要」,原文、译文、摘要三份你可能都要。这时加一句:
deliver: all # 三份产物整目录都交付给你
(内置的 pdf2digest 就是这么做的。)
三、跑之前先自检,别白花钱
这一件,尤其该记住。
编排是按顺序跑的。假设你把 tools.translate 手滑写成了 tools.translater。会怎样?提取照跑、翻译照跑(钱也照花了),跑到那个不存在的工具名才整个炸掉——白等、白花。
42md 让你在开跑前就查一遍。两个命令:
42md recipe validate ~/.42md/recipes/pdf2any.yaml # 校验一份编排文件
42md recipe run pdf2any 论文.pdf --dry-run # 预检:只打印计划,不执行、不扣费
它们会在运行前替你抓出:
- 工具名写错 ——
tools.translater不存在,当场报错,提示你用recipe verbs看有哪些合法动作 - 参数没声明 —— 用了
{{ params.lang }}却忘了在params里声明 - 步骤引用错 —— 引用了一个不存在、或排在后面的步骤产物
--dry-run 还会把整条计划列出来(分几步、哪步花钱),看准了再去掉 --dry-run 真跑。先 validate / dry-run,再 run——这个习惯一养成,自定义编排基本不会在半路翻车,更不会白花一分。
顺带:编排不一定要先存进 ~/.42md/recipes/。手头有一份现成的 YAML 想直接试,42md recipe run -f 文件.yaml 论文.pdf 就跑,从管道喂也行(--recipe -)。这给下一篇「让 AI 生成编排直接跑」留个引子。
知识编排系列
- 第(1)篇:多步流程,一条命令跑完
- 第(2)篇:七个内置编排,开箱即用
- 第(3)篇:写一条自己的编排
- 第(4)篇:让编排更灵活、更可靠(本篇)
- 第(5)篇:一句话,让 AI 生成编排
- 第(6)篇:把编排交给 AI 助手
42md — 你的知识快刀。更快地获取、更深地编译、更好地策展、更强的工具。
活水 AI 实验室(42ailab) — 探索智能边界的 AI 创新实验室,以认知科学为基石,推动 AI 与人类智能的深度融合,真正理解并增强智能 —— 碳基的,也是硅基的。