跳到主要内容

如何对 AI 生成的代码负责

问题

团队大量使用 AI 编程助手后,如何在提升效率的同时控制正确性、安全、隐私、许可证和维护风险?当 AI 生成代码导致线上问题时,责任应该如何界定?

面试速答版

我的原则是:AI 可以生成建议,但不能转移工程责任。提交代码的人和批准变更的团队仍对结果负责。

治理不应只靠禁止,而应按风险分级:

  • 低风险样板代码可以正常 Review 和测试;
  • 核心业务、认证、支付、加密、基础设施等高风险代码需要领域负责人和安全审查;
  • 密钥、个人数据、未公开源码不能输入未经批准的外部模型;
  • 所有 AI 代码都经过同样的编译、测试、Lint、SAST、依赖和许可证检查;
  • 引入的新依赖、API 和配置必须回到官方来源验证;
  • 保留必要的工具、模型和人工审查记录,但不上传敏感 Prompt;
  • 评估效率时同时看返工、缺陷、安全和认知负荷,不能只看生成速度。

一、责任原则

AI 生成内容不具备责任主体,组织仍需明确:

角色责任
提交者理解代码、验证行为、说明风险和测试
Reviewer检查设计、边界、安全与可维护性
模块负责人对领域约束、依赖和长期维护负责
安全/合规定义数据、模型和高风险代码政策
平台团队提供批准工具、审计、扫描和默认防线
管理者不用不合理产能目标诱导绕过质量流程

“这是 AI 写的”不能成为事故免责理由;同样,也不应把所有问题归咎于某个开发者,而忽略缺少测试、Review 和工具防线的系统原因。

二、风险地图

1. 输入风险

  • 把生产日志、用户信息、访问 Token 或私钥发给外部模型;
  • 上传公司未公开算法、合同代码或客户数据;
  • Agent 自动读取仓库中的恶意指令、Issue 或依赖文档;
  • 使用个人账号和未批准插件,绕过企业数据策略。

2. 输出风险

  • 使用不存在、过时或行为错误的 API;
  • 生成表面通过测试但边界错误的代码;
  • 引入名称相似的恶意依赖或不必要依赖;
  • 复制来源和许可证不清晰的实现;
  • 生成难以维护的大段重复代码;
  • 把安全校验只放在前端,或者使用自制加密算法。

三、按变更风险分级

等级示例最低要求
L1 低风险测试样板、文档、局部重命名常规 Review、CI
L2 中风险普通业务逻辑、组件、数据转换单元/集成测试、依赖扫描
L3 高风险认证、权限、支付、迁移、并发领域负责人 Review、安全检查、回滚方案
L4 严格限制密钥系统、核心加密、生产自动操作批准工具、双人审查、隔离验证或禁止生成

风险由代码所在边界和潜在损失决定,不由生成代码的行数决定。

四、输入数据治理

团队需要明确“可以输入什么”:

  • 使用企业批准的模型、账号、数据保留和训练策略;
  • IDE 在发送上下文前做 Secret 和个人信息检测;
  • 默认排除 .env、密钥、生产数据、证书和敏感目录;
  • 用脱敏 Schema、伪造样本和最小代码片段替代真实数据;
  • Agent 工具按最小权限授权,读取和执行分开审批;
  • 对外部仓库、网页和 Issue 内容按不可信输入处理。
Prompt 不是安全边界

“请不要泄露密钥”不能替代访问控制。模型根本不应获得无关密钥和生产权限,敏感操作需要工具侧校验、确认和审计。

五、输出验证流水线

开发者提交前清单

  • 能否用自己的话解释代码、状态和失败路径;
  • API、版本和配置是否从官方文档确认;
  • 是否新增依赖,包名、维护者、完整性和许可证是否可信;
  • 是否覆盖空值、并发、重试、权限和资源清理;
  • 是否复制了已有能力,或者破坏模块边界;
  • 测试是否验证行为,而不是照着实现复述;
  • 是否准备监控、灰度和回滚。

为什么测试也需要审查

如果代码和测试由同一个 Prompt 同时生成,它们可能共享同一个错误假设。关键逻辑应增加独立的规格、属性测试、对照实现或人工设计的反例。

