金句:AI 生成的代码不是答案,是草稿。真正的工程师知道如何把草稿改成作品——而这首先需要你能分辨草稿的好坏。
一、AI 代码幻觉的四种类型
AI 生成代码时会犯几类典型错误,了解它们是识别的第一步:
类型一:语法正确但语义错误
# AI 生成的代码:看起来正确
def get_user_age(birth_year: int) -> int:
from datetime import datetime
return datetime.now().year - birth_year
# 问题:如果用户还没过今年生日,年龄会多算1岁
# 正确版本:
def get_user_age(birth_year: int, birth_month: int, birth_day: int) -> int:
from datetime import date
today = date.today()
age = today.year - birth_year
if (today.month, today.day) < (birth_month, birth_day):
age -= 1
return age
类型二:调用不存在的 API
# AI 可能生成的代码(2023年之前的知识)
from anthropic import Anthropic
client = Anthropic()
# ❌ 错误:这个方法不存在或签名已改变
response = client.completion.create(
prompt="Hello",
model="claude-v1", # ❌ 旧版模型名
max_tokens_to_sample=100 # ❌ 旧版参数名
)
# ✅ 正确(2024年版本)
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=100,
messages=[{"role": "user", "content": "Hello"}]
)
类型三:忽略并发和竞态条件
# AI 生成的代码:单线程下正确
class TokenBucket:
def __init__(self, capacity: int):
self.capacity = capacity
self.tokens = capacity
def consume(self, amount: int) -> bool:
if self.tokens >= amount:
self.tokens -= amount # ❌ 并发下会出现竞态条件
return True
return False
# 正确版本:使用锁保证原子性
import threading
class TokenBucket:
def __init__(self, capacity: int):
self.capacity = capacity
self.tokens = capacity
self._lock = threading.Lock() # ✅ 添加锁
def consume(self, amount: int) -> bool:
with self._lock: # ✅ 原子操作
if self.tokens >= amount:
self.tokens -= amount
return True
return False
类型四:表面正确但性能灾难
# AI 生成的代码:功能正确,性能糟糕
def find_duplicate_emails(users: list) -> list:
duplicates = []
for i in range(len(users)):
for j in range(i + 1, len(users)):
if users[i]['email'] == users[j]['email']:
if users[i]['email'] not in duplicates:
duplicates.append(users[i]['email'])
return duplicates
# 复杂度:O(n³),1万用户就是1万亿次操作
# 正确版本:O(n)
from collections import Counter
def find_duplicate_emails(users: list) -> list:
email_counts = Counter(user['email'] for user in users)
return [email for email, count in email_counts.items() if count > 1]
二、AI 代码质量评估框架(STARS)
S - Safety(安全性)
• SQL 注入、XSS、命令注入
• 认证/授权绕过
• 数据泄露风险
T - Testing(可测试性)
• 依赖是否可以 Mock
• 函数是否有副作用
• 是否有明确的输入输出边界
A - Accuracy(准确性)
• 边界情况处理
• 错误处理完整性
• 业务逻辑正确性
R - Readability(可读性)
• 命名是否语义化
• 函数是否单一职责
• 注释是否充分
S - Scalability(可扩展性)
• 性能复杂度
• 并发安全性
• 资源管理(内存/连接池)
三、自动化代码质量检查
配置全面的静态分析工具链
// .eslintrc.json(TypeScript 项目)
{
"extends": [
"eslint:recommended",
"@typescript-eslint/recommended",
"@typescript-eslint/recommended-requiring-type-checking",
"plugin:security/recommended" // 安全性检查
],
"plugins": ["@typescript-eslint", "security"],
"rules": {
// 禁止 any 类型
"@typescript-eslint/no-explicit-any": "error",
// 要求 Promise 必须被处理
"@typescript-eslint/no-floating-promises": "error",
// 禁止不安全的字符串格式化到 SQL/HTML
"security/detect-possible-timing-attacks": "warn",
"security/detect-sql-injection": "error",
// 要求 await 必须在 async 函数中
"@typescript-eslint/require-await": "error",
// 禁止赋值到函数参数
"no-param-reassign": "error"
}
}
AI 代码审查提示词模板
请对以下 AI 生成的代码进行 STARS 评估:
代码:
[粘贴 AI 生成的代码]
任务背景:[这段代码要做什么]
评估要求:
1. 安全性(S):列出所有安全风险,标记严重程度
2. 可测试性(T):指出难以测试的部分,建议重构方式
3. 准确性(A):找出所有边界情况未处理的地方
4. 可读性(R):评分 1-5,指出改进点
5. 可扩展性(S):分析在 10x 数据量下的表现
给出总体评分(1-10)和最需要改进的 Top 3 问题。
四、建立代码质量门槛(Quality Gate)
# sonarcloud.yml - 代码质量门禁配置
quality_gate:
conditions:
# 新代码覆盖率必须 > 80%
- metric: new_coverage
op: GT
value: 80
# 新代码不能有安全漏洞
- metric: new_security_rating
op: LT
value: B
# 新代码不能有 Critical Bug
- metric: new_reliability_rating
op: LT
value: B
# 技术债务率 < 5%
- metric: new_sqale_debt_ratio
op: GT
value: 5
当 AI 生成的代码通过质量门禁时,才允许合并 PR。
五、AI 代码评审的人机分工
AI 负责检查(自动化):
✅ 代码风格和格式
✅ 常见安全漏洞(OWASP Top 10)
✅ 性能反模式(N+1、缺少索引)
✅ 测试覆盖率
✅ TypeScript 类型错误
人工负责判断:
✅ 业务逻辑正确性(AI 不懂你的业务)
✅ 架构合理性(是否符合整体设计)
✅ 取舍权衡(性能 vs 可读性,具体场景具体分析)
✅ 未来可维护性(代码能被下一个人理解吗)
✅ 边界异常处理(是否符合产品期望)
章节小结:AI 生成的代码是"有偏差的草稿"——它会犯特定类型的错误(API 幻觉、忽略并发、性能盲点)。掌握 STARS 评估框架,结合自动化静态分析工具,你可以快速识别 AI 代码的问题,让草稿变成可信赖的生产代码。记住:信任但要验证。