Prompt 工程实战:代码生成的5个层次

你有没有遇到过这种场景:同事用 AI 写出了优雅、可维护的代码,而你用同一个工具,得到的是一堆需要大改的垃圾——明明用的是同款模型?

差距不在工具,在 Prompt。

我在过去几个月里,系统性地测试了 Cursor、GitHub Copilot、Claude、GPT-4 等 AI 编程工具,总结出了一套代码生成 Prompt 的5个层次。从”勉强能用”到”超出预期”,每一层都有具体的技巧和模板。


第0层:随手一问(大多数人停留在这里)

1
帮我写一个登录函数

这是最常见的 Prompt 写法。结果通常是:

  • 语言/框架不对(Python写了,但你用的是Node.js)
  • 缺少错误处理
  • 密码明文存储(安全炸弹)
  • 变量命名像随机字符串

问题根源:AI 没有上下文,只能靠猜。猜对了是运气,猜错了是你的损失。


第1层:给出基本上下文

好的 Prompt 首先要回答三个问题:技术栈是什么?输入输出是什么?有什么约束?

1
2
3
4
用 Node.js + Express 写一个用户登录接口。
输入:POST /api/login,body 包含 email 和 password
输出:返回 JWT token,有效期24小时
要求:密码用 bcrypt 对比,失败返回 401 错误

加了上下文之后,AI 生成的代码立刻从”可能能用”变成了”基本能用”。

提升技巧

  • 明确技术栈版本(Node 18, React 18, Python 3.11)
  • 描述清楚输入输出格式
  • 列出不可协商的约束条件

第2层:注入代码风格和项目规范

同一个功能,在不同团队里有完全不同的写法。AI 默认给你的是它训练数据里的”平均风格”,而不是你项目的风格。

方法一:提供现有代码片段作为风格参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
参考以下现有代码的风格写一个新的 userService:

// 现有 orderService.ts 示例
export class OrderService {
constructor(private readonly db: Database) {}

async findById(id: string): Promise<Order | null> {
try {
return await this.db.query('SELECT * FROM orders WHERE id = ?', [id]);
} catch (error) {
logger.error('findById failed', { id, error });
throw new ServiceError('ORDER_NOT_FOUND');
}
}
}

请用相同的模式实现 UserService,包含 findByEmail 和 updateProfile 方法。

方法二:在 Cursor 中使用 .cursorrules 文件

在项目根目录创建 .cursorrules,AI 会自动遵守:

1
2
3
4
5
6
# 项目约定
- 使用 TypeScript strict 模式
- 所有异步函数必须有 try/catch
- 错误统一用 AppError 类抛出,不直接 throw Error
- 日志用 logger.info/error,不用 console.log
- 函数命名:动词+名词(getUserById, createOrder)

这一层的核心:让 AI 融入你的项目,而不是让你的项目适应 AI 的输出。


第3层:分解复杂任务 + 渐进式构建

很多人拿到一个复杂需求,直接让 AI “一口气写完”,结果往往是一个看起来完整、实际上漏洞百出的代码块。

正确做法:把大任务拆成小步骤,逐步验证。

以”实现一个购物车模块”为例:

❌ 错误做法

1
帮我实现一个完整的购物车功能,包括添加商品、删除商品、修改数量、计算总价、应用优惠券、结算……

✅ 正确做法(分步骤)

1
2
3
步骤1
先帮我定义购物车的数据结构(TypeScript interface),
包含:商品列表、总数量、总价,先不考虑优惠券。

(验证数据结构合理后继续)

1
2
3
步骤2
基于上面的 CartItem 接口,实现 addItemremoveItem 方法,
需要处理商品已存在时数量+1的情况。

(测试通过后继续)

1
2
3
4
5
步骤3:
现在加入优惠券逻辑。支持两种类型:
- 固定折扣(discount: fixed,扣减固定金额)
- 百分比折扣(discount: percentage,按比例打折)
在已有的 CartService 基础上扩展,不要重写现有方法。

分步骤的好处

  1. 每一步都可以验证,错误被隔离
  2. 后续步骤可以基于已验证的代码继续
  3. AI 的注意力集中在小任务上,质量更高

第4层:角色设定 + 思维链激活

这一层进入”高阶玩家”区域。通过角色设定,让 AI 以专家视角审视代码;通过思维链,让 AI 先分析再动手。

角色设定示例

1
2
3
4
5
6
7
8
9
10
11
你是一位有10年经验的后端架构师,特别关注代码的可维护性和安全性。

请帮我 Review 以下登录接口代码,从以下维度给出具体意见:
1. 安全漏洞(SQL注入、XSS、暴力破解防护)
2. 错误处理是否完善
3. 性能隐患(N+1查询、缺少缓存)
4. 可维护性(命名、注释、模块化)

然后给出修改后的完整代码。

[粘贴你的代码]

思维链激活(在要求 AI 生成复杂代码前,先让它分析):

1
2
3
4
5
6
7
8
我需要实现一个高并发的秒杀系统。

在写代码之前,请先:
1. 分析主要的技术难点(超卖问题、数据库压力、请求洪峰)
2. 提出3个可行的技术方案并比较优劣
3. 推荐最适合中小团队的方案,说明理由

然后再实现你推荐的方案。

这种方式让 AI 先”想明白”再动手,而不是盲目输出代码。质量提升非常显著。


第5层:迭代优化 + 测试驱动

最高层次是把 AI 当成一个协作伙伴,进入真正的迭代开发循环。

模式一:TDD with AI(测试驱动开发)

先让 AI 写测试,再让它写实现,再让它对比是否通过:

1
2
3
4
5
6
7
8
9
第一步:为以下函数规格写 Jest 测试用例(不要写实现):

函数名:calculateDiscount
输入:originalPrice(number), discountCode(string)
规格:
- 代码 "SAVE10"9
- 代码 "SAVE20"8
- 无效代码返回原价
- 价格不能为负数,否则抛出 Error

(获得测试用例后)

1
2
现在基于以上测试用例,实现 calculateDiscount 函数,
确保所有测试能通过。

模式二:代码互相审查

生成代码后,换一个角度让 AI 挑自己的毛病:

1
2
3
以下是你刚才生成的代码。
现在请扮演一个严格的 Code Reviewer,找出至少3个可以改进的地方,
并给出改进后的版本。

汇总:5层 Prompt 对比

层次 特征 代码质量 适用场景
第0层 无上下文 能跑但需大改 学习/探索
第1层 技术栈+输入输出 基本可用 日常开发
第2层 风格规范+项目约定 符合项目标准 团队协作
第3层 分步骤渐进构建 高质量,可维护 复杂功能
第4层 角色+思维链 专家级审视 架构设计/Review
第5层 TDD+迭代优化 接近生产可用 核心模块

写在最后

AI 编程工具本质上是一个能力放大器。你输入的 Prompt 质量决定了它能把你放大多少倍。

停留在第0层的人,只是用 AI 代替了 Google 搜索;到达第5层的人,已经在用 AI 构建真实产品。

这5个层次不是要你每次都写长篇 Prompt——而是根据任务复杂度,选择合适的层次。简单的代码片段用第1层就够了;设计核心模块时,花5分钟写一个第4层的 Prompt,省下的是5小时的 Debug 时间。


你现在常用第几层?欢迎在评论区聊聊你的 Prompt 技巧 👇

本文是「AI + 编程」系列第4篇,系列持续更新中。上一篇:OpenCode 完全使用指南


Prompt 工程实战:代码生成的5个层次
https://www.ohtudou.top/2026/03/29/2026-03-29-prompt-engineering-for-code/
作者
Tudo
发布于
2026年3月29日
许可协议