
一个真正的 FDE 项目是怎么交付的从 PoC 到可复制产品专栏《AI FDE 实战从 Demo 到生产》第 18 篇 / 共 18 篇本篇目标把工程成果组织成可以验收、接手、运营和继续演进的交付物。本篇产物验收矩阵、证据包结构、运行手册、交接演练方案以及可运行的交付清单校验脚本。星河设备与本文交付场景均为虚构教学设定。系列代码是可组合的独立实验不声明第 07—17 篇已经整合并通过生产验收。“系统已经可以运行代码也发给客户了这个项目算完成了吗”如果这句话出现在内部开发群答案可能是“开发任务完成了”如果出现在客户交付会上还需要回答更多问题。客户能否判断系统符合约定接手工程师能否独立恢复服务业务人员是否知道什么时候该使用助手出现错误时谁负责处理下一次政策更新又该怎样发布这些问题构成 FDE 项目的最后一段工程工作。它们没有脱离代码而是在决定代码能否被持续使用。一个依赖原作者随时解释、每次更新都需要临时救火的系统即使功能演示顺利也还没有形成稳定的交付能力。本篇沿用内部售后助手将前面的需求、检索、工具、评测、部署、可观测与安全知识放进一次交付讨论。我们不把所有章节实验包装成已经上线的完整产品而是明确告诉读者怎样将这些部件组织成一项可核验的集成工作以及交付时应该留下哪些证据。一、项目完成需要同时回答三个不同问题第一个问题是“功能是否按约定工作”。这通常由业务样例、接口检查和系统测试回答。第二个问题是“别人能否独立运行与维护”。这需要部署资料、访问权限、故障手册和演练。第三个问题是“用户是否实际获得价值”。它涉及任务完成、使用习惯和业务结果不能由前两个问题自动推出。例如助手能够正确查询保修政策证明了一部分功能客户管理员能够更新资料和回滚索引证明了一部分运维能力客服真的在工作中使用并减少重复查找才开始说明业务采用情况。三个层次互相关联但使用的证据不同。不要用一个词混合它们。“上线”可以表示服务已经部署也可能被业务理解为团队可以全面依赖“验收”可能只针对当前阶段范围并不意味着所有未来需求都得到承诺。项目早期就应该定义这些词交付时再逐项对照。最有帮助的完成定义是让不同角色都能具体检查。业务负责人看任务行为工程负责人看系统边界运维看恢复与升级安全看权限与数据路径。FDE 负责将这些检查组织为一套一致的交付条件而不是让每个团队最后一天才提出自己的清单。二、先冻结交付范围才能讨论是否满足范围星河设备的本阶段可以定义为支持内部客服查指定产品的授权政策查询当前租户订单生成售后工单草稿并通过人工确认执行受控提交。产品线、资料范围、角色和适用时间都应明确避免把一句“企业助手”解释成所有业务自动化能力。范围之外的事项也要具体表达。比如自动批准赔付、批量修改订单、发送外部通知、跨租户资料分析是否纳入当前版本应有清楚结论。范围说明不是为了逃避工作而是让客户知道当前系统能够承担哪些任务以及新需求将触发怎样的评估。本专栏交付的则是教学文章、图片与独立实验。部分代码验证了本地逻辑真实模型、身份系统、企业数据库和公网部署的验证条件不同。读者将这些部件集成到自己的环境时需要重新建立目标版本和验收证据不能把教程中的通过结果直接当成自己项目的通过结果。冻结范围也不等于禁止变化。新的业务需要可以进入变更记录说明新增行为、影响范围、工期与验收方式。重要的是让变化有可追溯的决定而不是不断在演示里加入功能最后没有人能说清究竟交付了什么。三、把需求转换成可观察的验收行为“回答准确”“系统稳定”“权限安全”都表达了愿望但还不够执行。验收项应该包含触发条件、预期行为、验证方法、证据位置和负责人。例如租户甲客服查询租户乙订单时不返回订单内容也不通过错误信息暴露敏感存在性。对于保修问答可以写成已确认产品与适用条件时答案给出所需材料并显示可打开的授权引用缺少关键条件时先澄清证据不足时不编造政策。这样一项需求可能对应多个样例却仍然围绕同一项业务承诺。图 2验收不是给功能打勾而是把每项承诺连接到具体证据与责任人。写入路径要检查重复请求、内容变化、过期和权限撤销。部署路径要检查启动、健康、配置错误、回滚与恢复。不同维度的检查不能互相抵扣常见问答表现再好也不能用来平均掉跨租户数据泄露页面可用也不能证明正式工单真的写入了目标系统。验收矩阵不需要一开始就很大。先围绕最重要的业务任务与失败后果定义一组清楚条目再扩展覆盖面。一个每项都有证据、负责人和判断口径的小矩阵通常比几百行只有“通过”字样的表格更有用。四、区分已通过、待验证、接受限制与阻断项交付会上常见的压力是希望所有格子都变成绿色。这样做可能让团队把没有测试过的内容写成通过或者把严重问题混进“已知限制”。更可靠的状态体系至少区分已验证通过、尚未验证、明确接受的限制以及阻止发布的问题。“待验证”表示证据还不存在不等于失败也不等于可以默认通过。例如没有目标身份系统的测试账号就不能声称生产权限已验收。接下来需要的是明确补齐条件和负责人而不是在报告里换一个积极的词。“接受限制”应说明影响与临时路径并由有权决定的人确认。假设当前不支持扫描件可以把这类文件转人工处理但这需要让用户在入口处知道也需要业务认可。工程师不能独自把关键需求改写成已知限制来关闭任务。阻断项应有清楚原则例如未授权写入、关键资料越权、无法回滚的高影响迁移、无法确认正式执行结果。具体门槛由项目约定决定重点是提前确定。到发布当天才争论某个严重问题是否“可以先忍一下”通常说明前面的责任定义还不完整。五、证据包要让一个没参加项目的人看懂证据不是截图越多越好。一次成功聊天截图看不出代码版本、数据版本、用户权限和测试环境无法独立支持复杂结论。每份证据至少应说明验证对象、输入条件、执行步骤、实际观察、结果判断以及对应版本。可以把证据包分为范围说明、发布信息、验收记录、运行手册、已知问题和交接记录。文件名稳定入口文档解释阅读顺序重要结论能链接到原始记录。读者不需要在聊天群里搜索几百条消息才能找到某次测试的真正输出。图 3各类资料服务不同问题通过需求编号与发布版本建立关联。原始日志和用户数据不要无差别打包。证据应包含足够解释结果的信息同时去除不必要的个人信息、密钥与内部敏感内容。某些证据只能在客户受控环境中查看可以在包里记录访问方式与责任人而不是复制一份失去权限管理的快照。证据包也应能反映没完成的工作。保留待验证事项和已知限制比只展示顺利路径更能帮助接手人。工程交付的可信度来自结论与证据一致而不是视觉上全部成功。六、版本不仅是代码提交号还包含数据与配置AI 系统的行为受到代码、模型配置、提示词、工具定义、知识索引和业务规则共同影响。只有代码提交号往往不足以重现一次回答。发布记录应说明哪些配置来自环境哪些内容有独立版本以及如何找回对应快照。对于 RAG至少记录文档来源版本、处理策略与活动索引对于工具执行记录接口契约和权限策略对于评测记录样本版本与评价配置。不是要求所有东西使用同一个编号而是让它们的组合可以被识别和再次构建。构建产物与源码也应关联。一个标签说明源码位置一个发布包承载可下载的产物两者应指向明确关系。GitHub Releases 可以把发布说明和资产与标签组织在一起但平台存在这个功能并不会替你验证资产是不是来自正确构建。参考GitHub About Releases发布工程的价值之一是让构建与发布过程具备可重复性而不是依赖某个人电脑上的临时状态。对于本教程规模先记录依赖、构建命令、配置要求与产物哈希就有价值团队扩大后再根据需要引入自动构建与签名等机制。参考Google SRE Release Engineering七、运行手册应从症状开始而不是从架构介绍开始值班人员遇到的是“客服一直转圈”“引用打不开”“工单状态未知”不是“请解释模型编排层”。运行手册可以从这些用户可见症状出发先判断影响范围和最近变更再沿身份、检索、模型、业务接口的路径检查。每项操作应写明前置条件、执行权限、可能影响、具体步骤和成功判据。只写“重启服务”不够因为接手人不知道应该重启哪个实例、是否会中断写入、什么情况下不该继续。手册需要帮助人在压力下作出可控决定。对于写入结果未知要明确禁止盲目重试并给出按幂等键或业务标识查询的路径。对于资料更新失败要说明怎样保留旧索引对于权限同步异常要说明如何限制受影响访问。恢复方案必须与前面章节的安全边界一致。生产实践强调渐进发布、观察用户可感知指标和合理处理失败。本项目可以采用适合自身规模的具体方法不必复制大型组织的全部流程。重要的是让每个关键告警对应一个可以执行的行动而不是发出通知后默认有人会看见。参考Google SRE Production Services Best Practices八、恢复与回滚不是同义词回滚通常意味着恢复到已知版本恢复则意味着让业务重新具备可接受的能力。有时回滚可以帮助恢复但数据库迁移、外部工单和已经发送的通知不能简单通过切回代码撤销。交付手册应分别说明可逆变化、不可逆变化和补偿路径。例如新索引出现问题可以切回旧内容但必须保留当前删除与撤权状态新工具版本创建了重复业务记录切回旧代码不能消除这些记录仍需要核查和业务处理。把所有故障都写成“回滚上一版”会让接手人在真正事故中发现说明无法使用。备份也只有在恢复验证之后才具有更明确的价值。备份文件存在不能证明内容完整、密钥可用或恢复时间满足需要。练习环境可以先验证一个小数据集的备份与恢复过程目标环境再按照实际规模、权限和业务窗口安排演练。本专栏没有替读者执行生产恢复认证。我们提供的是应检查的责任与局部实验。交付报告应把这类环境相关验证列为独立事项明确由谁在什么环境中完成避免把一份教程运行结果扩大成企业连续性保证。九、交接演练让接手人独立完成任务作者讲一遍系统架构接手人点头通常只能证明双方参加了一次会议。更有效的方法是准备几个代表性任务让接手人在作者不代操作的情况下完成。作者观察卡住的位置记录哪些信息缺失再回到文档和工具里修正。可以从干净练习环境开始按说明配置并启动查询一条授权问题找到请求追踪更新一份文档验证权限变更再模拟一个可恢复故障。每项任务都对应日常维护需要避免把演练变成考记忆或猜命令。图 4接手人遇到的问题是交付物需要改进的证据。如果演练依赖作者临时提供账号、路径或配置先把这个依赖记录下来。它可能说明访问权限尚未完成也可能说明文档漏掉关键条件。交接应该逐步减少对作者个人知识的依赖而不是证明作者现场解决问题很快。演练完成后保留任务、环境、版本、观察结果和遗留问题。接手人能够独立完成核心动作才形成更有力的接手证据一次演练通过也不代表所有故障都被覆盖应同时记录没有测试的场景和升级求助路径。十、权限和所有权的交接比发一个压缩包更具体代码仓库、部署环境、域名、模型账户、数据库、日志平台和文档来源都可能有不同负责人。交接时应检查客户团队是否拥有需要的管理权限原项目成员的临时访问是否需要撤销以及自动化服务账号是否属于组织而非个人。不要把密钥明文放进交付文档。文档可以说明配置名、用途、获取位置、轮换流程和权限范围具体值通过企业认可的受控方式管理。接手人需要学会取得和轮换凭据而不是永远依赖作者转发一串字符。业务资料也需要明确所有者。谁能发布政策谁审批正式版本谁处理条款冲突谁决定删除资料这些职责无法由工程团队长期代替。没有内容维护责任人的知识库上线后会逐渐失去可信度即使服务本身仍然运行正常。最后把支持边界写清楚哪些故障由客户值班处理哪些升级给开发团队什么条件下联系外部供应商响应时段和联络方式是什么。具体承诺应来自双方已有约定而不是工程师在交付会上即兴许诺随时处理所有问题。十一、使用培训要围绕真实任务与能力边界培训不应只教用户“你可以问任何问题”。售后人员更需要知道怎样提供产品与订单信息如何核对引用什么时候会出现澄清草稿与提交有什么区别以及遇到不确定结果后如何转人工。可以准备三组练习常规任务顺利完成信息不足需要补充系统无法安全完成需要退出。让用户亲自看到第三种情况尤其重要因为它帮助建立正确预期。一个会诚实停止的系统可能比一个始终给答案的系统更适合企业流程。不同角色的培训内容也应不同。普通客服关注日常任务主管关注审核和异常处理知识管理员关注文档发布运维关注观察与恢复。把所有人拉进同一场深入代码讲解通常既增加负担也无法确保每个人掌握自己的关键动作。培训反馈还可以发现产品设计缺口。如果多数人无法理解引用版本可能需要改善引用卡片如果大家把“生成草稿”当成“完成提交”可能需要调整状态展示。不要把每个误解都归咎于用户没有认真看说明界面也是交付物的一部分。十二、Adoption 应衡量任务使用而不只是登录人数上线后一百个人登录过不代表一百个人通过系统完成了工作。登录可能来自培训、好奇或重复尝试。更有用的观察是有多少目标任务进入系统其中多少得到可用结果多少需要人工接管用户是否在后续任务中继续使用。对星河设备可以观察授权政策查询是否减少了重复查找工单草稿是否减少了重复输入引用是否帮助客服核验以及失败时是否能顺利回到原流程。这些问题应通过实际任务记录、抽样复核和用户访谈一起判断不能只看聊天条数。图 5采用情况、任务完成和业务结果需要不同证据不能用登录次数互相替代。比较前后效果时要注意任务难度、用户熟练程度和业务量变化。试点组可能由最积极的客服组成不能直接代表全部团队同时减少处理时间却增加返工也不能算完整收益。先记录基线与样本范围再解释观察到的变化。本文不提供虚构的节省比例。项目交付后应由业务与工程共同制定实际测量方法明确哪些指标可直接统计哪些需要人工抽样哪些只能作为初步线索。谨慎解释数据比用漂亮百分比快速证明项目成功更有助于后续决策。十三、上线后的支持需要从救火转向可维护机制试点阶段FDE 可能直接接收每条反馈这有助于快速理解问题。但随着使用规模扩大所有问题都找同一个人会成为瓶颈。应逐步形成分类入口让用户知道如何报告问题工程人员能拿到必要上下文业务负责人能参与判断优先级。反馈至少区分资料错误、检索失败、模型表达、工具执行、权限问题和使用困惑。一个分类入口并不要求用户理解这些术语可以由支持人员根据事实归类。目标是让问题到达合适负责人而不是用表单把用户挡在外面。对重复问题优先修系统或文档而不只是一次次手工处理。如果每周都需要作者手动重建索引应该调查自动发布与失败提示如果每次都有人误点确认应检查交互如果相同错误反复出现回归样本和监控是否缺失就值得检查。支持过程还应保留关闭标准。问题暂时绕过不等于根因修复用户没有再回复也不等于问题不存在。记录临时措施、长期修复和验证证据有助于把运营经验变成下一次发布的改进而不是散落在聊天记录里。十四、从客户定制中提取可复用能力FDE 项目天然接触具体客户流程因此容易积累大量定制代码。复用的起点不是立即做一个通用平台而是观察哪些变化来自稳定共性哪些来自客户独有规则。只有区分清楚抽象才会减少维护成本。例如工具调用的参数验证、幂等记录、追踪传播和引用结构可以在多个项目中复用某客户的赔付阈值、合同条款和审批角色则更适合保留为明确配置或独立业务规则。把所有差异硬塞进一个万能配置文件可能比保留少量清晰定制更难维护。图 6先验证重复出现的需求再决定沉淀为组件、配置还是产品能力。判断一个能力是否值得产品化可以看它是否在多个真实场景反复出现接口是否稳定能否独立测试维护责任是否明确以及抽取后是否减少了重复工作。仅仅“未来可能用到”通常不足以支撑一个复杂平台的成本。抽取组件时也要处理数据与知识归属。可复用的是经过授权的工程方法和通用实现不能把客户私有文档、业务秘密或专属配置顺手放进通用示例。技术复用与客户数据复制是不同事项需要在交付边界内分别处理。十五、给产品团队的反馈应该带着场景与证据“客户希望更智能”“希望支持更多工具”很难直接转成产品决定。更具体的反馈会说明用户是谁原流程怎样在哪个步骤受阻当前绕过方式是什么问题出现频率如何以及一个更好能力可能改变什么结果。例如三个项目都需要在资料更新后确认新版本真正被查询使用这可能指向一个通用的发布状态与验证能力某一个客户要求特殊格式工单编号则可能更适合接口配置。把需求出现的上下文一起保留有助于产品团队判断适用范围。反馈不应只来自失败。哪些功能被用户持续使用哪些引用形式便于核验哪些工具边界减少了误操作同样值得总结。成功模式如果能解释其前提就可以在新客户项目中更快验证而不是每次重新摸索。同时避免把单一客户的紧急需求直接说成市场普遍需要。FDE 有接近现场的优势也有样本局部的限制。把观察、推断和建议分开表达既保留现场信息的价值也让产品决策有机会结合更广范围的数据。十六、运行一个交付包完整性检查实验本篇提供manifest_check.py使用 Python 标准库为显式指定的交付目录生成清单并检查文件路径、字节数和 SHA-256。它的目的很小让接收者发现文件遗漏、意外修改或额外混入的内容不代替功能验收或来源认证。cdoutputs/18-handoff/code python manifest_check.py self-test python manifest_check.py verify example-release示例目录包含范围说明、验收表、运行手册、交接记录与发布元数据五份文件。所有业务验收状态都明确为待确认不能把模板误读成已经签收。清单针对这些实际文件生成校验通过只说明文件与清单一致。脚本的七项自检实际通过包含正常匹配、内容修改、文件缺失、额外文件、越界路径、重复条目和不支持的清单版本。它拒绝目录外路径与链接但没有实现对抗恶意并发修改的底层文件检查也没有做大型文件流式优化适合受控的小型交付目录。尤其要理解哈希的边界如果文件和清单被同时替换单独计算哈希无法证明发布者是谁。真实交付还需要可信获取渠道、受控发布记录或签名机制。不要看到脚本输出通过就把一个来源不明的包当成可靠软件。十七、把最后一次交付会议变成清楚的决定一场有效交付会议可以围绕五件事进行确认本次范围与版本查看验收结果和未完成项演示接手能力明确支持责任记录接受决定与后续行动。项目历史可以作为背景但不应占满时间让真正需要决定的内容来不及讨论。对于每个遗留事项写明影响、处理人和验证方式。是否影响当前接受决定应由约定负责人判断而不是在纪要里用“后续优化”一笔带过。没有责任人的事项通常也不会因为出现在文档里就自动得到解决。交付后可以安排有限的观察与支持阶段但结束条件同样要明确。它可以用于发现真实使用中的缺口、帮助接手团队熟悉流程并关闭剩余问题不能成为无限期依赖原作者的另一种称呼。稳定的责任转移是交付目标的一部分。最后保存一份清楚的状态记录哪些已接受哪些仍待验证哪些限制被明确知晓哪些能力留待下一阶段。这样的记录可能没有全绿看板耀眼却更能帮助双方在下一次变化时理解曾经共同作出的决定。十八、实战练习模拟一次你不在场的交付找一位没有参与实现的同伴把范围说明、运行方法和实验代码交给他自己暂时不解释。请他判断系统能做什么、不能做什么运行一个正常样例再运行一个失败样例。观察哪些结论他能从交付物中独立得到哪些必须问作者。然后让他修改示例交付目录里的运行手册执行完整性校验确认脚本发现变化。再讨论什么时候应该重新生成清单只有在变更经过审阅并准备形成新交付版本时才合理不能把重建清单当成消除告警的快捷方式。第三个练习是填写自己的验收矩阵。选取五项最重要的任务每项写出触发条件、预期行为、证据位置与负责人。把没有实际验证的地方保留为待验证不要为了作业看起来完整而填写通过。这会让你清楚看到从教程实验到真实项目之间还需要哪些工作。最后写一条产品反馈要求包含具体用户、当前流程、观察到的困难、已有证据和可检验建议。与“希望做得更智能”相比看看这条反馈是否更容易被另一位工程师或产品经理理解并据此设计下一步验证。FDE Thinking交付的终点是责任可以被清楚接住为什么不把代码发出去就结束因为代码只能表达一部分系统知识运行条件、业务边界和恢复方式还需要其他形式承载。接手人能够独立行动才说明这些知识真正从作者个人转移到了团队。为什么不把所有客户需求做成平台功能因为复用需要稳定共性与明确成本收益。过早抽象会把还没理解的差异固定进架构反而拖慢后续项目。先让一个场景被可靠交付再从重复证据中提取共性是更容易维护的成长方式。为什么最后仍然讨论采用情况因为 FDE 的工程工作最终服务于真实流程。一个被正确部署却无人使用的助手和一个很受欢迎却无法安全维护的助手都还需要继续改进。任务价值、系统可靠性与责任交接必须在同一项目里找到平衡。从第一篇理解 FDE到现在组织验收与复用专栏一直围绕同一件事把模糊问题转化成具体行为让实现有证据让边界可解释让别人能够继续使用与维护。你最终要交付的不只是一段会回答的程序而是一套能够被团队接住的工作方式。