一个不带显式流程的 LLM 应用,出问题时通常落在四类里:
失控类型 | 现象 | 根因 |
|---|---|---|
跳步 | 该先做规划,模型直接开始写正文 | 没有"当前步骤"这个概念,只有"下一句话" |
隐式状态 | 用户改了前面的设定,后面还在按旧设定走 | 状态只存在对话历史里,不可寻址 |
不可回滚 | 改坏了只能重开一个对话 | 没有检查点 |
不可观测 | 出了问题不知道是哪一步错的 | 没有环节边界,日志是一整条流水 |
这四类问题的共同点:它们都不是模型能力问题,是控制平面缺失。
一个很自然的反例是"那就让模型自己规划步骤"。实践里这条路的失败率很高,因为步骤的合法性是流程知识,不是语义知识——模型知道"接下来该写什么"(语义),但不知道"现在允不允许写"(流程)。
一个够用的流程状态机只需要三件事:
三件事里,只有第三件有难度。 前两件是列表,第三件是产品设计——因为它决定了失败的时候,人是能修,还是只能重试。
注意闸门的返回值。 它必须返回"缺哪个字段",而不是一句"校验未通过"。前者可修,后者只能重试——重试是 LLM 应用里最贵的动作:一次重试是钱,十次重试是人的耐心。
收益 | 具体含义 |
|---|---|
可回滚 | 每个环节有检查点,退回上一环节不等于重跑全书 |
可观测 | 日志按环节切分,能定位"是哪一步产生的错" |
可审计 | 每个环节有明确产出字段,可以逐条比对 |
可分工 | 不同环节可以换模型、换参数、换人,接口不变 |
一本书写到第 80 章才发现第 5 章的人设没定,返工量是 75 章;如果在第 5 章卡住 3 分钟,返工量是 0。
环节 | 产出(这一步要交出什么) | 闸门检查什么 | |
|---|---|---|---|
1 | 构思 | 题材方向、核心设定 | 是否给了"这本书为什么值得读" |
2 | 深化构思 | 故事核四问、因果骨架 | 四问是否各自有答案(不是标签齐全) |
3 | 人物种子 | 人物卡(含能力边界、别名) | 主配角是否都有能力边界 |
4 | 全书规划 | 分卷架构、逐章目录 | 目录是否连续、无缺行 |
5 | 章节框架 | 单章结构、场景、戏眼 | 本章是否指向主线 |
6 | 初稿 | 章节正文(2400–3000 字) | 字数区间、禁忌扫描 |
7 | 审查 | 一致性核查结论 | 是否逐条比对过台账 |
8 | 定稿 | 入库 + 摘要回写 | 摘要字段是否齐全 |
这个表就是状态机的全部。 它的价值不在"分了 8 步",而在每一步都有一个"不满足就不许往下走"的条件。
项 | 值 |
|---|---|
测试时间 | 2026 年 9 月 – 2026 年 10 月 |
模型 | DeepSeek V4.1 Flash(全流程同一模型) |
流程 | 8 环节状态机,每环节等待确认 |
单章目标字数 | 2400–5000 字 |
连续推进 | 260 章 / 70 多万字 |
记录方式 | 每环节落库一次,记录状态、字段、耗时 |
判据(什么算"状态机失效"):
指标 | 值 | 说明 |
|---|---|---|
连续推进 | 260 章 / 70 多万字 | 单部作品 |
越权推进 | 0 次 | 闸门拦截 |
状态丢失 | 0 次(进程重启可恢复) | 状态持久化 |
返修率 | 约 8% | 主要为薄章与场景重复,属质量波动非崩坏 |
单章上下文 | 6–7 万字符 | 不随章数增长 |
人工介入点 | 每环节一次确认;跨卷由系统自动拉起 | 设计如此,不是缺陷 |
免责:以上为内部实测记录,不代表他人复现同样结果。
现象:深化构思要求产出故事核四问(谁被困在两难中 / 被什么逼 / 不得不做什么 / 不做会失去什么)。模型连续 3 次没按字面标签输出,闸门一直拦。
原因:指令只给了语义描述,校验却按字面标签匹配。内容其实写对了,只是没打标签。
处理:补全指令里的字面标签,并改成"只打回第 1 次,第 2 次起放行"。代价:单次多花 3–5 分钟。
教训:闸门的判据必须和生成的指令共用同一套字段名。 判据与指令各写一套词,闸门就会变成噪音源。
现象:全书规划里 330 章的目录缺了第 41–50 章。自愈指令要求"从第 1 章补到本卷末",模型每次补一大片,仍漏那几行,用户点了 3 次。
原因:自愈指令的补全范围过大——让模型"补全整卷",它就会重写整卷,而重写又可能漏别处。
处理:把"缺失行列表"直接传给自愈指令,改成"只补这几行"。兜底方案:目录类字段允许直接从结构化数据生成,不让模型自由输出。
教训:状态机的自愈动作要"最小化"。范围越大的自愈,越像重来一次。
现象:某环节因上游条件反复不满足,流程原地循环,用户没有任何办法往下走。
原因:只设计了"确认"和"重试",没设计"绕过"。状态机一旦没有 escape hatch,就会把一次可恢复的失败变成一次不可恢复的失败。
处理:加了三个键的语义——
教训:状态机不是越严越好,是越"可解释地放宽"越好。 逃生通道要写在设计里,不要等出事再临时开。
不适合:
Q1:状态机和 workflow 引擎(如各类编排框架)是一回事吗? A:形态上像,重点不同。编排框架管"调用顺序与重试",状态机这里管的是**"上一个环节的产出是否满足下一个环节的准入条件"**——后者是业务语义,框架本身不提供。
Q2:为什么不让模型自己判断"现在能不能进入下一步"? A:因为准入判断是确定性的规则,不是语义判断。让模型判,会出现"它觉得可以"的随机性——而这一步错了,后面全是错的。
Q3:状态机不会让整个应用变得很慢吗? A:会,而且这是明码标价的代价。我们的做法是把"慢"放在环节边界上(等人确认),把"快"放在环节内部(连续生成)。如果你的场景不能容忍任何停顿,状态机就不合适。
Q4:环节数量多少合适? A:够用就好。8 个是我们这个场景的数,不是通用答案。判断标准是:每个环节是否有一个独立的、可验收的产出。没有独立产出的环节应该合并。
Q5:状态存在哪里? A:不重要的细节。文件、数据库、对象存储都行。唯一的要求是"进程重启后能恢复当前环节 + 该环节的字段"。我们早期就是文件,够用很久。
Q6:这套东西跟"AI Agent"是什么关系? A:Agent 关注"自主决策下一步做什么",状态机关注"约束它只能做合法的那一步"。两者不冲突——越是自主的 Agent,越需要显式的准入边界,否则它会在错误的方向上高效地跑很远。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。