第 2 章 从提示词到系统

——全书导引

上一章结尾停在一个问号:提示词回涨到七百行之后,路该往哪里走。

但在回答“往哪走”之前,得先回答一个更基础的问题:我现在在哪。 这一章给两把尺子和一张图——量清楚位置,你才知道这本书的二十多章里,哪几章现在就该读,哪几章可以先放着。


一、同一个问题,三种答案

为了说明这种差异,先看三个经过抽象的典型场景。它们都会问出几乎相同的一句话:

“我们这个系统,要不要上状态机?”

而正确答案并不相同。

场景一:工单自动分类。 用户提交一段描述,系统判断它属于哪一类问题,转给对应的处理队列。单轮、无状态、结果可以直接和人工标注比对。困扰是分类准确率上不去,尤其几个相邻类别老是混。

答案是:不要。问题在示例和标签定义上,加状态机只会多出一堆永远停在同一个状态的字段,然后要额外花时间维护它。

场景二:产品知识问答。 接了一个几千篇文档的知识库,用户问什么答什么,偶尔追问两句。困扰是有时候会答出知识库里没有的内容,还有时候把 A 产品的参数安到 B 产品头上。

答案是:还不到时候。这里缺的是证据和引用的约束——回答必须能追溯到具体片段,追溯不到就说不知道。这件事和状态机没关系。

场景三:多轮产品客服。 要持续收集需求和必要信息,判断用户是否需要后续处理,并在条件满足时生成摘要交给后续流程。困扰是“用户明明说过的东西,它过两轮又问一遍”,以及“有时候还没问全就把摘要发出去了”。

答案是:早就该上了,而且这里遇到的每一个问题,都是没有显式状态的直接后果。

同一个问题,三种答案。差别不在于哪一种做法更高级,而在于这三个系统处在不同的位置上

如果没有一把尺子,这种判断只能靠经验,而经验是不可传递的。所以这一章先立尺子。

二、第一把尺子:六级工程成熟度

第一把尺子量的是你的系统已经工程化到了哪一步

表 2-1 提示词系统的六级工程成熟度

级别 名称 它要解决的问题 该升级的信号
L0 自然语言指令 让模型听懂这次要做什么 输出格式不稳,无法被程序消费
L1 结构化提示 让任务、资料、格式互不混淆 规则说清楚了,边界情况仍然判错
L2 示例与推理 用样例和推理方式把规则演给模型看 模型不知道的事、办不了的事开始变成主要瓶颈
L3 上下文与行动 接入检索与工具,让它知道并且能办事 多轮之间开始丢信息、重复索取、流程走错
L4 对话控制 用字段、闸门和阶段管住多轮业务闭环 状态算对但表达失控;确定性规则越堆越多;错误无法分层定位;版本优劣无法验证
L5 系统工程化 拆开职责、立契约、可验证可治理 ——

表 2-1 只回答“问题发展到了哪一级”。图 2-1 再把第二把尺子放进来:上半部分看成熟度,下半部分查责任。两者不是一一对应关系——先判断当前问题处在哪个复杂度阶段,再判断具体故障落在哪项职责。

六级成熟度与九项系统责任

图 2-1 六级成熟度与九项系统责任

先澄清一个容易混淆的地方:这六级描述的不是六种不同的东西,而是同一个东西被工程化的程度。 从写下第一句提示词开始,你就在构造这个系统最初的组成部分。随着任务复杂度上升,原本不存在、或者由模型隐式承担的职责才会逐步出现,并被一个个显式化,再交给合适的承担者。“提示词系统”是对象,L0 到 L5 是这个对象的成熟度。

还有三件事必须说在前面。

第一,级别不是荣誉榜。 L5 不比 L2“高级”,只是更贵——更多的调用、更长的链路、更高的维护成本、更陡的上手曲线。前面那个分类场景如果去做 L4,做出来的不是更好的系统,而是一个更难改的系统。匹配比先进重要。

第二,升级由痛点触发,不由计划触发。 每一级的“该升级的信号”那一列,才是判据。信号没出现就升级,叫过度工程;信号出现了还在原地打补丁,就是上一章那个故事。

