夜雨聆风学习资料网

ARTICLE · 978900

AI 写代码越快,软件交付反而越难

AI 写代码越快,软件交付反而越难
从规格、Agent、质量、Goodput 到 NPU

重建一条可验证、可回退的工程闭环 · 阅读约 10 分钟

— — —

今天,一名开发者用 AI 在半小时内生成的代码,可能比过去一天手写的还多。

但许多团队同时遇到了一个反直觉现象:代码出来得更快,需求返工、评审压力、线上风险和定位成本却没有同步下降。有时,速度甚至把一个模糊决策更快地扩散到了整个系统。

问题不在于 AI 不够聪明,而在于团队只升级了代码生成面,没有同步升级工程控制面。

过去的瓶颈

生产代码

写得快 · 功能完成 · 峰值数字漂亮

↓ 工程瓶颈迁移 ↓

AI 时代的瓶颈

可信交付

目标清楚 · 证据独立 · 失败后可以恢复

当代码越来越便宜,真正昂贵的东西变成了:定义正确问题、约束变更范围、独立证明结果,以及在失败时安全恢复。
一、AI 改变的不是工具,而是工程瓶颈

传统研发容易把“完成”理解为代码写完、测试通过、PR 合并。AI 加入后,这种定义会越来越危险。

模型能够补齐缺失细节,却不知道哪些细节不应该由它补;能够同时修改几十个文件,却不知道哪条架构边界不能碰;也能够生成一套测试,为自己刚刚写出的错误假设提供“全绿证明”。

AI 研发的三种放大效应

① 错误目标被高速实现

② 错误假设被自动扩散

③ 错误结论被同源验证

可以用一个简单的启发式关系理解交付风险:

交付风险 ∝ 变更规模 × 不确定性
          × 影响范围 ÷ 验证强度

它不是精确公式,却给出了非常实用的行动方向:任务更小、假设更显式、权限更有限、验证更独立,风险就更容易被控制。

一套完整的 AI 工程体系,可以拆成六个连续环节:

01
可控研发
目标·风险·Owner
02
规格设计
行为·状态·接口
03
AI 协同
上下文·权限·轨迹
04
质量工程
测试·Eval·调试
05
性能工程
基线·瓶颈·Goodput
06
推理工程
模型·Runtime·NPU
业务意图 → 任务 → 规格 → 变更 → 验证 → 发布 → 运行反馈

这六层不是六套互不相干的方法。它们共同构成一条证据链,运行指标、事件和事故复盘又会反向修正下一轮目标与设计。工程能力的差距,最终体现在这条链能不能连起来。

二、先把“我想要”变成系统契约

设想产品经理只说一句:“增加多模型动态加载。”

这句话足以让 AI 开始写代码,却远远不足以让团队安全交付。它没有说明:加载期间旧请求是否继续执行、内存不足时谁决定驱逐、切换失败是否回到旧版本、并发请求看到哪个模型、业务 API 能不能变化。

如果这些问题没有提前回答,AI 就会用训练数据里的常见做法,替团队作出架构决定。

任务卡字段
必须回答的内容
目标 / 非目标
解决什么,以及这次明确不解决什么
范围 / 约束
允许改哪里,版本、资源、兼容和权限边界
风险 / 验收
怎样失败;在什么环境用什么阈值证明
Owner / 回退
谁作最终决定,何时以及怎样回到安全状态

下一步,才是把任务继续下沉为设计和规格。好的设计不是一张漂亮的架构图,而是让开发、测试、AI 和运维对关键问题得到同一个答案:谁拥有状态?接口怎样超时?重复请求是否幂等?部分成功怎样补偿?版本怎样兼容?资源不足时如何背压?

业务目标
为什么做,什么结果有价值
↓
用户场景
谁在什么条件下完成什么任务
↓
行为与质量规格
输入、输出、状态、错误、不变量、性能与容量阈值
↓
验收协议
环境、数据、步骤、Oracle 与证据位置

判断规格是否可执行,只问一句

