欢迎光临
我们一直在努力

大模型程序性知识--把SOP喂给模型

在这里插入图片描述

目录

  • SOP是企业程序性知识的存款
  • 自然语言SOP的三种歧义
  • 三种喂法:全文、步骤、伪代码
  • 步骤到工具调用的映射
  • 分层SOP与角色裁剪
  • 版本化与回归联动
  • 失败模式:影子流程与过时
  • 总结
  • 外部引用
  • 摘要

    程序性知识回答"怎么做",SOP 与流程图是它最自然的载体。 本文给出一条完整链路:解析、校验、绑定、裁剪、版本化、回归联动。 链路末端守着两种失败模式:影子流程与过时 SOP。

    1. SOP是企业程序性知识的存款

    企业里最常被追问的不是"这是什么",而是"这件事怎么办"。 前者靠陈述性知识,后者靠程序性知识。 程序性知识的沉淀物,几乎每家公司都有,名字叫 SOP。

    1.1 陈述性与程序性:两类知识两种问法

    先用大白话区分:陈述性知识是"知道",程序性知识是"会做"。 知道退款政策有七天无理由,是陈述性知识。 能按顺序把一笔退款走完,是程序性知识。 两类知识的载体、更新方式、喂给模型的方式都不一样。

    维度陈述性知识程序性知识
    回答的问题 是什么、为什么 怎么做、下一步
    典型载体 文档、Wiki、政策文件 SOP、流程图、操作手册
    结构特征 陈述句集合,可打散 有序步骤,拆散即失效
    更新触发 事实变化 流程或工具变化
    喂给模型的方式 检索后放入上下文 按步骤展开为可执行序列
    出错的表现 答错事实 走错分支或漏做步骤

    大模型预训练阶段吸收的主要是陈述性知识。 GPT-3 用约 1750 亿参数证明了这点:海量语料训练后,仅凭少量示例就能答对新任务。 但"会答题"不等于"会办事",办事需要流程,流程不在语料里,在企业文件柜里。 Wikipedia 的 SOP 条目把这类文档定义为帮助业务稳定运转的成文程序。 存款在柜子里不产生利息,知识在档案里不产生执行。

    1.2 三要素:步骤、分支、异常

    判断一份 SOP 好不好,就看三要素齐不齐。 步骤化:明确先做什么后做什么,顺序是信息的一部分。 条件分支:写清何时走哪条路,判断依据必须可观测。 异常处理:写清每一步出错时怎么办,超时、失败、缺材料都要有去处。

    #mermaid-svg-fCVFXnymVdy0z3Xs{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fCVFXnymVdy0z3Xs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fCVFXnymVdy0z3Xs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fCVFXnymVdy0z3Xs .error-icon{fill:#552222;}#mermaid-svg-fCVFXnymVdy0z3Xs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fCVFXnymVdy0z3Xs .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fCVFXnymVdy0z3Xs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fCVFXnymVdy0z3Xs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fCVFXnymVdy0z3Xs .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fCVFXnymVdy0z3Xs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fCVFXnymVdy0z3Xs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fCVFXnymVdy0z3Xs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fCVFXnymVdy0z3Xs .marker.cross{stroke:#333333;}#mermaid-svg-fCVFXnymVdy0z3Xs svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fCVFXnymVdy0z3Xs p{margin:0;}#mermaid-svg-fCVFXnymVdy0z3Xs .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-fCVFXnymVdy0z3Xs .cluster-label text{fill:#333;}#mermaid-svg-fCVFXnymVdy0z3Xs .cluster-label span{color:#333;}#mermaid-svg-fCVFXnymVdy0z3Xs .cluster-label span p{background-color:transparent;}#mermaid-svg-fCVFXnymVdy0z3Xs .label text,#mermaid-svg-fCVFXnymVdy0z3Xs span{fill:#333;color:#333;}#mermaid-svg-fCVFXnymVdy0z3Xs .node rect,#mermaid-svg-fCVFXnymVdy0z3Xs .node circle,#mermaid-svg-fCVFXnymVdy0z3Xs .node ellipse,#mermaid-svg-fCVFXnymVdy0z3Xs .node polygon,#mermaid-svg-fCVFXnymVdy0z3Xs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fCVFXnymVdy0z3Xs .rough-node .label text,#mermaid-svg-fCVFXnymVdy0z3Xs .node .label text,#mermaid-svg-fCVFXnymVdy0z3Xs .image-shape .label,#mermaid-svg-fCVFXnymVdy0z3Xs .icon-shape .label{text-anchor:middle;}#mermaid-svg-fCVFXnymVdy0z3Xs .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fCVFXnymVdy0z3Xs .rough-node .label,#mermaid-svg-fCVFXnymVdy0z3Xs .node .label,#mermaid-svg-fCVFXnymVdy0z3Xs .image-shape .label,#mermaid-svg-fCVFXnymVdy0z3Xs .icon-shape .label{text-align:center;}#mermaid-svg-fCVFXnymVdy0z3Xs .node.clickable{cursor:pointer;}#mermaid-svg-fCVFXnymVdy0z3Xs .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fCVFXnymVdy0z3Xs .arrowheadPath{fill:#333333;}#mermaid-svg-fCVFXnymVdy0z3Xs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fCVFXnymVdy0z3Xs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fCVFXnymVdy0z3Xs .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fCVFXnymVdy0z3Xs .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fCVFXnymVdy0z3Xs .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fCVFXnymVdy0z3Xs .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fCVFXnymVdy0z3Xs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fCVFXnymVdy0z3Xs .cluster text{fill:#333;}#mermaid-svg-fCVFXnymVdy0z3Xs .cluster span{color:#333;}#mermaid-svg-fCVFXnymVdy0z3Xs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fCVFXnymVdy0z3Xs .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fCVFXnymVdy0z3Xs rect.text{fill:none;stroke-width:0;}#mermaid-svg-fCVFXnymVdy0z3Xs .icon-shape,#mermaid-svg-fCVFXnymVdy0z3Xs .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fCVFXnymVdy0z3Xs .icon-shape p,#mermaid-svg-fCVFXnymVdy0z3Xs .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fCVFXnymVdy0z3Xs .icon-shape .label rect,#mermaid-svg-fCVFXnymVdy0z3Xs .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fCVFXnymVdy0z3Xs .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fCVFXnymVdy0z3Xs .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fCVFXnymVdy0z3Xs :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-fCVFXnymVdy0z3Xs .default>*{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-fCVFXnymVdy0z3Xs .default span{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-fCVFXnymVdy0z3Xs .default tspan{fill:#000000!important;}

    SOP 三要素

    步骤化 明确顺序

    条件分支 何时走哪条路

    异常处理 出错怎么办

    模型可依序执行

    模型可判断路由

    模型可兜底恢复

    可执行的程序性知识

    图 1-1 SOP 三要素与可执行性的对应关系

    解读:三要素缺任何一项,SOP 就从"可执行"退化回"可阅读"。 模型拿到只有主干的 SOP,遇到异常只能自由发挥,发挥方向不可控。

    三要素也是后面所有工程环节的地基。 第 2 节讲三要素在自然语言里如何失真,第 3 节讲如何结构化,第 4 节讲如何绑定动作。 校验器、绑定器、裁剪器、diff 工具,全部围绕这三要素展开。

    1.3 从存款到取款:SOP不喂给模型就只是档案

    SOP 的价值不在存,在取。 员工照 SOP 办事,是最原始的取用方式,缺点是慢且不稳定。 新员工对同一步骤的理解常常不同,同一笔单子走出两条路。 把 SOP 喂给模型,是让机器替人守流程:顺序不跳,分支不错,异常不慌。

    这条路已被研究反复验证。 ReAct 论文让模型交替生成思考与动作,证明大模型能按外部流程推进任务。 Toolformer 让约 67 亿参数的模型自学调用 API,论文覆盖约 5 类接口。 AgentTuning 用 AgentInstruct 的约 1800 条轨迹微调模型,任务通过率显著提升。 三条工作合起来指向一个结论:流程加工具,模型就能从答话者变成办事者。 前提只有一个:你交给它的流程本身要站得住。

    工程映射:下一节先给 SOP 做体检,找出自然语言里的三种典型歧义。

    2. 自然语言SOP的三种歧义

    自然语言写 SOP 快,但快有代价。 三种歧义最常见:粒度不一、边界模糊、异常缺失。 每种歧义都会在模型执行时变成具体的错误行为。

    2.1 步骤粒度不一:一步写三件事

    看一句真实风格的 SOP:“登录系统,导出对账单并发给财务主管。” 这一步里藏着三个动作:认证、导出、发送。 人读的时候自动脑补拆分,模型读的时候只看到一个步骤节点。 后果是模型不知道中间何时该调用工具,何时该停下来确认。

    粒度统一的判据很简单:一个步骤,一个可观测结果。 可观测结果指系统返回值、状态变化或人的签收,三者居其一。 "导出对账单"的结果是文件生成,可以单独算一步。 “核对信息"没有可观测产出,就应细化到"核对订单号与金额字段一致”。

    粒度混乱还有个隐蔽来源:不同部门合并各自段落时没人统一粒度。 市场部习惯写粗步骤,财务部习惯写细步骤,合并后一步跨三件事和三步做一件事并存。 治理办法是在 SOP 评审时加一条硬检查:逐步骤数动作动词,超过一个就拆。 第 3 节的解析器会把这个检查自动化。

    2.2 条件边界模糊:原则上与必要时

    条件分支的歧义比粒度更危险,因为它直接决定路由。 典型症状是模糊限定词:“原则上需审批”“必要时上报”“金额较大的需复核”。 "原则上"意味着存在例外,但例外是什么没写。 "必要时"把判断权丢给了执行者,人执行时靠经验,模型执行时靠猜。

    模型在模糊条件下的行为特征是:同一输入,两次运行可能走不同分支。 这不是模型不稳定,是条件本身没有唯一解。 温度参数再低,"必要时"三个字也无法映射成确定的谓词判断。

    修法是把模糊词改写成可计算谓词,改写模板如下。

    模糊写法可计算写法
    金额较大需复核 金额大于 500 元需复核
    原则上需审批 除会员外均需审批
    必要时上报 库存小于 10 时上报
    及时通知 2 小时内通知
    相关部门会签 财务部与法务部会签

    右列的每一条都能翻译成一行判断逻辑,模型执行结果因此可复现。 写可计算谓词的成本是业务方要给出阈值,这笔账省不掉。

    2.3 异常路径缺失:只写主干

    第三种歧义最普遍:SOP 只写顺利路径。 申请、审核、执行、归档,一条直线到底。 真实业务里异常才是常态:接口超时、审批人不在线、金额对不上。 主干之外没有出路时,模型的行为完全取决于预训练里学到的通用习惯。

    #mermaid-svg-5FG1VCL3c4QSDbHY{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5FG1VCL3c4QSDbHY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5FG1VCL3c4QSDbHY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5FG1VCL3c4QSDbHY .error-icon{fill:#552222;}#mermaid-svg-5FG1VCL3c4QSDbHY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5FG1VCL3c4QSDbHY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5FG1VCL3c4QSDbHY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5FG1VCL3c4QSDbHY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5FG1VCL3c4QSDbHY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5FG1VCL3c4QSDbHY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5FG1VCL3c4QSDbHY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5FG1VCL3c4QSDbHY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5FG1VCL3c4QSDbHY .marker.cross{stroke:#333333;}#mermaid-svg-5FG1VCL3c4QSDbHY svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5FG1VCL3c4QSDbHY p{margin:0;}#mermaid-svg-5FG1VCL3c4QSDbHY .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-5FG1VCL3c4QSDbHY .cluster-label text{fill:#333;}#mermaid-svg-5FG1VCL3c4QSDbHY .cluster-label span{color:#333;}#mermaid-svg-5FG1VCL3c4QSDbHY .cluster-label span p{background-color:transparent;}#mermaid-svg-5FG1VCL3c4QSDbHY .label text,#mermaid-svg-5FG1VCL3c4QSDbHY span{fill:#333;color:#333;}#mermaid-svg-5FG1VCL3c4QSDbHY .node rect,#mermaid-svg-5FG1VCL3c4QSDbHY .node circle,#mermaid-svg-5FG1VCL3c4QSDbHY .node ellipse,#mermaid-svg-5FG1VCL3c4QSDbHY .node polygon,#mermaid-svg-5FG1VCL3c4QSDbHY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5FG1VCL3c4QSDbHY .rough-node .label text,#mermaid-svg-5FG1VCL3c4QSDbHY .node .label text,#mermaid-svg-5FG1VCL3c4QSDbHY .image-shape .label,#mermaid-svg-5FG1VCL3c4QSDbHY .icon-shape .label{text-anchor:middle;}#mermaid-svg-5FG1VCL3c4QSDbHY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5FG1VCL3c4QSDbHY .rough-node .label,#mermaid-svg-5FG1VCL3c4QSDbHY .node .label,#mermaid-svg-5FG1VCL3c4QSDbHY .image-shape .label,#mermaid-svg-5FG1VCL3c4QSDbHY .icon-shape .label{text-align:center;}#mermaid-svg-5FG1VCL3c4QSDbHY .node.clickable{cursor:pointer;}#mermaid-svg-5FG1VCL3c4QSDbHY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5FG1VCL3c4QSDbHY .arrowheadPath{fill:#333333;}#mermaid-svg-5FG1VCL3c4QSDbHY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5FG1VCL3c4QSDbHY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5FG1VCL3c4QSDbHY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5FG1VCL3c4QSDbHY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5FG1VCL3c4QSDbHY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5FG1VCL3c4QSDbHY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5FG1VCL3c4QSDbHY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5FG1VCL3c4QSDbHY .cluster text{fill:#333;}#mermaid-svg-5FG1VCL3c4QSDbHY .cluster span{color:#333;}#mermaid-svg-5FG1VCL3c4QSDbHY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5FG1VCL3c4QSDbHY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5FG1VCL3c4QSDbHY rect.text{fill:none;stroke-width:0;}#mermaid-svg-5FG1VCL3c4QSDbHY .icon-shape,#mermaid-svg-5FG1VCL3c4QSDbHY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5FG1VCL3c4QSDbHY .icon-shape p,#mermaid-svg-5FG1VCL3c4QSDbHY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5FG1VCL3c4QSDbHY .icon-shape .label rect,#mermaid-svg-5FG1VCL3c4QSDbHY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5FG1VCL3c4QSDbHY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5FG1VCL3c4QSDbHY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5FG1VCL3c4QSDbHY :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-5FG1VCL3c4QSDbHY .default>*{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-5FG1VCL3c4QSDbHY .default span{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-5FG1VCL3c4QSDbHY .default tspan{fill:#000000!important;}

    金额不超500

    金额超500

    成功

    失败 无定义

    材料缺失 无定义

    退款申请

    审核材料

    金额阈值判断

    直接退款

    主管审批

    执行退款

    接口结果

    通知用户归档

    模型自由发挥

    图 2-1 只有主干的 SOP:虚线处为未定义出口

    解读:图中两条虚线是文档没写的出口,模型在此处进入不可控行为区。 补齐异常路径,就是给每个失败点接一条明确的退路。

    体检可以自动化。下面的校验器逐步骤扫描三要素,输出分级报告。

    # 来源:自实现 / sop_validator.py
    # 校验SOP三要素完整性: 步骤化、条件分支、异常处理
    FUZZY_WORDS = ["原则上", "必要时", "酌情", "相关", "及时"]

    def validate(steps):
    """输入结构化步骤列表, 输出分级问题报告"""
    issues = []
    # 要素一: 步骤化, 检查编号连续与一步多事
    for i, s in enumerate(steps, 1):
    if s["no"] != i:
    issues.append(("WARN", f"步骤{s['no']}编号不连续"))
    if len(s["actions"]) > 1 and "并" in s["text"]:
    issues.append(("WARN", f"步骤{s['no']}疑似一步多事"))
    # 要素二: 条件分支, 命中模糊词即报警
    for s in steps:
    for w in FUZZY_WORDS:
    if w in s["text"]:
    issues.append(("WARN", f"步骤{s['no']}含模糊词 {w}"))
    # 要素三: 异常处理, 全文无异常步骤直接判失败
    if not any(s["is_exception"] for s in steps):
    issues.append(("FAIL", "整份SOP缺少异常处理步骤"))
    return issues

    if __name__ == "__main__":
    # mock: 一份只有主干、且含模糊词的SOP
    mock_steps = [
    {"no": 1, "text": "核对订单并通知财务", "actions": ["核对", "通知"],
    "condition": "", "is_exception": False},
    {"no": 2, "text": "原则上提交主管审批", "actions": ["审批"],
    "condition": "", "is_exception": False},
    {"no": 3, "text": "执行退款", "actions": ["退款"],
    "condition": "", "is_exception": False},
    ]
    for level, msg in validate(mock_steps):
    print(level, msg)
    # 输出: WARN 步骤1疑似一步多事 / WARN 步骤2含模糊词 原则上 / FAIL 缺少异常处理

    代码说明:validate 返回的问题分 WARN 与 FAIL 两级。 WARN 不阻塞发布但要人工复核,FAIL 直接退回改写。 把这段脚本挂进 SOP 评审流,三种歧义就有了机器守门员。

    工程映射:歧义修完,下一步决定以什么形态把 SOP 交给模型。

    3. 三种喂法:全文、步骤、伪代码

    同一份 SOP,有三种喂法:全文粘贴、结构化步骤、伪代码或流程图。 三者在长度、可校验性、写作成本上差异很大。 选错形态,后面所有工程都要多付代价。

    3.1 全文粘贴:注意力被稀释

    最省事的喂法是把 SOP 原文整段塞进提示词。 SOP 越长,关键分支在文中的密度越低。 已有长上下文测试反复观察到同一现象:位于上下文中部的信息,召回明显弱于首尾。 一份 30 页的 SOP,退款条件可能写在第 12 页中部,恰是召回最弱的位置。

    全文粘贴还有第二个代价:格式噪声。 段落里混着背景介绍、历史沿革、组织架构,这些对执行无用,但都占上下文窗口。 模型要在一堆"为什么这么规定"里找"下一步做什么",找错率随长度上升。

    第三个代价是无法做机器检查。 自然语言段落既不能跑校验器,也不能做版本 diff,更不能绑定工具。 全文粘贴适合临时问答,不适合作为生产环境的流程输入。

    3.2 结构化步骤列表:可解析可校验

    第二种喂法是先把 SOP 拆成结构化步骤对象,再交给模型。 每个步骤携带编号、动作、条件、异常标记四类字段。 解析器本身就是第一道工序,代码如下。

    # 来源:自实现 / sop_parser.py
    # 把自然语言SOP文本解析为结构化步骤对象, 供校验与绑定使用
    import re

    # mock: 客服退款SOP原始文本
    SOP_TEXT = """
    1. 接收退款申请并核对订单号
    2. 若金额超过500元则提交主管审批
    3. 审批通过后调用退款接口
    4. 退款失败时转人工处理
    """

    def parse_sop(text):
    """逐行解析, 输出结构化步骤列表"""
    steps = []
    for line in text.strip().splitlines():
    line = line.strip()
    m = re.match(r"^(\\d+)[.、)]?\\s*(.+)$", line)
    if not m:
    continue
    no, body = int(m.group(1)), m.group(2)
    # 提取条件短语: 若或如果引导的分句
    cond = re.search(r"(若|如果)[^,,。]*", body)
    # 提取动作谓词: 预置动词表命中即算
    verbs = [v for v in ["核对", "审批", "调用", "通知", "转人工"] if v in body]
    steps.append({
    "no": no,
    "text": body,
    "condition": cond.group(0) if cond else "",
    "actions": verbs,
    "is_exception": ("失败" in body) or ("异常" in body),
    })
    return steps

    if __name__ == "__main__":
    for s in parse_sop(SOP_TEXT):
    print(s["no"], s["condition"] or "-", s["actions"], s["is_exception"])
    # 输出: 1 – [核对] False / 2 若金额超过500元 [审批] False
    # 3 – [调用] False / 4 – [转人工] True

    代码说明:解析器输出统一 schema 的步骤对象。 第 2 节的校验器、第 4 节的绑定器都直接消费这份输出。 schema 定稳后,SOP 从散文变成数据,机器检查全面可行。

    结构化后的收益立竿见影:能跑三要素校验,能统计步骤数与分支数,能做版本 diff。 模型侧也受益,每步的指令密度一致,注意力不再被背景段落稀释。 代价是初次结构化要花人力,这份成本一次性付出,长期摊薄。

    3.3 伪代码与流程图:最精确但门槛高

    第三种喂法是伪代码或流程图,精确度最高。 伪代码里条件就是布尔表达式,分支就是 if 与 else,没有解释空间。 流程图则把路由关系画成边,路径一目了然。 两者都能无损转成结构化步骤,也可以互相生成。

    # 来源:自实现 / refund_flow_pseudo.py
    # 退款SOP的伪代码形态, 条件全部为可计算谓词
    def refund_flow(order_id, amount):
    if not check_order(order_id): # 步骤1: 核对订单
    return request_material(order_id) # 异常: 缺材料则补交
    if amount > 500: # 步骤2: 条件分支
    approve("主管", order_id) # 人工动作: 审批
    result = call_refund(order_id, amount) # 步骤3: 调用退款接口
    if result == "fail": # 步骤4: 异常处理
    return assign_human(order_id) # 转人工专席
    return notify_user(order_id) # 步骤5: 通知并归档

    代码说明:伪代码每个分支都可执行、可测试。 它同时是文档与测试用例的骨架,双份价值。

    三种形态的对比落在一张表上。

    形态典型长度可解析性注意力利用写作成本适用场景
    全文粘贴 数千至数万字 无 稀释严重 最低 临时问答
    结构化步骤 数十至数百行 可解析可校验 密度均匀 中等 生产执行
    伪代码或流程图 数十行 可直接运行 最高 最高 高频关键流程

    #mermaid-svg-UDrY0gpi0UP3aTly{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UDrY0gpi0UP3aTly .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UDrY0gpi0UP3aTly .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UDrY0gpi0UP3aTly .error-icon{fill:#552222;}#mermaid-svg-UDrY0gpi0UP3aTly .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UDrY0gpi0UP3aTly .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UDrY0gpi0UP3aTly .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UDrY0gpi0UP3aTly .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UDrY0gpi0UP3aTly .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UDrY0gpi0UP3aTly .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UDrY0gpi0UP3aTly .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UDrY0gpi0UP3aTly .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UDrY0gpi0UP3aTly .marker.cross{stroke:#333333;}#mermaid-svg-UDrY0gpi0UP3aTly svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UDrY0gpi0UP3aTly p{margin:0;}#mermaid-svg-UDrY0gpi0UP3aTly .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-UDrY0gpi0UP3aTly .cluster-label text{fill:#333;}#mermaid-svg-UDrY0gpi0UP3aTly .cluster-label span{color:#333;}#mermaid-svg-UDrY0gpi0UP3aTly .cluster-label span p{background-color:transparent;}#mermaid-svg-UDrY0gpi0UP3aTly .label text,#mermaid-svg-UDrY0gpi0UP3aTly span{fill:#333;color:#333;}#mermaid-svg-UDrY0gpi0UP3aTly .node rect,#mermaid-svg-UDrY0gpi0UP3aTly .node circle,#mermaid-svg-UDrY0gpi0UP3aTly .node ellipse,#mermaid-svg-UDrY0gpi0UP3aTly .node polygon,#mermaid-svg-UDrY0gpi0UP3aTly .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UDrY0gpi0UP3aTly .rough-node .label text,#mermaid-svg-UDrY0gpi0UP3aTly .node .label text,#mermaid-svg-UDrY0gpi0UP3aTly .image-shape .label,#mermaid-svg-UDrY0gpi0UP3aTly .icon-shape .label{text-anchor:middle;}#mermaid-svg-UDrY0gpi0UP3aTly .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UDrY0gpi0UP3aTly .rough-node .label,#mermaid-svg-UDrY0gpi0UP3aTly .node .label,#mermaid-svg-UDrY0gpi0UP3aTly .image-shape .label,#mermaid-svg-UDrY0gpi0UP3aTly .icon-shape .label{text-align:center;}#mermaid-svg-UDrY0gpi0UP3aTly .node.clickable{cursor:pointer;}#mermaid-svg-UDrY0gpi0UP3aTly .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UDrY0gpi0UP3aTly .arrowheadPath{fill:#333333;}#mermaid-svg-UDrY0gpi0UP3aTly .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UDrY0gpi0UP3aTly .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UDrY0gpi0UP3aTly .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UDrY0gpi0UP3aTly .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UDrY0gpi0UP3aTly .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UDrY0gpi0UP3aTly .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UDrY0gpi0UP3aTly .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UDrY0gpi0UP3aTly .cluster text{fill:#333;}#mermaid-svg-UDrY0gpi0UP3aTly .cluster span{color:#333;}#mermaid-svg-UDrY0gpi0UP3aTly div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UDrY0gpi0UP3aTly .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UDrY0gpi0UP3aTly rect.text{fill:none;stroke-width:0;}#mermaid-svg-UDrY0gpi0UP3aTly .icon-shape,#mermaid-svg-UDrY0gpi0UP3aTly .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UDrY0gpi0UP3aTly .icon-shape p,#mermaid-svg-UDrY0gpi0UP3aTly .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UDrY0gpi0UP3aTly .icon-shape .label rect,#mermaid-svg-UDrY0gpi0UP3aTly .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UDrY0gpi0UP3aTly .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UDrY0gpi0UP3aTly .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UDrY0gpi0UP3aTly :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-UDrY0gpi0UP3aTly .default>*{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-UDrY0gpi0UP3aTly .default span{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-UDrY0gpi0UP3aTly .default tspan{fill:#000000!important;}

    SOP 原文

    全文粘贴

    结构化步骤列表

    伪代码或流程图

    不可校验 不可diff

    可校验 可绑定 可diff

    进入工具映射环节

    图 3-1 三种喂法的处理路径与后续可工程化程度

    解读:结构化步骤与伪代码最终汇入同一条工程化通道。 全文粘贴是支路,走到提示词就到头了。

    选型经验:高频流程用伪代码,量大面广的常规流程用结构化步骤。 全文粘贴只留给低频长尾场景。

    工程映射:结构化完成后,每个步骤要挂上动作,见下一节。

    4. 步骤到工具调用的映射

    结构化只解决"步骤清楚",不解决"步骤能落地"。 落地的标志是每个步骤绑定一个动作:API 调用或人工动作。 没有绑定的步骤是死文字,模型只能复述,不能执行。

    4.1 绑定表:每个步骤挂一个动作

    绑定器维护一张注册表,把步骤里的动作谓词映射到具体接口或人工节点。 Toolformer 的做法是让模型自学 API 调用,企业场景更倾向显式注册表。 显式注册的好处是可审计:谁在什么条件下能调哪个接口,表上一目了然。

    # 来源:自实现 / step_binder.py
    # 步骤与动作的映射表: api为机器动作, human为人工动作
    REGISTRY = {
    "核对": {"type": "api", "action": "orders.get",
    "params": ["order_id"]},
    "审批": {"type": "human", "action": "approval.create",
    "role": "主管", "sla_hours": 4},
    "调用": {"type": "api", "action": "refund.create",
    "params": ["order_id", "amount"]},
    "转人工": {"type": "human", "action": "ticket.assign",
    "role": "专席", "sla_hours": 1},
    }

    def bind(steps):
    """给每个步骤挂上动作, 返回绑定结果与未绑定清单"""
    unbound = []
    for s in steps:
    hit = next((k for k in REGISTRY if k in s["text"]), None)
    if hit:
    s["binding"] = REGISTRY[hit]
    else:
    s["binding"] = {"type": "unbound", "action": None}
    unbound.append(s["no"])
    return steps, unbound

    if __name__ == "__main__":
    # mock: 复用解析器输出的步骤
    steps = [
    {"no": 1, "text": "核对订单号"},
    {"no": 2, "text": "提交主管审批"},
    {"no": 3, "text": "安抚用户情绪"}, # 故意留一个无绑定步骤
    ]
    _, unbound = bind(steps)
    print("未绑定步骤:", unbound) # 输出: 未绑定步骤 [3]

    代码说明:bind 返回的未绑定清单就是死文字清单。 发布 SOP 前 unbound 必须清零,这是比三要素校验更硬的门槛。

    绑定的粒度要跟接口粒度对齐。 一个步骤绑定一个接口调用最理想,一步绑三个接口说明步骤粒度太粗。 此时应回到第 2 节拆步骤,而不是让模型在一次调用里自己编排。

    4.2 死文字:无绑定步骤的风险

    死文字的危害分两层。 浅层是浪费:模型读了这段话,占上下文但不产生动作。 深层是误导:无绑定的描述常含"妥善处理""尽快响应"类措辞,模型会自行脑补动作。 脑补出来的动作可能调用不存在的接口,或在错误的时机调用正确的接口。

    死文字的三个常见来源要分别对待。 来源一:流程改版后旧描述没删,治理靠版本评审。 来源二:写作者不知道有接口可用,治理靠绑定表与接口目录定期对齐。 来源三:动作确实存在但没有系统化,例如口头请示,治理靠把请示变成工单。

    对账是发现死文字的有效手段:拿系统调用日志反向核对 SOP 步骤。 日志里出现的高频调用若在 SOP 中无对应步骤,说明有影子流程,第 7 节展开。 SOP 中有绑定但日志中从未触发的步骤,则是过时候选,进入第 6 节的版本流程。

    4.3 人工动作也是动作

    绑定不等于自动化,人工动作是合法的一等公民。 审批、复核、签字、现场确认,都是流程中必须由人完成的节点。 区别只在于 type 字段:api 是机器执行,human 是等待特定角色执行。

    人工节点必须带两个附加属性:角色与超时。 角色决定任务派给谁,超时决定等待多久后升级。 没有超时的人工节点是流程黑洞,单据卡住时整条流水线停摆。 上面的注册表里 sla_hours 字段就是为此设的,审批 4 小时、转专席 1 小时。

    #mermaid-svg-v5LRbZyrAexkxCdf{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-v5LRbZyrAexkxCdf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-v5LRbZyrAexkxCdf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-v5LRbZyrAexkxCdf .error-icon{fill:#552222;}#mermaid-svg-v5LRbZyrAexkxCdf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-v5LRbZyrAexkxCdf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-v5LRbZyrAexkxCdf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-v5LRbZyrAexkxCdf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-v5LRbZyrAexkxCdf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-v5LRbZyrAexkxCdf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-v5LRbZyrAexkxCdf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-v5LRbZyrAexkxCdf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-v5LRbZyrAexkxCdf .marker.cross{stroke:#333333;}#mermaid-svg-v5LRbZyrAexkxCdf svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-v5LRbZyrAexkxCdf p{margin:0;}#mermaid-svg-v5LRbZyrAexkxCdf .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-v5LRbZyrAexkxCdf .cluster-label text{fill:#333;}#mermaid-svg-v5LRbZyrAexkxCdf .cluster-label span{color:#333;}#mermaid-svg-v5LRbZyrAexkxCdf .cluster-label span p{background-color:transparent;}#mermaid-svg-v5LRbZyrAexkxCdf .label text,#mermaid-svg-v5LRbZyrAexkxCdf span{fill:#333;color:#333;}#mermaid-svg-v5LRbZyrAexkxCdf .node rect,#mermaid-svg-v5LRbZyrAexkxCdf .node circle,#mermaid-svg-v5LRbZyrAexkxCdf .node ellipse,#mermaid-svg-v5LRbZyrAexkxCdf .node polygon,#mermaid-svg-v5LRbZyrAexkxCdf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-v5LRbZyrAexkxCdf .rough-node .label text,#mermaid-svg-v5LRbZyrAexkxCdf .node .label text,#mermaid-svg-v5LRbZyrAexkxCdf .image-shape .label,#mermaid-svg-v5LRbZyrAexkxCdf .icon-shape .label{text-anchor:middle;}#mermaid-svg-v5LRbZyrAexkxCdf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-v5LRbZyrAexkxCdf .rough-node .label,#mermaid-svg-v5LRbZyrAexkxCdf .node .label,#mermaid-svg-v5LRbZyrAexkxCdf .image-shape .label,#mermaid-svg-v5LRbZyrAexkxCdf .icon-shape .label{text-align:center;}#mermaid-svg-v5LRbZyrAexkxCdf .node.clickable{cursor:pointer;}#mermaid-svg-v5LRbZyrAexkxCdf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-v5LRbZyrAexkxCdf .arrowheadPath{fill:#333333;}#mermaid-svg-v5LRbZyrAexkxCdf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-v5LRbZyrAexkxCdf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-v5LRbZyrAexkxCdf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v5LRbZyrAexkxCdf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-v5LRbZyrAexkxCdf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v5LRbZyrAexkxCdf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-v5LRbZyrAexkxCdf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-v5LRbZyrAexkxCdf .cluster text{fill:#333;}#mermaid-svg-v5LRbZyrAexkxCdf .cluster span{color:#333;}#mermaid-svg-v5LRbZyrAexkxCdf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-v5LRbZyrAexkxCdf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-v5LRbZyrAexkxCdf rect.text{fill:none;stroke-width:0;}#mermaid-svg-v5LRbZyrAexkxCdf .icon-shape,#mermaid-svg-v5LRbZyrAexkxCdf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v5LRbZyrAexkxCdf .icon-shape p,#mermaid-svg-v5LRbZyrAexkxCdf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-v5LRbZyrAexkxCdf .icon-shape .label rect,#mermaid-svg-v5LRbZyrAexkxCdf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v5LRbZyrAexkxCdf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-v5LRbZyrAexkxCdf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-v5LRbZyrAexkxCdf :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-v5LRbZyrAexkxCdf .default>*{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-v5LRbZyrAexkxCdf .default span{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-v5LRbZyrAexkxCdf .default tspan{fill:#000000!important;}

    命中 orders.get

    命中 approval

    命中 ticket.assign

    未命中

    结构化步骤

    动作谓词命中

    api 机器执行

    human 主管执行

    human 专席执行

    unbound 死文字

    写入执行日志

    发布前必须清零

    图 4-1 步骤绑定的四条去向

    解读:前三条去向都汇入执行日志,构成后续对账与回归的数据底座。 unbound 一条是例外,它在发布关口被拦截。

    工程映射:绑定完成后,流程要面对不同读者,引出分层与裁剪。

    5. 分层SOP与角色裁剪

    一份 SOP 服务所有人,结果往往是所有人都不满意看的那份。 客服嫌异常手册太厚,主管嫌细节太碎,专席只要异常部分。 解法是分层维护、按角色裁剪输出。

    5.1 一页纸主流程加异常手册

    分层的标准结构是两层。 上层是主流程,控制在一页纸,经验值是约 10 步以内、只保留主干路径。 下层是异常手册,按异常类型逐条展开,每条写清触发条件、处置动作、升级路径。 两层分开维护,主流程改动频率低,异常手册随故障案例持续增补。

    这个结构对模型同样友好。 执行主干时只加载一页纸主流程,上下文占用小且聚焦。 进入异常分支时再按需检索对应条目,异常手册不必常驻上下文。 检索式加载比全文常驻的召回表现更好,这与第 3 节的喂法结论一致。

    一页纸的约束还有管理价值。 写不进一页,说明流程本身太复杂,或混入了应下沉到异常手册的内容。 主流程超长往往是流程需要重构的信号,而不是纸需要加长的信号。

    5.2 按角色裁剪输出

    裁剪器按角色过滤步骤,输出该角色的视图。 裁剪的依据是每个步骤声明的可见角色,而非全文权限。 同一份底稿,客服版、财务版、主管版内容不同但同源。

    # 来源:自实现 / sop_tailor.py
    # 分层SOP: 主流程与异常手册分开维护, 按角色裁剪输出
    SOP_DB = {
    "main": [
    {"no": 1, "text": "核对订单号与金额", "roles": ["客服", "财务", "主管"]},
    {"no": 2, "text": "金额超500元提交审批", "roles": ["客服", "主管"]},
    {"no": 3, "text": "执行退款并归档", "roles": ["客服", "财务"]},
    ],
    "exceptions": [
    {"no": 1, "text": "接口超时重试一次", "roles": ["客服", "专席"]},
    {"no": 2, "text": "二次失败升级值班经理", "roles": ["专席", "主管"]},
    ],
    }

    def tailor(role, with_exceptions=False):
    """输出该角色可见的主流程, 按需附异常手册"""
    out = [f"{s['no']}. {s['text']}" for s in SOP_DB["main"]
    if role in s["roles"]]
    if with_exceptions:
    out += [f"E{s['no']}. {s['text']}" for s in SOP_DB["exceptions"]
    if role in s["roles"]]
    return out

    if __name__ == "__main__":
    print("客服主流程:", tailor("客服"))
    print("专席完整版:", tailor("专席", with_exceptions=True))
    # 专席只看到异常手册条目, 主流程为空列表

    代码说明:tailor 的关键是裁剪后视图仍然同源自同一份底稿。 改一处底稿,所有角色视图同步更新,不存在多份文档各自漂移。

    角色声明要克制,过度裁剪会切断全局视野。 经验做法是每个角色至少保留主干全貌,再叠加本角色的细粒度步骤。 完全隐藏其他角色的步骤,容易让人工审批者失去判断上下文。

    5.3 裁剪的边界

    裁剪不是删信息,是换视角。 被裁掉的步骤仍在底稿里,仍在执行链路里,只是不进这份视图。 理解这一点后,裁剪可以大胆做,因为信息没有损失,损失的是噪声。

    #mermaid-svg-v18J2HKQf61qBdP8{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-v18J2HKQf61qBdP8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-v18J2HKQf61qBdP8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-v18J2HKQf61qBdP8 .error-icon{fill:#552222;}#mermaid-svg-v18J2HKQf61qBdP8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-v18J2HKQf61qBdP8 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-v18J2HKQf61qBdP8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-v18J2HKQf61qBdP8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-v18J2HKQf61qBdP8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-v18J2HKQf61qBdP8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-v18J2HKQf61qBdP8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-v18J2HKQf61qBdP8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-v18J2HKQf61qBdP8 .marker.cross{stroke:#333333;}#mermaid-svg-v18J2HKQf61qBdP8 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-v18J2HKQf61qBdP8 p{margin:0;}#mermaid-svg-v18J2HKQf61qBdP8 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-v18J2HKQf61qBdP8 .cluster-label text{fill:#333;}#mermaid-svg-v18J2HKQf61qBdP8 .cluster-label span{color:#333;}#mermaid-svg-v18J2HKQf61qBdP8 .cluster-label span p{background-color:transparent;}#mermaid-svg-v18J2HKQf61qBdP8 .label text,#mermaid-svg-v18J2HKQf61qBdP8 span{fill:#333;color:#333;}#mermaid-svg-v18J2HKQf61qBdP8 .node rect,#mermaid-svg-v18J2HKQf61qBdP8 .node circle,#mermaid-svg-v18J2HKQf61qBdP8 .node ellipse,#mermaid-svg-v18J2HKQf61qBdP8 .node polygon,#mermaid-svg-v18J2HKQf61qBdP8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-v18J2HKQf61qBdP8 .rough-node .label text,#mermaid-svg-v18J2HKQf61qBdP8 .node .label text,#mermaid-svg-v18J2HKQf61qBdP8 .image-shape .label,#mermaid-svg-v18J2HKQf61qBdP8 .icon-shape .label{text-anchor:middle;}#mermaid-svg-v18J2HKQf61qBdP8 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-v18J2HKQf61qBdP8 .rough-node .label,#mermaid-svg-v18J2HKQf61qBdP8 .node .label,#mermaid-svg-v18J2HKQf61qBdP8 .image-shape .label,#mermaid-svg-v18J2HKQf61qBdP8 .icon-shape .label{text-align:center;}#mermaid-svg-v18J2HKQf61qBdP8 .node.clickable{cursor:pointer;}#mermaid-svg-v18J2HKQf61qBdP8 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-v18J2HKQf61qBdP8 .arrowheadPath{fill:#333333;}#mermaid-svg-v18J2HKQf61qBdP8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-v18J2HKQf61qBdP8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-v18J2HKQf61qBdP8 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v18J2HKQf61qBdP8 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-v18J2HKQf61qBdP8 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v18J2HKQf61qBdP8 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-v18J2HKQf61qBdP8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-v18J2HKQf61qBdP8 .cluster text{fill:#333;}#mermaid-svg-v18J2HKQf61qBdP8 .cluster span{color:#333;}#mermaid-svg-v18J2HKQf61qBdP8 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-v18J2HKQf61qBdP8 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-v18J2HKQf61qBdP8 rect.text{fill:none;stroke-width:0;}#mermaid-svg-v18J2HKQf61qBdP8 .icon-shape,#mermaid-svg-v18J2HKQf61qBdP8 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v18J2HKQf61qBdP8 .icon-shape p,#mermaid-svg-v18J2HKQf61qBdP8 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-v18J2HKQf61qBdP8 .icon-shape .label rect,#mermaid-svg-v18J2HKQf61qBdP8 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v18J2HKQf61qBdP8 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-v18J2HKQf61qBdP8 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-v18J2HKQf61qBdP8 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-v18J2HKQf61qBdP8 .default>*{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-v18J2HKQf61qBdP8 .default span{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-v18J2HKQf61qBdP8 .default tspan{fill:#000000!important;}

    客服

    主管

    专席

    SOP 底稿 主流程加异常手册

    请求角色

    主流程视图 含本角色步骤

    主流程视图 含审批与升级步骤

    异常手册视图 含处置与升级步骤

    按需加载进模型上下文

    图 5-1 同源底稿按角色出三种视图

    解读:三种视图来自同一份底稿,单一事实源保证一致性。 视图按需加载,兼顾上下文效率与信息完整性。

    裁剪的失败模式也要提防:角色声明长期不更新,人员转岗后视图错配。 治理办法是角色声明跟随权限系统走,季度对齐一次。 裁剪器输出的视图应记录生成时间,供第 7 节的影子流程检测使用。

    工程映射:视图会随流程演进而变化,版本化与回归是下一节主题。

    6. 版本化与回归联动

    SOP 会变:接口升级、政策调整、组织调整都会触发修改。 没有版本化的 SOP,改一次乱一次。 版本化的核心不是存档,是把变更与回归测试绑在一起。

    6.1 变更评审:SOP也是代码

    SOP 改动应走与代码相似的评审流。 提案、评审、发布、归档,四步缺一不可。 评审要核对三件事:改动是否引入新的模糊词,是否产生死文字,是否影响其他角色视图。 第 2 节的校验器与第 4 节的绑定器在此处复用,作为评审的机器前置检查。

    版本号建议采用两段式:主版本表示流程结构调整,次版本表示步骤级修订。 绑定表与 SOP 同版本演进,接口改名必须同步改注册表。 每次发布记录四个字段:版本号、变更步骤号、变更人、生效日期。 这份元数据是回归清单的原料。

    评审最容易漏掉的问题是新旧版本并存。 新版本生效后,旧版本必须从所有裁剪视图与模型上下文模板里移除。 残留的旧版本被执行,就是第 7 节的过时 SOP 失败模式。

    6.2 回归清单:改了SOP就重跑任务

    回归联动的逻辑一句话:改了哪个步骤,就重跑引用该步骤的任务。 任务与步骤的引用关系在实现层就是第 4 节绑定表的倒排索引。 每个任务声明它依赖的步骤号,变更发生时反查受影响任务。

    回归指标用执行通过率,即任务按 SOP 走完全程且结果正确的比例。 AgentTuning 论文的 AgentBench 提供了按任务统计通过率的评测思路,可直接借用。 基线在版本发布前采集,新版 SOP 上线后重跑同一批任务,对比通过率。 通过率下降的版本不许发布,无论文档写得多漂亮。

    #mermaid-svg-MJr7kxQNYWUBxcXC{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MJr7kxQNYWUBxcXC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MJr7kxQNYWUBxcXC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MJr7kxQNYWUBxcXC .error-icon{fill:#552222;}#mermaid-svg-MJr7kxQNYWUBxcXC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MJr7kxQNYWUBxcXC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MJr7kxQNYWUBxcXC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MJr7kxQNYWUBxcXC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MJr7kxQNYWUBxcXC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MJr7kxQNYWUBxcXC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MJr7kxQNYWUBxcXC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MJr7kxQNYWUBxcXC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MJr7kxQNYWUBxcXC .marker.cross{stroke:#333333;}#mermaid-svg-MJr7kxQNYWUBxcXC svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MJr7kxQNYWUBxcXC p{margin:0;}#mermaid-svg-MJr7kxQNYWUBxcXC .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-MJr7kxQNYWUBxcXC .cluster-label text{fill:#333;}#mermaid-svg-MJr7kxQNYWUBxcXC .cluster-label span{color:#333;}#mermaid-svg-MJr7kxQNYWUBxcXC .cluster-label span p{background-color:transparent;}#mermaid-svg-MJr7kxQNYWUBxcXC .label text,#mermaid-svg-MJr7kxQNYWUBxcXC span{fill:#333;color:#333;}#mermaid-svg-MJr7kxQNYWUBxcXC .node rect,#mermaid-svg-MJr7kxQNYWUBxcXC .node circle,#mermaid-svg-MJr7kxQNYWUBxcXC .node ellipse,#mermaid-svg-MJr7kxQNYWUBxcXC .node polygon,#mermaid-svg-MJr7kxQNYWUBxcXC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MJr7kxQNYWUBxcXC .rough-node .label text,#mermaid-svg-MJr7kxQNYWUBxcXC .node .label text,#mermaid-svg-MJr7kxQNYWUBxcXC .image-shape .label,#mermaid-svg-MJr7kxQNYWUBxcXC .icon-shape .label{text-anchor:middle;}#mermaid-svg-MJr7kxQNYWUBxcXC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MJr7kxQNYWUBxcXC .rough-node .label,#mermaid-svg-MJr7kxQNYWUBxcXC .node .label,#mermaid-svg-MJr7kxQNYWUBxcXC .image-shape .label,#mermaid-svg-MJr7kxQNYWUBxcXC .icon-shape .label{text-align:center;}#mermaid-svg-MJr7kxQNYWUBxcXC .node.clickable{cursor:pointer;}#mermaid-svg-MJr7kxQNYWUBxcXC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MJr7kxQNYWUBxcXC .arrowheadPath{fill:#333333;}#mermaid-svg-MJr7kxQNYWUBxcXC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MJr7kxQNYWUBxcXC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MJr7kxQNYWUBxcXC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MJr7kxQNYWUBxcXC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MJr7kxQNYWUBxcXC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MJr7kxQNYWUBxcXC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MJr7kxQNYWUBxcXC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MJr7kxQNYWUBxcXC .cluster text{fill:#333;}#mermaid-svg-MJr7kxQNYWUBxcXC .cluster span{color:#333;}#mermaid-svg-MJr7kxQNYWUBxcXC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MJr7kxQNYWUBxcXC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MJr7kxQNYWUBxcXC rect.text{fill:none;stroke-width:0;}#mermaid-svg-MJr7kxQNYWUBxcXC .icon-shape,#mermaid-svg-MJr7kxQNYWUBxcXC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MJr7kxQNYWUBxcXC .icon-shape p,#mermaid-svg-MJr7kxQNYWUBxcXC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MJr7kxQNYWUBxcXC .icon-shape .label rect,#mermaid-svg-MJr7kxQNYWUBxcXC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MJr7kxQNYWUBxcXC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MJr7kxQNYWUBxcXC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MJr7kxQNYWUBxcXC :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-MJr7kxQNYWUBxcXC .default>*{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-MJr7kxQNYWUBxcXC .default span{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-MJr7kxQNYWUBxcXC .default tspan{fill:#000000!important;}

    不低于

    下降

    SOP 新版本提案

    机器检查 校验器与绑定器

    人工评审

    diff 计算变更步骤

    反查引用任务生成回归清单

    重跑任务统计通过率

    通过率对比基线

    发布并归档旧版

    退回修改

    图 6-1 版本化与回归联动的完整关口

    解读:回归通过率是发布门禁,不达标就退回。 文档评审管"写得对不对",回归测试管"跑得通不通",两道关互补。

    6.3 diff与回归清单生成器

    diff 逻辑与代码 diff 相同:按步骤号对比新旧版本,分出新增、删除、修改三类。 回归清单按变更类型分级:修改必测,新增抽测,删除要检查无引用残留。

    # 来源:自实现 / sop_diff_regression.py
    # SOP版本对比, 并生成需回归重测的任务清单
    def diff_sop(old, new):
    """对比新旧步骤列表, 输出三类变更"""
    old_map = {s["no"]: s["text"] for s in old}
    new_map = {s["no"]: s["text"] for s in new}
    return {
    "changed": [n for n in new_map
    if n in old_map and old_map[n] != new_map[n]],
    "added": [n for n in new_map if n not in old_map],
    "removed": [n for n in old_map if n not in new_map],
    }

    # mock: 步骤号到引用该步骤的任务索引
    TASK_INDEX = {
    2: ["高额退款审批流", "审批超时升级流"],
    3: ["退款执行流", "退款失败转人工流"],
    }

    def regression_list(d):
    """修改与新增必测, 删除需确认无残留引用"""
    tasks = []
    for n in d["changed"] + d["added"]:
    tasks += TASK_INDEX.get(n, [])
    return sorted(set(tasks))

    if __name__ == "__main__":
    old = [{"no": 2, "text": "金额超500元提交审批"},
    {"no": 3, "text": "执行退款"}]
    new = [{"no": 2, "text": "金额超300元提交审批"}, # 阈值调整
    {"no": 3, "text": "执行退款"}]
    d = diff_sop(old, new)
    print("变更步骤:", d) # changed=[2] added=[] removed=[]
    print("回归清单:", regression_list(d))
    # 输出: 回归清单 [审批超时升级流, 高额退款审批流]

    代码说明:diff 只报变更,regression_list 把变更翻译成要重跑的任务。 阈值从 500 改到 300 看似小事,引用步骤 2 的两条流都必须重测。

    回归通过率还要区分环境:沙箱跑通不等于生产跑通。 建议两级回归,先沙箱全量,再生产灰度抽样,两级都过才算发布完成。

    工程映射:流程守住了版本关,最后一关是人,见下一节的失败模式。

    7. 失败模式:影子流程与过时

    前六节的建设都可能被两种失败模式毁掉。 影子流程:文档说一套,员工实际做另一套。 过时 SOP:流程已变,旧文档仍在被执行。 两者喂给模型的都是假流程,模型执行得越精确,错得越稳定。

    7.1 影子流程:文档一套实际一套

    影子流程的定义:真实执行路径与成文 SOP 不一致,且未同步回文档。 成因通常是图省事:系统升级后少了一步校验,员工直接跳过。 时间一长,跳过成了肌肉记忆,文档还写着那个早已不存在的步骤。

    把影子流程喂给模型的后果有明确机制。 模型不知道现实,只知道上下文里的 SOP,它会忠实执行文档路径。 于是系统里出现诡异现象:模型多调了一个已废弃的接口,或者卡在一个无人处理的人工节点。 员工看模型"很笨",实际是模型拿到了假地图。

    #mermaid-svg-Y6ksZSyFWfCbWyin{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Y6ksZSyFWfCbWyin .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Y6ksZSyFWfCbWyin .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Y6ksZSyFWfCbWyin .error-icon{fill:#552222;}#mermaid-svg-Y6ksZSyFWfCbWyin .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Y6ksZSyFWfCbWyin .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Y6ksZSyFWfCbWyin .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Y6ksZSyFWfCbWyin .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Y6ksZSyFWfCbWyin .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Y6ksZSyFWfCbWyin .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Y6ksZSyFWfCbWyin .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Y6ksZSyFWfCbWyin .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Y6ksZSyFWfCbWyin .marker.cross{stroke:#333333;}#mermaid-svg-Y6ksZSyFWfCbWyin svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Y6ksZSyFWfCbWyin p{margin:0;}#mermaid-svg-Y6ksZSyFWfCbWyin .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Y6ksZSyFWfCbWyin .cluster-label text{fill:#333;}#mermaid-svg-Y6ksZSyFWfCbWyin .cluster-label span{color:#333;}#mermaid-svg-Y6ksZSyFWfCbWyin .cluster-label span p{background-color:transparent;}#mermaid-svg-Y6ksZSyFWfCbWyin .label text,#mermaid-svg-Y6ksZSyFWfCbWyin span{fill:#333;color:#333;}#mermaid-svg-Y6ksZSyFWfCbWyin .node rect,#mermaid-svg-Y6ksZSyFWfCbWyin .node circle,#mermaid-svg-Y6ksZSyFWfCbWyin .node ellipse,#mermaid-svg-Y6ksZSyFWfCbWyin .node polygon,#mermaid-svg-Y6ksZSyFWfCbWyin .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Y6ksZSyFWfCbWyin .rough-node .label text,#mermaid-svg-Y6ksZSyFWfCbWyin .node .label text,#mermaid-svg-Y6ksZSyFWfCbWyin .image-shape .label,#mermaid-svg-Y6ksZSyFWfCbWyin .icon-shape .label{text-anchor:middle;}#mermaid-svg-Y6ksZSyFWfCbWyin .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Y6ksZSyFWfCbWyin .rough-node .label,#mermaid-svg-Y6ksZSyFWfCbWyin .node .label,#mermaid-svg-Y6ksZSyFWfCbWyin .image-shape .label,#mermaid-svg-Y6ksZSyFWfCbWyin .icon-shape .label{text-align:center;}#mermaid-svg-Y6ksZSyFWfCbWyin .node.clickable{cursor:pointer;}#mermaid-svg-Y6ksZSyFWfCbWyin .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Y6ksZSyFWfCbWyin .arrowheadPath{fill:#333333;}#mermaid-svg-Y6ksZSyFWfCbWyin .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Y6ksZSyFWfCbWyin .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Y6ksZSyFWfCbWyin .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Y6ksZSyFWfCbWyin .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Y6ksZSyFWfCbWyin .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Y6ksZSyFWfCbWyin .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Y6ksZSyFWfCbWyin .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Y6ksZSyFWfCbWyin .cluster text{fill:#333;}#mermaid-svg-Y6ksZSyFWfCbWyin .cluster span{color:#333;}#mermaid-svg-Y6ksZSyFWfCbWyin div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Y6ksZSyFWfCbWyin .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Y6ksZSyFWfCbWyin rect.text{fill:none;stroke-width:0;}#mermaid-svg-Y6ksZSyFWfCbWyin .icon-shape,#mermaid-svg-Y6ksZSyFWfCbWyin .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Y6ksZSyFWfCbWyin .icon-shape p,#mermaid-svg-Y6ksZSyFWfCbWyin .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Y6ksZSyFWfCbWyin .icon-shape .label rect,#mermaid-svg-Y6ksZSyFWfCbWyin .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Y6ksZSyFWfCbWyin .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Y6ksZSyFWfCbWyin .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Y6ksZSyFWfCbWyin :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-Y6ksZSyFWfCbWyin .default>*{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-Y6ksZSyFWfCbWyin .default span{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-Y6ksZSyFWfCbWyin .default tspan{fill:#000000!important;}

    对账不一致

    实际做法更优

    违规操作

    成文 SOP

    模型执行路径

    员工实际操作

    系统真实路径

    影子流程暴露

    差异定性

    回写文档 走版本评审

    纠正执行 更新培训

    图 7-1 影子流程的对账与分流处置

    解读:差异不是直接判谁对谁错,而是分流定性。 更好的做法要回写文档,违规的做法要纠正行为,两个方向相反。

    7.2 过时SOP继续被执行

    第二种失败更隐蔽:文档曾经正确,现实已经变了。 接口下线、政策调整、组织改名,任何一项都让旧 SOP 失效。 失效不等于失声,旧 SOP 仍会被模型一丝不苟地执行。

    过时 SOP 与影子流程的区别在于错在哪一侧。 影子流程是文档错,过时 SOP 是环境变了文档没跟上。 治理重心也不同:前者靠对账发现,后者靠定期审阅与失效检测。 绑定表在这里再次发挥作用:接口下线时反查注册表,命中即提示 SOP 待更新。

    维度影子流程过时 SOP
    错误侧 文档落后于实际 文档落后于环境
    典型成因 员工绕步、系统变更未同步 接口下线、政策调整
    模型症状 调用废弃接口、卡在无人节点 请求失败、引用失效规则
    检测信号 文档路径与日志路径对账不一致 接口目录反查命中下线接口
    治理手段 差异定性后回写或纠正 版本评审加绑定表失效扫描
    复发周期 随组织扩张变短 随外部变化频率上升

    7.3 检测与治理:让假流程活不过一个季度

    治理影子流程与过时 SOP,核心是把对账做成例行机制。 机制一:日志对账。每月抽一批任务,比对模型与员工的实际路径和文档路径。 机制二:失效扫描。每季度用接口目录反查绑定表,下线接口直接生成待办。 机制三:红队演练。故意构造异常单据,验证 SOP 异常分支真实可走。

    三个机制的成本都不高,难在坚持。 经验节奏是对账每月一次、扫描每季一次、演练每半年一次。 检测出的差异进入第 6 节的版本评审流,形成闭环。 闭环一旦运转,假流程的存活时间就以季度为上限,而不是以年为单位。

    最后一条治理原则:喂给模型的 SOP 必须与员工培训用的版本同源。 两套版本并存,等于亲手制造影子流程。 同源靠第 5 节的裁剪器保证,单一底稿多视图输出,全组织看到同一份真相。

    8. 总结

    程序性知识是企业的存款,SOP 是存折,模型是取款人。 把 SOP 喂给模型的路要走六步:解析成结构化步骤,校验三要素,绑定动作,分层裁剪,版本化,回归联动。 六步之外还要守住两个底线:用对账揪出影子流程,用失效扫描清掉过时文档。 流程干净,模型办事才稳。

    外部引用

    • Wikipedia: Standard operating procedure 条目:https://en.wikipedia.org/wiki/Standard_operating_procedure
    • AgentTuning: 将普通大模型调优为智能体(arXiv 2310.12823):https://arxiv.org/abs/2310.12823
    • ReAct: 在语言模型中协同推理与行动(arXiv 2210.03629):https://arxiv.org/abs/2210.03629
    • Toolformer: 语言模型可以自学使用工具(arXiv 2302.04761):https://arxiv.org/abs/2302.04761
    • GPT-3: Language Models are Few-Shot Learners(arXiv 2005.14165):https://arxiv.org/abs/2005.14165
    赞(0)
    未经允许不得转载:171主机测评 » 大模型程序性知识--把SOP喂给模型
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址