第三,级别之间不是台阶而是斜坡。 大多数真实系统同时具备好几级的特征:可能状态管理已经到了 L4,但评测还停在“人工看看”的 L2。这很正常,也正是尺子的用处——它能告诉你哪一段落后了。

所以本书不要求给整个系统打一个唯一等级。这把尺子适合用来判断“我现在面对的主要问题走到了哪一级”,而不是给系统颁一张证书。至于“问题具体出在哪项职责上”,那是第二把尺子的事。

适用边界 这是一个便于判断的经验阶梯,不是任何标准或规范。它对多轮对话类系统最有效;批处理、单轮生成、代码类任务的演化路径与此不同。跳级、停留、局部倒退都可能是合理的。

三、第二把尺子:九项系统责任

第一把尺子量“到了哪一步”,第二把尺子量“系统里有哪些职责”。

这九项职责不是每个系统都必须具备的九个模块,而是一张完整的职责地图。 随着系统进入真实业务并逐渐变复杂,它可能涉及下面九类职责——区别在于:有些还不存在,有些隐含在提示词里,有些已经被显式实现。

表 2-2 参考架构的九项系统责任

负责什么 这一层出问题时的典型表现
任务层 这次要做什么、什么算做对 答非所问、格式无法解析
上下文层 这一轮模型该看见什么 该看的没看见、不该看的干扰了判断
证据层 哪些信息有依据、来自哪里、可信到什么程度 编造事实、张冠李戴、引用不可追溯
状态层 当前哪些事实仍然有效 重复追问、旧值污染、用户改口后不生效
控制层 此刻允许做什么、应该做什么 条件没满足就推进、该推进时卡住
行动层 调用外部世界并拿回真实结果 声称已完成而实际没有发生
表达层 把决定好的事说成人话 话术改掉了业务决策、一轮问了三个问题
验证层 发出去之前再检查一遍 明显违规的内容直接送到用户面前
治理层 版本、评测、可观测、规则生命周期 无法证明新版更好、出了问题定位不到

这张表最有用的不是左边,是右边那一列。当线上出现某种症状时,它直接告诉你该去哪一层找问题——这就是第 20 章“失败定位”的雏形。

所以在一个 L1 系统里,这九项职责可能全部由同一段提示词兼任,其中好几项还是空的——没有工具就没有行动责任,没有回归集就没有治理责任。某项职责是否存在,和它是否被显式实现,是两回事。

四、把两把尺子叠起来

把成熟度和职责层放在一起看,会出现这本书最重要的一个观察。

表 2-3 成熟度升级与职责显式化

级别 新出现或被显式化的职责 主要由谁承担
L0 任务层 提示词
L1 任务层(显式化)、表达层雏形 提示词
L2 上下文层(示例即上下文) 提示词
L3 证据层、行动层 提示词 + 检索/工具
L4 状态层、控制层 提示词为主,代码开始介入
L5 验证层、治理层;状态层与控制层中的确定性逻辑逐步外置 确定性部分归代码,语义与表达归模型

看最后一行。L4 到 L5 描述的是一种目标分工,不是贯穿案例已经发生的历史。从 L4 继续工程化时,新增的职责其实不多,主要变化是重新安排承担者:状态怎么合并、什么时候允许做什么、字段格式是否合法、问过几次,这些确定性工作在具备应用层条件时,应逐步交给代码、存储或工作流中的确定性节点;模型更多负责语义理解、模糊判断和语言表达。

注意搬走的是确定性的那部分,不是整层。即使在 L5 系统里,从用户那句话里认出“他在改口”、判断两句话是不是同一个需求、给工具生成合适的参数,仍然是模型的工作。

生产观察 这解释了上一章那个问号。两千两百行的时候,项目是在用 L2 的手法(改措辞、加禁令)解决 L4 的问题(状态与控制);一百七十五行是把 L4 的核心骨架在提示词内部显式化了;而回涨到七百行说明,只要状态与控制的权威执行仍然依赖模型理解提示词,复杂度就会持续累积。贯穿案例真实完成的是这一步,还没有把这些职责整体迁入外部代码和存储。L5 描述的是下一阶段的工程方向,不是本项目已经完成的生产事实。