另一个没有参与讨论的人,能否仅凭这份规格实现、测试并判断结果?如果不能,它仍然只是愿望。

三、Agent 可以执行,但不能同时当裁判

AI 编码工具从补全、对话,逐渐走向仓库编辑、命令执行和长程 Agent。行动权越大,效率上限越高,风险半径也越大。

一个实用的自治风险模型是:

自治风险 ≈ 行动权限 × 运行时长
          × 环境触达 × 不可逆性
          ÷ 可观测与回滚能力

真正的工程化,不是给模型一句“请谨慎修改”,而是在模型外部建立一个Agent Harness:由确定性的系统管理上下文、状态、权限、工具、验证和恢复。

Agent 受控执行链
① 上下文装配
只加载相关、可信、可定位的权威来源
↓ 暴露假设与影响范围
② 计划审批
文件、权限、预算、验证与停止条件
↓ 建立隔离工作区与检查点
③ 受控执行
最小权限、小步变更、完整工具轨迹
↓ 与生成来源正交
④ 独立验证
测试、Eval、性能、安全与残余风险
↓ 交付证据而非自我结论
⑤ 人工交接
由责任人决定合并、阻断、灰度或回退
每一步都有状态、预算、检查点、轨迹和恢复入口

Prompt、Task、Spec 和 Evidence 也不能混在一起:Prompt 只是一次交互;Task 规定本次工作的目标、范围与验收;Spec 是跨版本存在的契约;Evidence 则记录 Diff、命令、测试、环境和残余风险。

这些情况出现时,Agent 应停止并升级

• 需要修改未授权文件、公共接口或原设计

• 接触密钥、外部网络、新依赖、删除、迁移或发布

• 质量、性能或安全基线下降

• 时间、费用、重试预算耗尽,或连续两轮没有新证据

尤其要避免生成与验证完全同源。让同一个 Agent 写代码、写测试、解释失败,再宣布自己成功,等于让运动员兼任裁判。可靠验证要组合编译和静态分析、契约与属性测试、差分和故障注入、性能与安全基线,以及人类对架构边界和残余风险的判断。

四、测试全绿,只能说明检查过某些东西

质量不是“没有发现 Bug”,而是关键风险已经获得独立、可复现、可追溯的证据,剩余风险也有人明确接受。

质量层次
问题与证据
规则正确
接口、状态、不变量
断言·契约·属性测试
产品质量
可靠、安全、兼容、恢复
集成·故障注入·升级与回退
系统结果
用户任务与输出价值
Eval·盲评·生产切片

传统测试擅长判断确定性行为,Eval 则负责评价可能存在多个合理答案的概率性输出。两者不能互相替代。

可信的 Eval 应从“这个结果要支持什么发布决策”开始,再定义能力与风险场景、样本切片、评分方法,最后设置 Release、Block 或 Canary 阈值。只报一个总体平均分,会把长尾、安全和关键用户群的问题藏起来。

可观测性是质量证据的连接器

日志和事件说明发生了什么,指标判断范围与趋势,Trace 还原跨模块路径,Profile 定位 CPU、内存、网络或 NPU 热点。它们需要由 Request ID、模型版本、编译版本和资源 ID 连起来。

调试也不是不断尝试参数,而是一连串可证伪实验:冻结环境、提出带预测的假设、一次只改变一个变量,然后观察结果是否能区分不同根因。

P99 超时:一条根因证据链
现象
平均延迟正常;长输入+模型切换+高并发时 P99 超标
↓ Trace 缩小范围
位置
长尾集中在模型加载与 Prefill 之间
↓ 对照实验排除假设
根因
共享 DMA 缺乏隔离;同步重试形成正反馈
↓ 修复并建立门禁
决策
加载/执行隔离、背压、重试预算、Shadow → Canary
五、峰值吞吐不是业务真正得到的性能

性能优化首先是一门实验科学。如果工作负载、硬件、软件、模型版本、输入输出长度、Batch、并发、预热和统计方法没有冻结,两次性能数字就没有可比性。

