节点放对了,流程仍可能运行失败。常见原因不是模型能力不足,而是变量选错、数据类型不一致、某条分支没有输出,或者下游读取了已经变化的结构。把每个节点当成一个有明确输入输出的小函数,调试会简单很多。
变量引用要看来源和类型
选择变量时同时确认三件事:它来自哪个节点,字段名称是什么,类型是否符合当前输入。文本、数字、对象、文件和数组不能因为界面都能“选中”就互相替代。
例如文档提取器通常输出文本,参数提取器可能输出多个独立字段,Iteration 输出的是一组结果。下游 LLM 可以读取文本上下文,但 IF/ELSE 比较数字时需要真正的数字类型,不能依赖字符串碰巧看起来像数字。
节点改名不会改变变量含义,但删除字段、调整结构化输出或替换上游节点后,应逐个检查下游引用。不要只看连线仍然存在。
分支结束前先统一结构
同一个 IF/ELSE 的成功分支返回对象,失败分支返回纯文本,下游就很难统一处理。可以让每条分支都生成相同结构:
{
"status": "success | failed",
"message": "面向用户的说明",
"data": null
}
再使用 Variable Aggregator 汇合互斥分支的同类变量。聚合器只负责选择实际运行分支的结果,不负责修复类型差异。若需要把多个并行结果合并成列表或长文本,应使用代码、模板或专门的列表处理。
每个节点只承担一种责任
一个 LLM 节点同时做分类、抽取、检索判断、内容生成和格式化,测试失败时很难知道是哪一步出了问题。把它拆成问题分类器、知识检索、LLM 和模板,虽然节点数量增加,但每一步都能单独观察和替换。
也不要走向另一个极端:简单的两行格式化不需要一个 Code 节点,固定条件不需要 LLM。流程应当以可理解为目标,而不是以节点最少或最多为目标。
从单节点测试开始
调试顺序可以固定下来:
- 使用一份最小、可重复的输入运行流程。
- 查看第一个异常节点的实际输入,而不是只看最终报错。
- 单独运行该节点,检查输出字段、类型和空值。
- 修改后重跑当前节点,再继续下游。
- 最后用成功、失败和边界样本做端到端测试。
接口节点要查看状态码与响应体;知识检索要查看命中的片段;Agent 要查看每次工具调用;LLM 要比较提示词、上下文和结构化输出。缓存的上游变量适合快速调试,但发布前必须重新运行完整流程,避免测试结果依赖旧数据。
发布前做一次连线审计
检查所有入口字段是否被使用、所有分支是否能到达结束节点、所有外部请求是否有失败路线、所有聚合变量是否类型一致、所有输出是否来自当前节点。再用空输入、超长输入、错误文件、接口超时和知识未命中做测试。
工作流的可靠性往往来自这些看似普通的连接。模型可以容忍语言模糊,程序不会替你猜错位的变量;先把数据流接清楚,才有资格讨论提示词效果。