所以这本书的书名不是修辞。从提示词到系统,不是把提示词写得更长,也不是给它换一个更大的名字,而是先把原本混在一段文字里的职责分开,再根据风险、成本和平台条件,把确定性的职责交给更合适的承担者。

两把尺子的分工到这里也清楚了:六级回答“我现在面对的是哪一阶段的问题”,九项职责回答“问题具体发生在哪项职责上”。 前者决定你该读哪一篇,后者决定你该查哪一章。

这里先堵一个很容易产生的误解:本书后文所说的“交给代码”,并不只指手写程序。 普通代码、规则引擎、数据库约束,以及可视化工作流平台里的确定性节点,都可以承担这些职责。

这里区分的不是界面形式,而是每项职责由谁承担——模型理解语义,确定性执行层落实规则,外部事实源提供可核验的结果。至于工作流平台具体该放在哪一格,第 16 章会正面回答。

五、全书的骨架:参考架构

如果把职责搬家之后的系统画出来,就是图 2-2。它是本书第三、四篇的骨架,后面每一章基本都在放大其中的一格。

提示词系统参考架构,工具动作形成观测回流闭环

图 2-2 提示词系统参考架构

为了便于纯文本阅读和复制,下面保留同一架构的文字版:

  ┌───────────────────── Trace 贯穿全链 ─────────────────────┐
  │  成功与失败同等记录——被拦截、被拒绝、没提交,尤其需要留痕  │
  └─────────────────────────────────────────────────────────┘

   输入(用户消息 / 工具回执 / 外部事件)
        ↓
   Evidence   证据:谁说的、原话是什么、什么时候说的
        ↓
   Event      事件:这句话对系统意味着什么(新增/纠正/拒绝/撤回)
        ↓
   Reducer    归并:把事件折叠进已有事实
        ↓
   候选状态    ← 本轮算出来的,尚未生效
        ↓
   Gate       闸门:此刻允许做哪些事
        ↓
   Policy     策略:在允许的事里,这一轮做哪一件
        ↓
   Planned Action 计划动作 ─┬── 对话动作 ──────────────┐
                            └── 工具动作 → 执行 → 回执 ─┘
                              (回执重新变成证据,回到上面)
        ↓
   Renderer   渲染:把决定好的事说成人话
        ↓
   Validate   验证:发出去之前再检查一遍
        ↓
   Commit     提交:候选状态转为已提交状态,消息发出

图中的 Commit 只表示本轮状态与消息的提交;工具已经造成的外部副作用不等价于这里的 Commit——三种“提交”的区别在第 18 章。

为了让母图保持可读,图 2-2 没有把不变量单独画成节点:候选状态形成后先检查状态不变量,计划动作形成后再检查动作不变量;两类检查的具体位置在第 15 章展开。

这一章不解释每一格怎么实现——那是第 10 到第 18 章的事。这里只说明为什么是这个顺序,因为顺序本身就是全书的三条主张:

第一,证据先于状态。 先确定“发生了什么、这条信息来自哪里”,再决定“它对系统意味着什么”。证据不只来自用户,也来自检索结果、工具回执和外部事件。把两件事混在一起,就会出现“模型觉得他大概是想留电话”这种既非事实也非决策的中间产物。

第二,状态先于决策。 先把事实合并完整,再判断该做什么。反过来做——先想好要问什么再回头找理由——就是重复追问的根源。

第三,决策先于表达。 先确定这一轮做哪件事,再考虑怎么说得自然。让话术层有权改动决策,是“状态算对了但话说错了”的一个常见根源。

这三条会在后面反复出现。你可以把它们当作本书的三条红线。

适用边界 完整实现这条链是有成本的:更多的调用、更多的代码、更长的链路。第 5 章会给一棵判断树,帮你决定应该在哪一格停下——大多数系统不需要走完全程,走完全程的系统也不是一开始就走完的。

六、术语约定

在讲机制之前,需要先约定几个词。

这不是形式主义。在一个团队里,三个人说“状态”时很可能指着三样东西——一个指对话历史,一个指用户填过的字段,一个指流程走到了哪一步。词不统一,讨论就是各说各话。

