从踩坑到定理(三):架构决策轴——为什么状态会散落、失败靠运气、验收翻车? 📅 发布时间:2026/8/29 6:56:39 👁 浏览次数: 从踩坑到定理三架构决策轴——为什么状态会散落、失败靠运气、验收翻车从踩坑到定理Dify 应用工程的通用理论 · 3/7基于 Dify 1.16.x 69 个实战实验实测2026-08 摘要架构决策没有唯一解但有一条经过验证的优选路径状态最小化 → 失败外置 → 测试分层。三条定理顺序依赖分别回答状态怎么管、失败怎么办、怎么证明它可靠并落地为可直接使用的评审清单。本文要解决的核心痛点工单应用状态散落各处多轮对话后错乱失败路径靠运气线上偶发崩溃验收时「看起来能跑」上线就翻车本文用三条设计法则状态最小化、失败外置、测试分层回答状态怎么管、失败怎么办、怎么证明它可靠。前两个维度都是「约束」平台约束违反必错LLM 行为违反必不稳定。架构决策轴是自由度——平台不规定你怎么做模型也不限制你怎么做。状态存哪、失败怎么处理、验证怎么分层都是我们的选择。自由度的坏消息是没有唯一正确答案方案好坏全看设计功力。好消息是自由度的空间里藏着可复用的设计法则——不是「必须这样」是「这样经过验证更优」。场景做一个企业级工单流转应用用户提交工单 → 状态机流转待处理/处理中/已完成→ 过程中可能失败外部系统不可用、模型超时→ 多轮对话收集信息。如果设计时每个决策都「临时想」会出现什么状态散落在各处有的在会话变量、有的在临时拼的参数里、失败路径靠运气没想过外部系统挂了会怎样、验证靠手工点几遍「看起来能跑」。我们第一版就长这样。直到验收阶段被一连串问题打回状态不一致、失败后重试把数据搞脏、验证漏掉的边界在线上炸了。这版经验直接逼出了这一篇的三条定理。结论架构决策没有唯一解但有一条经过验证的优选路径状态最小化 → 失败外置 → 测试分层。三条定理一条比一条靠后——只有前一条做对了后一条才有意义。定理 3状态最小化——无状态优先状态必须显式化。定理 4失败外置——失败路径是设计出来的不是运行时发现的。定理 5测试分层——节点级形状断言 链路级端到端两种失效模式要两种验证手段。推导链三条定理怎么推出来的定理 3 的推导。LLM 应用里「状态」是最危险的东西它不可复现模型输出是采样、它容易污染跨轮次上下文传染、它难以排查看不到中间值。所以状态越少越好且每一份状态必须显式化——放在看得见、查得到的地方会话变量、外部存储而不是散落在节点参数或隐式上下文里。显式化的标准动作是需要跨运行保存的状态放显式存储如 Dify 的会话变量、外部 KV 容器而不是依赖「这次运行刚好还留着」。状态最小化不是「不用状态」是「每一份状态都有名字、有出处、有生命周期」。定理 4 的推导。LLM 应用的外部依赖多模型 API、知识库、外部系统任何一步都可能失败。失败不是异常是默认情形。如果不设计失败路径失败时应用会怎样报错、卡死、返回垃圾数据——都是运行时才发现。失败外置的意思是在设计期就把「失败时走哪条路」定好——重试、降级、兜底、明确报错每条失败路径都是设计出来的不是撞出来的。EDD 对定理 4失败外置的应对是全流程嵌入的按阶段对应 一、设计期——失败场景先划不是运行时撞 - 边界卡「边界清单带来源」 禁区五问钱/权/数据/嘴/转——「哪些场景会失败、哪些不做」在 TR0 就定死 - 排雷接单评估只读体检检索源当场测 3 个问题看召回——原话「把数据账算在接单前不等到开工后发现数据一塌糊涂」——「数据不可得」这类失败在设计期就发现拒单或加价根本不进运行期 二、执行期——失败响应预案先定 - 介入纪律 ABCA 报错强制介入——失败信号立即升级纠正评估标准重跑不在运行期闷头撞 - 熔断四字段写进每个 MRT 定义max_steps / token_budget / forbidden_actions边界卡投影/ escalate_to_human——「跑飞了怎么办」是执行前定好的不是跑飞了才想 - 失败传播三原则v2.1① 失败分类路由——瞬时错误→重试、业务错误→降级、契约错误→快速失败各走各的路不混② 失败向上冒泡但语义化——主工作流知道哪块失败/为什么/影响什么原始报错不直抛用户 ③ 错误消息当 LLM 自纠错的燃料 - 错误分类桶数据/逻辑/工具/提示四桶 归因三分——失败发生时先判「哪层错」有分类路径可走 三、验证期——失败路径被验证 - 用例三来源「边界禁区 → 负向用例测 AI 不会越界」——失败路径的验证用例在设计时就有来源不是测试时补 - 硬断言可执行禁区触发 / forbidden action 是机器可执行的断言 - TR4 缺陷分级 P0-P3、严重0 才通过——失败后果分级管理不是一把抓 四、沉淀期——失败教训复用 - 跑通记录四要素错了什么/怎么修的→ 错误清单 → TR2 约束 → 下一单复用 - 三道阻尼器——失败认知防扩散成毒资产推测→泛化→固化→复利 一句话对照定理 4 管「应用内部失败路径」——Dify 侧实现是失败契约三件套error_code/error_message/retryableEDD 管「交付过程失败路径」——禁区/熔断/兜底/负向用例。两层同构都在实践「失败路径是设计出来的」——而且 EDD 多了一层失败本身变成资产错误清单进 TR2 复用不只是防御。定理 5 的推导。这来自一个被反复验证的事实节点是局部的、链路是全局的。LLM 节点的非确定性是局部的这个节点输出可能漂移链路的可靠性是全局的数据流跨多个节点某处断裂全链失败。两种失效模式需要两种验证手段节点级验证用形状断言输入输出是否符合契约链路级验证用端到端用例真实业务路径是否通。只用一种验证必然漏掉另一种失效模式。正例实证工单流转应用的完整正确设计按三条定理重做后的工单应用验收一次通过状态最小化工单状态唯一存在会话变量里状态机流转全部用确定性节点实现每步状态迁移有明确的输入输出。多轮对话中状态不丢、不重、不串。提交资料资料不全完成处理外部系统失败待处理处理中已完成降级路径缓存兜底 明确提示失败外置外部系统不可用时走降级路径缓存数据兜底 明确提示模型超时走重试有限次 退避LLM 输出不合法走归一化重试一次 规则兜底。每条失败路径在设计文档里画得清清楚楚上线后没有一条是运行时才发现的新失败路径。测试分层节点级——每个确定性节点配形状断言LLM 节点配输出校验链路级——按业务路径枚举端到端用例提交→流转→完成、提交→外部失败→降级→完成、提交→超时→重试→完成。两层验证覆盖了「节点坏了」和「链路断了」两类问题。反例实证第一版怎么翻的车第一版的三宗罪正好是三条定理的反例反例 1状态最小化状态散落。现象工单状态同时存在会话变量、拼接参数、临时字段里互相不同步多轮对话后状态错乱。根因没做状态设计——「用的时候随手放一个地方」。修复状态收敛到唯一显式存储其余全部删掉。删完状态相关 bug 归零。反例 2失败外置失败路径靠运气。现象外部系统测试时正常上线后偶发不可用应用直接报错卡死用户看到一屏英文错误。根因设计时没想过「外部系统会挂」——失败路径是空的。修复补全降级/重试/兜底路径。之后外部系统故障时应用行为是「设计好的行为」不是「崩溃」。反例 3测试分层验证漏边界。现象验收时手工点了几遍主路径「看起来能跑」上线的第一周链路边界场景半路失败、极端输入连续出问题。根因只做了链路级「能不能跑」没做节点级断言也没按路径枚举用例。修复补节点级形状断言 路径枚举用例。之后边界场景由用例覆盖不再是线上「惊喜」。扩展三条定理怎么落地成评审清单理论要可操作就得能变成评审时的检查项。我们实际用的评审清单就是三条定理的直接展开定理 3状态最小化检查项这份状态必须存在吗——能不能现场算出来能就别存。存在哪——是显式存储会话变量/外部存储还是散落在节点参数里散落的收敛。谁改它——多个节点都能改同一个状态改出冲突谁负责只有一个写入方最稳。定理 4失败外置检查项这个环节可能失败吗——模型调用、外部 API、知识库检索、数据解析四个默认高危点。失败走哪条路——重试降级兜底明确报错必须有设计好的路径不能是「报错就行」。失败路径测试过吗——每条失败路径至少有一个用例不能只测成功路径。定理 5测试分层检查项节点级断言覆盖了哪些节点——确定性节点全覆盖LLM 节点形状断言。链路级用例覆盖了哪些路径——按拓扑枚举主路径、分支、失败路径、边界路径。两层有空白吗——只测链路不测节点节点坏了测不出来、只测节点不测链路链路断了测不出来都是空白。清单化的价值在于评审不再靠「感觉对不对」而是逐项过检查点。我们实测过带清单评审比不带清单漏检率显著下降——因为人的记忆会漏清单不会。实践动作设计时三问——「这份状态必须存在吗存在哪谁改它」定理 3「这个环节可能失败吗失败走哪条路」定理 4「这条链路的失效模式是局部的还是全局的」定理 5。评审时检查状态是否有唯一显式存储检查每个外部依赖是否有设计过的失败路径检查用例是否同时覆盖节点级与链路级。排障时状态错乱先查「状态是不是散落了」偶发失败先查「失败路径设计了没」验证漏网先查「用例分层全不全」。边界与版本版本无关三条定理是 LLM 应用的普遍设计法则与平台无关。Dify 只是实现它们的载体之一。边界说明定理 4 的验证覆盖了模型超时、外部 API 不可用、LLM 输出不合法三类失败其他失败类型如平台自身故障、数据源损坏按同样方法设计但具体路径未全部实测。收尾三条定理合起来回答了架构决策轴的核心问题状态怎么管、失败怎么办、怎么证明它可靠。它们之间是顺序依赖——状态最小化让失败路径简单状态少失败面小失败外置让链路可控每条路都有设计测试分层让这一切可证明两层验证全覆盖。下一篇从踩坑到定理四数据/记忆轴——为什么页面能搜到、工作流里却召回失败这是四个维度里坑源最密集的一个RAG 的检索质量、知识新鲜度、query 归一化每一个都是「看起来简单做起来全是坑」。讨论区你的应用里状态散落过吗失败路径是设计出来的还是线上撞出来的验收时有没有「看起来能跑、交付就翻车」评论区聊聊你的架构决策故事。如果觉得有收获欢迎点赞 收藏 关注这是激励我更新这个硬核系列的最大动力。本文基于真实项目交付经验撰写Dify 1.16.x 环境、69 个实验与验收记录。文中数据均来自我们自己的实测记录理论部分以「已验证 / 推断待验证」标注边界。