技术文章

代码是 AI 写的,所以我给证据分了七级

编程 agent 报一句已完成的成本几乎为零。于是我把验证等级写进项目宪法:不得把低等级证据当高等级用,实现者不得批准自己的实现。

我的项目里代码大部分是编程 agent 写的,架构、契约、取舍和验收口径由我定。这套分工最花心思的地方不是功能,是怎么不让已完成这三个字通胀。

一个 agent 说一句已实现并验证的成本几乎为零。它不撒谎,但它会把一次 mock 测试的绿灯,和一次真机跑通,用同一个词报给你。区分这两者是我的活。

七级

等级含义能证明不能证明
DOC上游文档或他人仓库的报告,本地未复现参考价值本机可用性
AUTO本地自动化测试,确定性,无外部硬件代码逻辑正确真实设备行为
SIM模拟输入:mock 传输、合成音频、mock 子进程代码路径连通真机表现
REAL-MIC本机真实麦克风音频链路真实可用多环境质量
REAL-AGENT真实外部 agent 进程被拉起并完成一轮第三方接入真实可用多 agent 并发表现
REAL-EVOX真实会话后端端到端业务闭环—
REAL-WIN真实透明窗口透明 / DPI / 多屏 / 远程桌面—

不能证明那一列是这张表真正干活的地方。光有等级没用,要写清楚每个等级的天花板在哪儿,否则我们有测试这句话可以拿去回答任何质疑。

规矩一条:不得把低等级证据当高等级用。无新证据不得升级。

推论也是硬的:mock 子进程只算 SIM。子进程适配器的解析测试再全,也不能升成 REAL-AGENT —— 那一级的定义是真实进程被拉起、真实产出增量、真实完成一轮。

当前达成,照实写

DOC / AUTO / SIM 已建立,REAL-MIC 有一次唤醒验证。REAL-AGENT、REAL-EVOX、REAL-WIN 完全空白。

这三行空白就是这个项目的主要发布风险,写在总览文档第二节,不藏在附录里。我不说它到了发布标准。

第一次回报:一个看起来像测量值的常数

唤醒命中原先对每一次命中都报 score = 1.0。

去核实的时候发现:这个语音库的唤醒结果对象里只有关键词、时间戳、token 三个字段,这个绑定根本不暴露置信度。那个 1.0 不是检测器输出,是一行写死的常数。

更麻烦的是它已经进过一次真机记录 —— 那份记录里写着命中、score 1.0,读起来像是测出来的。

改法是把它换成一个诚实的陈述:

# 返回 (keyword, None)。None 是一个经过核实的陈述:
# 这个绑定不提供置信度,所以这里没有数可报。
return keyword, None

进事件的那个数字换成了声纹余弦相似度 —— 那个是真测出来的。

一个假的测量值比没有测量值坏得多:没有数的时候你知道自己不知道,有个假数的时候你以为自己知道。

第二次回报:一个会空过的测试

声纹校验要证明它能分辨不同的人。省事的做法是生成两段音频来测 —— 我差点就这么干了。

实测:注册一段 120 Hz 的谐波栈,去校验一段 240 Hz 的,两者差一个八度,大概是两个合成信号能差到的极限。结果是通过,相似度 0.767。

原因不难理解:模型是在人声上训练的,两段合成音在它眼里都是同一种非人声。所以任何用生成音调搭的声纹判别力测试,都会空过 —— 绿灯,零信息量。

于是我给这个陷阱专门写了一条测试钉住它,命名就叫合成音调不能替代语音。让陷阱留在测试里,比让下一个人重新发现它一遍便宜。

真实人声的判别力另测:同人簇内最小 0.736,异人簇间最大 0.370,默认阈值 0.5 落在这条间隙里。这一条的等级是 AUTO —— 音频是真人说的,但是预先录好的文件。它证明模型能分辨,不证明我的麦克风上本人的通过率。

角色边界:不许自己批准自己

分工写在协议里,四条禁止项比四条允许项重要:

角色不允许做什么
架构未授权的大规模改代码
实现修改禁止范围、批准自己
审查直接悄悄修复被审查的代码
人类把 agent 的结论当成人工验收

第二条和第四条是这张表的全部意义。实现者批准自己,那审查就是走个形式;而最后一条是给我自己的 —— agent 给出的审查报告是一份材料,不是一次验收。

审查者不能只说一句看着没问题,必须给出 PASS / REQUEST_CHANGES / BLOCKED,加优先级、文件行号、可复现的原因、最小修复建议。实现者交接时必须给出:改了哪些文件、每处的意图、实际运行的命令和退出码、测试输出摘要、未解决的风险、有没有碰到高风险区域。

实际运行的命令和退出码,这一条挡掉的东西最多。

两轮上限

最多两轮审查加修复。第三轮还不过就标 BLOCKED,交给我决定。

不允许 agent 无限循环。两个 agent 可以在一个问题上来回改到你的额度见底,而且每一轮的交接文档都写得挺像样。

另有一批变更即使测试全绿也必须我本人点头:认证、权限、隐私与音频数据、数据库结构、核心依赖、部署配置、模型权重、大批量删除文件、CI 权限与凭据。

每条结论带环境

Windows 11 (10.0.26200) / Python 3.12.10
sherpa-onnx 1.13.4 / SQLite 3.49.1 / pytest 9.1.1

版本级的环境记录加上可复现命令。原因很简单:一条不能被重跑的结论,半个月后就等于一句传闻 —— 包括我自己写下的那些。

收成一句

AI 把写代码的成本压下去之后,瓶颈就移到了验收。这套七级分类不是流程洁癖,它回答的是一个很具体的问题:当已完成变得廉价,我凭什么相信一件事真的完成了。