本书全程使用下面这套词。完整定义见附录 A,这里先给最小可读集合:

表 2-4 核心术语的最小定义

术语 在本书中的含义
提示词 一次调用中提供给模型的指令与材料
提示词系统 提示词、状态、控制、验证与提交共同构成的运行时系统
证据 有出处、可追溯的原始信息(谁说的、原话、何时)
事件 证据对系统状态的影响(新增/纠正/拒绝/撤回/新范围)
归并 把事件折叠进已有事实的过程
候选状态 本轮算出、尚未提交的状态
已提交状态 通过验证并生效的权威状态
闸门 判断“此刻允许做什么”的唯一判定点
策略 在允许的动作中选出这一轮唯一要做的那件
渲染 把已批准的动作变成自然语言
验证 发出前的最后一道检查
追踪 一轮执行的完整记录,可回放

其中最需要提前说清的是字段状态。本书里,一个字段不只有值,还有状态;而且“字段现在是什么状况”与“系统对它做过什么”分属两组,不能混:

状态(互斥,七选一)
  未知 / 有效 / 无效 / 已拒绝 / 冲突 / 已过期 / 已撤回

元数据(与状态正交)
  问过几次、上次何时问、是否经用户二次确认、证据来源、适用范围

为什么必须分开:一个用户可能“被问过而且拒绝了”。如果把“问过”塞进状态枚举,这种再普通不过的情况就无法表达。这是第 10 章的核心论点,也是很多系统重复追问的真正原因。

七、怎么用这本书

先量位置,再决定读法。 这是这一章存在的全部理由。

  • 如果你在 L0–L2:从第一篇读起,重点是第 5 章——它会告诉你,你可能根本不需要往下走。分类器、抽取器、单轮生成类任务,做扎实 L2 就够了。
  • 如果你在 L3:第二篇是你的主场。检索接了、工具接了,问题多半出在证据和行动的边界上——什么是证据、什么是指令、模型能不能宣称一件事已经完成。
  • 如果你在 L4:直接进第三篇。你的症状(重复追问、提前推进、状态对话术错)在第 10 到第 15 章逐个对应。
  • 如果你在 L4 但提示词正在回涨:先读第 16 章,再回到第三篇。这是上一章那个系统的处境。
  • 如果你负责安全或合规评审:可以先读第 23 章,把它当作安全复查入口;如果对槽位、闸门、作用域等术语不熟悉,先看本章的职责地图。

关于本书的三个阅读装置,前言已经交代过。这里再把适用边界说清:本书用同一组问题解释 L1–L5,但真实项目可核验的演化停在 L4 的提示词内结构化。 L5 由第 16 章的目标分工、第 24 章的构造走查和配套参考实现来展示。三个停靠点回答的是“什么复杂度已经够用”,不是这个真实项目依次经历的三个生产阶段。

正文按需要使用四种标记:研究支持(有外部研究印证,条件在对应章节说明)、生产观察(来自本书案例系统的实践结论)、适用边界(该结论的失效场景)、时间数据(只用于容易随模型、版本或市场变化的信息,并注明参考时间;原始日期缺失时明确说明)。没有相应类型的信息时,不为了形式完整而强行加框。这些标记用来帮助你区分不同结论的证据强度。

八、回到那个问号

现在可以把上一章的时间线重新读一遍了:

三十几行     L0–L1:能用,也够用
   ↓
2200 行     用 L2 的手法(改措辞、加禁令)解决 L4 的问题
   ↓
175 行       显式字段、唯一闸门、固定主干,进入 L4
   ↓
700+ 行      L4 做对了,但状态与控制仍在提示词里,复杂度继续累积
   ↓
   ?         L5(目标形态):确定性职责逐步迁往代码、存储或工作流节点

那个问号的答案,就是这本书剩下的部分。

但在走向它之前,我想先泼一盆冷水——大多数系统不需要走到 L5,有些甚至不该离开 L2。 判断的方法,是下一篇要讲的第一件事。

读到不对的地方?

勘误、疑问,或者你在自己项目里的验证与反例,都欢迎交流。

微信联系
微信二维码

扫码添加,备注「从提示词到系统」