跳转到主内容
版本发布

42md 知识编排(4):让编排更灵活、更可靠

自己写编排写顺手后,会先后撞上三件事,每件都有一招:同一条流程想换语言,用参数;一步产出多个文件,指定主产物,中间产物也能都留下;以及该养成习惯的一招——跑前先校验、预检,把工具名写错、引用写错这类问题查出来,别跑到一半才炸、白花了钱。

5 分钟
产品发布知识编排recipe编排写法校验

自己写编排写顺手了,你会先后撞上三件事。一件比一件实用,第三件尤其该养成习惯。

一、同一条流程,想换个语言

你写了「外文 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 生成编排直接跑」留个引子。

知识编排系列


42md — 你的知识快刀。更快地获取、更深地编译、更好地策展、更强的工具。

活水 AI 实验室(42ailab) — 探索智能边界的 AI 创新实验室,以认知科学为基石,推动 AI 与人类智能的深度融合,真正理解并增强智能 —— 碳基的,也是硅基的。

官网https://42md.cc