六、依赖与供应链

AI 很容易推荐不必要、过时或名称错误的包。新增依赖至少检查:

  • 包是否存在于官方 Registry,仓库和发布者是否匹配;
  • 下载并不是唯一可信信号,需查看维护、签名和漏洞;
  • Lockfile 是否只出现预期变化;
  • 是否能用平台 API 或现有依赖完成;
  • 许可证是否满足项目分发方式;
  • 生成 SBOM,并持续监控后续漏洞。

安装命令不应由高权限 Agent 无确认执行;依赖安装和脚本执行要显示目标与影响。

七、Review 方式需要变化

AI 提升了代码产生速度,也可能把瓶颈转移到理解和 Review:

  • PR 控制体积,按可独立验证的意图拆分;
  • 描述中写清需求、约束、AI 使用范围和人工验证;
  • Reviewer 从逐行挑错转向契约、边界、状态和失败模式;
  • 高风险变更要求演示测试、迁移和回滚;
  • 大段生成代码先做设计评审,避免在实现后讨论方向。

不要强制保留完整 Prompt 和敏感上下文;需要审计时记录工具、模型类别、生成范围和验证证据即可。

八、Agent 自动修改代码的权限模型

推荐把能力分层:

能力默认策略
读取仓库允许,但排除 Secret 和敏感路径
修改工作区限定分支或沙箱,可审查 Diff
运行测试允许受限命令和资源
安装依赖需要确认和来源检查
访问网络域名和用途受控
写生产配置禁止默认直达,必须审批
部署/删除/迁移人工确认、最小权限、可回滚

工具调用参数必须经过独立校验,不能因为模型说“这是安全的”就跳过权限检查。

九、如何衡量 AI 编程的真实收益

结果指标:

  • 从需求就绪到生产的前置时间;
  • 开发者完成常见任务的成功率;
  • 新人上手时间和文档可发现性;
  • 重复工作量和等待时间。

护栏指标:

  • AI 相关变更的返工、回滚和缺陷;
  • 安全、许可证和依赖风险;
  • PR 体积、Review 等待和 Reviewer 负担;
  • 开发者是否真正理解代码;
  • 工具成本、数据暴露和供应商锁定。

只统计接受了多少补全或生成了多少代码,会鼓励数量而非价值。

十、事故处理

AI 代码引发事故时仍按正常流程:止血、恢复、证据保全、根因分析和无责复盘。根因可能同时包括:

  • 生成内容错误;
  • 提交者未验证;
  • Review 缺少领域知识;
  • 测试和扫描未覆盖;
  • 权限过大或工具默认不安全;
  • 进度压力导致绕过流程。

改进重点应是增加系统防线,而不是简单写一条“禁止使用 AI”。


常见面试问题

Q1: AI 生成代码的 Bug 应该由谁负责?

答案:提交和批准变更的人及其团队仍负责结果。组织也要为工具选择、权限、测试和审查机制负责,不能把系统缺陷全部归咎于个人。

Q2: 是否应该禁止在核心代码中使用 AI?

答案:应按风险控制而非一刀切。高风险模块可以限制生成、要求批准模型和双人审查;即使禁止生成,也不代表可以减少正常的测试与安全流程。

Q3: 如何防止 AI 推荐恶意依赖?

答案:安装前验证官方 Registry、仓库和发布者,检查名称、维护、漏洞和许可证;限制 Agent 安装权限,审查 Lockfile,并使用 SCA 和 SBOM 持续治理。

Q4: AI 生成的测试可靠吗?

答案:可以提高覆盖,但可能和实现共享同一错误假设。关键逻辑需要独立规格、人工反例、属性测试或对照实现,不能用“测试通过”代替需求验证。

Q5: 记录所有 Prompt 是否最利于审计?

答案:不一定,Prompt 可能包含源码和敏感信息。应遵循数据最小化,记录工具、模型、变更范围、审批和验证证据;只有确有合规需求时才保留脱敏 Prompt。

Q6: 如何判断 AI 是否真的提升了效率?

答案:比较端到端前置时间、任务成功率和开发者体验,同时观察返工、缺陷、Review 负担和成本。局部编码变快但整体等待或返工增加,不算效能提升。

相关链接