AI 推理尤其容易被一个数字误导:Tokens/s。更值得关注的是Goodput——同时满足质量、延迟和错误率约束的有效吞吐。峰值吞吐很高,但 P99 超标、答案质量下降或请求大量失败,并不代表系统拥有更高的可用能力。

质量证据

正确性与任务 Eval · 安全、兼容与恢复

不通过:阻断或限定场景

+

性能证据

TTFT、TPOT、P99 · Goodput、容量与长稳

不通过:调参、扩容或回退

两条证据链同时通过,才进入发布或灰度

Batch 是典型例子。增大 Batch 可能提高设备利用率和峰值吞吐,也可能增加凑批等待、KV 占用和长短请求干扰。真正的最优点不是图表里的最高柱,而是在真实请求分布下仍满足质量、P99、公平性和容量余量的安全工作区间。

六、大模型落地,不是“模型塞进显存”

当问题继续下沉到推理系统,工程链会更长:模型结构决定计算和状态,量化改变数值与布局,Compiler 规划全局数据流,Kernel 实现局部执行,Runtime 管理动态请求,硬件提供容量和性能上界。

大模型推理全栈
模型
Attention·MoE
量化
精度·Scale·Group
Compiler
IR·融合·Layout
Kernel
Tile·DMA·SPAD
Runtime
Batch·KV·恢复
NPU / 硬件
容量·带宽·NoC
跨层 Trace:请求 → 图算子 → Kernel → 设备命令 → 计数器

一个 Token 从请求进入到返回,要经历路由和资源预留、Prefill、循环 Decode、Sampling、Streaming 和资源释放。TTFT、TPOT、P99 与 Goodput,分别暴露这条流水线的不同问题。

容量计算也远不止“参数量乘以位宽”:

权重容量 ≈ 参数量 × 位宽 / 8
          + 量化元数据 + 对齐

总内存 = 权重 + KV Cache + Workspace
       + 通信 Buffer + Runtime/Driver
       + 碎片 + 故障恢复余量

裸权重放得下,不等于系统可部署

7B INT4 裸权重约 3.5 GB,但量化元数据、KV、Workspace、页表、碎片和运行余量都会继续占空间。多芯片切分先解决容量,随后还要支付通信、气泡、同步和故障恢复成本。

这就是为什么大模型推理必须做全栈联合设计。模型、Compiler、Kernel、Runtime 和 NPU 中任何一层的局部最优,都可能成为端到端系统的全局次优。

七、团队明天就能开始的最小闭环

不需要一次引入几十套制度。选一个真实、常规风险的功能,先要求四个制品:

① 任务卡
目标、非目标、范围、风险、Owner、验收与回退
② 设计包
场景、不变量、责任、接口、状态、失败与 ADR
③ 执行证据包
上下文、计划、权限、Diff、命令、测试和未知项
④ 发布证据包
质量、性能、版本、环境、残余风险与 Canary

跑完一轮后,再看交付周期、评审等待、首次验收通过率、缺陷逃逸、P99、Goodput 和恢复时间。一次只改一个流程变量,然后复测。

真正有价值的工程改进,不是文档数量增加了,而是团队开始能够回答:为什么做、谁决定、改了什么、怎样证明、在哪运行、失败后怎么回来。

— — —

写在最后

AI 不会让软件工程消失。恰恰相反,它会把软件工程从“如何生产代码”,推向“如何控制一个能高速生产代码的系统”。

未来更稀缺的工程师,不只是会写 Prompt、调 Kernel 或调用模型的人,而是能够从业务意图出发,在规格、代码、模型、编译、运行时和硬件之间追踪同一个决策的人。

他们知道什么时候可以自动化,什么时候必须停;知道什么数字可以相信,什么证据还不够;也知道系统出错时,怎样解释、止损和恢复。

代码可以由 AI 快速生成,但可信交付仍然是一门人的工程。

如果你的团队正在把 AI 引入研发流程,不妨先问一个问题:我们升级的只是生成速度,还是整条工程闭环?欢迎留言说说你们目前最难补上的一环。

相关学习资料