AI编程Prompt模板

在使用 AI 辅助编程的日常工作中,你可能已经遇到过这样的场景:同一段需求,换一个说法丢给 AI,产出质量天差地别。经验丰富的开发者会逐渐意识到——好的 Prompt 是 AI 编程的关键。它远比一句「帮我写个函数」复杂——它是一套结构化的表达方式,决定了 AI 能否准确理解你的意图,并在正确的约束下输出可用的代码。

这篇长文聚焦 AI 编程场景下的 Prompt 模板。我们将从 Prompt 的基本结构入手,梳理四类常用模板、三条优化主线、四大应用场景,最终给出一套可落地的编写流程和检查清单。目标是让你在面对任何编程任务时,都能快速写出一条高质量的 Prompt。

Prompt 的五个核心结构

一条面向编程的 Prompt,通常需要覆盖五个信息层。缺少任何一层,AI 都需要靠「猜」来填补空白,结果就是输出偏离预期。

结构层作用示例
角色(Role)告诉 AI 以什么身份思考,激活对应的专业知识域「你是一位资深 React 前端工程师,熟悉 Next.js 和 TypeScript」
任务(Task)明确要做什么,用一句话概括目标「实现一个带分页的文章列表组件」
上下文(Context)提供技术栈、现有代码、业务背景等约束信息「项目使用 Next.js 16 App Router,数据通过 Server Component 获取,样式用 Tailwind CSS」
要求(Requirements)列出具体的功能约束、非功能约束和禁止事项「必须支持空状态、加载态;不要引入额外状态管理库」
输出格式(Output Format)指定代码风格、文件结构、注释规范等输出形态「以单个 TSX 文件输出,导出为默认组件,每个逻辑块用中文注释标注用途」

这五层结构对应了业界常见的几个 Prompt 框架。例如 CRAFT(Context, Request, Action, Format, Tone)、RISEN(Role, Instructions, Steps, End goal, Narrowing)、以及最精简的 RTF(Role, Task, Format)。它们的共同点是:把信息从「想到什么说什么」收敛为结构化表达,减少歧义。

# 一个结构完整的 Prompt 示例
 
## 角色
你是一位精通 Python 后端开发的工程师,熟悉 FastAPI 和 SQLAlchemy。
 
## 任务
实现一个用户注册接口,包含邮箱验证和密码加密。
 
## 上下文
- 框架:FastAPI + SQLAlchemy 2.0
- 数据库:PostgreSQL
- 已有模型:User 表包含 id, email, hashed_password, created_at 字段
- 认证方案:JWT,access token 有效期 30 分钟
 
## 要求
1. 密码使用 bcrypt 加密,不要使用明文或简单 hash
2. 邮箱重复时返回 409 状态码,附带明确错误信息
3. 输入校验使用 Pydantic v2
4. 不要引入 Celery 或其他异步任务队列,邮件发送用同步 mock
 
## 输出格式
- 输出完整的 router 文件代码
- 包含 Pydantic schema 定义
- 函数级别添加 docstring,说明参数和返回值
- 错误处理使用统一的 HTTPException

四类常用 Prompt 模板

在实际开发中,AI 编程任务大致可以归为四类:代码生成、代码审查、调试排查、重构优化。每类任务对 Prompt 结构的侧重不同,下面先给出整体对比,再分别展示模板和使用建议。

模板类型核心目标结构侧重点典型触发场景
代码生成从零实现功能上下文(技术栈)+ 要求(约束边界)新功能开发、组件创建、接口实现
代码审查发现潜在问题任务(审查维度)+ 输出格式(分级标准)PR 提交前、代码质量检查、安全审计
调试排查定位和修复 Bug上下文(错误现场)+ 已排除的原因生产报错、测试失败、性能异常
重构优化改善代码质量任务(重构目标)+ 约束(不改变的部分)代码腐化、性能瓶颈、可读性提升

模板一:代码生成

代码生成是最常见的场景——从零实现一个功能、组件或接口。这类 Prompt 的重点是把约束说清楚,避免 AI 做出一堆你需要推翻重来的「通用方案」。

## 任务
实现一个倒计时 Hook:useCountdown
 
## 上下文
- 项目使用 React 18 + TypeScript
- 状态管理使用 useState + useEffect,不引入外部库
- 需要兼容 SSR(Next.js 环境)
 
## 功能要求
1. 接收目标时间戳(number)作为参数
2. 返回 { days, hours, minutes, seconds } 对象
3. 倒计时归零后自动停止定时器
4. 组件卸载时清理定时器
 
## 边界处理
- 目标时间已过期时,返回全零对象
- 传入非法值(NaN、负数)时,返回 null 并在 console.warn 输出提示
 
## 输出格式
- 单个 TypeScript 文件
- 导出 Hook 函数和返回类型接口
- 附带 2-3 个使用示例

模板二:代码审查

让 AI 审查代码时,关键是告诉它审查的维度。一句「帮我看看这段代码」会让 AI 泛泛而谈;明确审查角度后,输出才能直击要害。

## 任务
审查以下 TypeScript 代码,重点关注三个方面:
1. 类型安全性——是否存在 any 逃逸或类型断言滥用
2. 错误处理——异步操作是否有未捕获的异常
3. 性能——是否有不必要的重渲染或内存泄漏风险
 
## 代码
[粘贴代码]
 
## 输出格式
按严重程度分级输出:
- 🔴 必须修复(会导致运行时错误或数据问题)
- 🟡 建议优化(影响可维护性或性能)
- 🟢 可选改进(代码风格或更优雅写法)
 
每个问题指出具体行号、问题描述、修复建议。

模板三:调试排查

调试类 Prompt 的核心是提供完整的错误现场:错误信息、复现步骤、已排除的原因。信息越充分,AI 定位问题的准确度越高。

## 任务
排查一个生产环境中的内存泄漏问题。
 
## 现象描述
- Node.js 服务运行 48 小时后内存从 200MB 增长到 1.8GB
- 重启后内存恢复正常,但再次运行后缓慢增长
- 没有明显的 OOM crash,但接近 Node.js 默认堆上限时响应变慢
 
## 环境信息
- Node.js 20.x
- Express + Prisma + PostgreSQL
- 使用了连接池(max: 10)
 
## 已排查
- Prisma 连接池配置正常,空闲连接回收逻辑已确认
- 没有全局变量持续累积数据
- 日志中未发现异常请求模式
 
## 怀疑方向
- 事件监听器未清理
- 闭包引用导致对象无法回收
- 某个中间件每次请求创建新对象
 
## 请求
1. 分析可能的泄漏点,给出排查优先级
2. 为每个怀疑方向提供具体的检测代码或诊断命令
3. 给出修复方案的代码示例

模板四:重构优化

重构类 Prompt 需要明确重构目标和约束边界。不同目标(可读性、性能、可测试性)会导致完全不同的重构路径。

## 任务
重构以下函数,目标是提升可读性和可测试性。
 
## 当前问题
- 单个函数超过 80 行,混合了数据校验、业务计算和日志记录
- 多个 if-else 分支难以覆盖测试用例
- 依赖全局配置对象,无法独立测试
 
## 重构约束
- 保持对外接口不变(函数签名、返回值结构)
- 不引入新的外部依赖
- 重构后每个子函数行数不超过 30 行
 
## 当前代码
[粘贴代码]
 
## 输出格式
1. 先给出重构方案的简要说明(拆分为哪些函数,各自的职责)
2. 输出重构后的完整代码
3. 标注每个拆分决策的理由

Prompt 优化的三条主线

掌握了结构和模板之后,输出质量的差异主要取决于三条优化主线:具体化、示例化、迭代化

具体化:用精确描述替代模糊表达

模糊的 Prompt 是产出低质量代码的首要原因。「把这个做好」「优化一下」「处理异常情况」这类表述对 AI 几乎没有约束力。

模糊表达 ❌具体表达 ✅
做好错误处理所有数据库操作用 try-catch 包裹,捕获 Prisma KnownRequestError,返回对应 HTTP 状态码
优化性能将 O(n²) 的双层循环改为 Map 查找,目标时间复杂度 O(n)
处理边界情况输入为空数组时返回 null;数组长度超过 1000 时截断并返回警告信息
写得好一点遵循项目现有的代码风格:函数名用 camelCase,类型名用 PascalCase,不使用 enum 改用 const assertion

示例化:用输入输出锚定预期

对于复杂的逻辑,文字描述容易产生歧义。直接给出输入-输出示例,能让 AI 快速对齐你的预期,比反复解释高效得多。

## 任务
实现一个版本号比较函数
 
## 示例
输入: compareVersion("1.01", "1.1")
输出: 0  (两个版本号相等,忽略前导零)
 
输入: compareVersion("1.0.1", "1")
输出: 1  (第一个版本号更大,缺失的修订号视为 0)
 
输入: compareVersion("0.1", "1.0")
输出: -1  (第一个版本号更小)

这种写法对 AI 的约束力远超「比较两个版本号大小」。示例本身就隐含了边界规则(前导零处理、缺失位补零、返回值约定),不需要额外文字说明。

迭代化:分步逼近而非一步到位

复杂任务很少能一次得到完美结果。高效的策略是把大任务拆成多轮对话,每轮聚焦一个子目标,在前一轮输出的基础上逐步完善。

# 第一轮:确认方案
我需要实现一个文件上传功能,支持断点续传。
请先给出技术方案选型和架构设计,不要写代码。
 
# 第二轮:核心逻辑
方案确认。现在实现分片上传的核心逻辑,使用 Node.js + Busboy。
输入:文件流 + 分片大小
输出:每个分片的写入路径和校验 hash
 
# 第三轮:边界处理
在上面的基础上,补充以下边界处理:
1. 磁盘空间不足时的回滚逻辑
2. 并发上传同名文件的冲突处理
3. 分片校验失败时的重试机制
 
# 第四轮:集成和测试
将上面的代码整合为一个完整的 UploadService 类。
包含单元测试,覆盖正常上传、断点续传、分片校验失败三个场景。

迭代化的好处是:每一步的输出都在你的掌控中。如果第一轮方案就不对,你不会浪费后续三轮的时间。

四大场景的应用要点

不同的编程场景对 Prompt 的侧重要求不同。下面按前端、后端、数据库、测试四个常见场景,梳理各自的要点。

场景关键上下文常见要求容易遗漏的信息
前端开发框架版本(React/Vue/Angular)、渲染模式(CSR/SSR/SSG)、状态管理方案、UI 组件库响应式断点、无障碍(a11y)合规、浏览器兼容性暗色模式适配、国际化(i18n)预留
后端开发语言版本、框架、数据库类型、部署环境、API 风格(REST/GraphQL/gRPC)认证鉴权、日志规范、错误码约定、限流策略幂等性要求、分布式场景下的并发控制
数据库数据库类型和版本、现有 schema、数据量级、读写比例索引策略、事务隔离级别、迁移方式已有数据的兼容性、回滚方案
测试测试框架、mock 方案、现有测试结构、覆盖率目标测试粒度(单元/集成/E2E)、命名规范、fixture 策略异步测试的时序处理、环境隔离

前端场景示例

## 任务
实现一个搜索输入框组件,带防抖和搜索建议下拉
 
## 上下文
- React 18 + TypeScript + Tailwind CSS
- 搜索 API 端点:GET /api/search?q=keyword
- 防抖间隔 300ms
 
## 要求
1. 输入时显示 loading 状态
2. 下拉建议最多显示 5 条,超出显示「查看更多」
3. 键盘导航支持(上下箭头选择,回车确认,Esc 关闭)
4. 点击外部区域关闭下拉
5. 组件需要在移动端和桌面端都有良好的交互体验
 
## 输出
- 一个 SearchInput.tsx 文件
- Props 接口定义(包含 onChange、onSelect 回调)
- 不引入第三方 UI 库

后端场景示例

## 任务
实现订单创建接口,扣减库存并生成订单记录
 
## 上下文
- NestJS + TypeORM + MySQL
- 库存表 products.stock 使用乐观锁(version 字段)
- 订单状态:pending → paid → shipped → completed
 
## 要求
1. 使用数据库事务保证库存扣减和订单创建的一致性
2. 库存不足时返回 400,附带具体商品名称
3. 乐观锁冲突时自动重试一次,再次失败返回 503
4. 接口需要幂等——相同 idempotency-key 不重复创建订单

案例:从模糊 Prompt 到高质量输出

案例一:前端组件生成

初始 Prompt(模糊):

帮我写一个表格组件,要能排序和筛选。

这个 Prompt 缺少框架信息、数据结构、排序和筛选的交互细节。AI 大概率会输出一个「看起来能用但和你项目不兼容」的通用方案。

优化后 Prompt:

## 角色
你是 React 前端工程师,精通 Headless UI 模式。
 
## 任务
实现一个数据表格组件,支持列排序和多选筛选。
 
## 上下文
- Next.js 16 App Router + TypeScript
- 数据从 Server Component 获取,客户端只做排序和筛选
- 样式使用 Tailwind CSS
- 表格数据量在 50-200 行之间,不需要虚拟滚动
 
## 数据结构
interface OrderItem {
  id: string
  productName: string
  amount: number
  status: 'pending' | 'paid' | 'shipped'
  createdAt: string  // ISO 8601
}
 
## 交互要求
1. 列头点击切换排序:无排序 → 升序 → 降序 → 无排序
2. 筛选区域支持 status 多选(checkbox)
3. 排序和筛选条件通过 URL searchParams 持久化,支持分享链接
4. 筛选结果为空时显示「无匹配数据」的空状态
 
## 输出格式
- 拆分为三个组件:DataTable(容器)、SortableHeader(列头)、StatusFilter(筛选)
- 排序和筛选逻辑用自定义 Hook 封装
- 不使用任何 UI 组件库

优化后的 Prompt 把数据结构、交互细节、拆分方式全部明确,AI 的输出可以直接作为项目的起点代码,大幅减少返工。

案例二:后端接口调试

初始 Prompt(模糊):

我的接口报错了,帮我看看。 错误信息:TypeError: Cannot read properties of undefined (reading 'map')

缺少上下文。AI 只能给出「检查变量是否为 undefined」这种泛泛的建议。

优化后 Prompt:

## 任务
排查一个生产环境的 TypeError。
 
## 错误信息
TypeError: Cannot read properties of undefined (reading 'map')
    at OrderList.render (OrderList.tsx:47)
    at processTicksAndExitCallbacks (node:internal/...)
 
## 复现条件
- 仅在新用户首次访问时出现
- 刷新页面后恢复正常
- 只影响 /orders 路由
 
## 相关代码
[粘贴 OrderList.tsx 的代码]
 
## 已排查
- API 返回的 orders 字段在新用户场景下为 null(不是空数组)
- 代码中直接调用 response.data.orders.map(),未做 null 检查
 
## 请求
1. 修复空值问题
2. 检查是否有其他类似的不安全访问
3. 给出防御性编码建议,避免同类问题再次出现

提供了错误堆栈、复现条件、已排查结论后,AI 可以直接定位问题并给出精准修复,而不是泛泛地建议「加个判空」。

Prompt 编写流程

用一张流程图总结从「接到任务」到「获得可用代码」的完整过程:

适读画布 · 130%
Mermaid 流程图加载中...

流程中有两个关键决策点:任务复杂度判断和输出是否符合预期。前者决定了你是一次性写完 Prompt,还是分步迭代;后者决定了你是否需要追加约束、补充示例来缩小输出与预期之间的差距。

检查清单

在提交 Prompt 之前,逐项检查以下条目。养成这个习惯后,Prompt 质量会有稳定的提升:

  1. 角色是否明确 — 是否指定了技术领域和专长方向?
  2. 任务是否一句话能说清 — 如果目标需要多句话才能描述,说明任务粒度太大,需要拆分。
  3. 技术栈是否列全 — 语言版本、框架、关键依赖是否都写明了?
  4. 数据结构是否给出 — 涉及数据操作时,接口定义或示例数据是否提供了?
  5. 约束条件是否具体 — 「做好错误处理」是否替换为了具体的错误类型和处理方式?
  6. 边界情况是否覆盖 — 空值、越界、并发、过期等场景是否考虑到了?
  7. 输入输出示例是否有 — 对于复杂逻辑,是否给出了至少一组示例?
  8. 输出格式是否指定 — 文件名、代码风格、注释规范是否明确了?
  9. 禁止事项是否列出 — 不希望引入的库、不希望使用的模式是否标注了?
  10. 是否拆分为可迭代的步骤 — 复杂任务是否分解为多轮对话?
  11. 是否考虑了与现有代码的兼容性 — 接口签名、导入方式、命名风格是否与项目一致?
  12. 安全和性能要求是否显式声明 — AI 默认输出「能跑就行」的代码,安全和性能需要你主动要求。

小结

Prompt 模板远超死记硬背的格式,它是一套把模糊需求转化为精确指令的思维习惯。五层结构(角色、任务、上下文、要求、输出格式)提供骨架,四类模板(生成、审查、调试、重构)覆盖日常场景,三条优化主线(具体化、示例化、迭代化)持续提升输出质量。

对于 AI 产品出海团队而言,Prompt 模板还有一层更实际的价值:当团队成员使用统一的 Prompt 结构时,AI 产出的代码风格和一致性会显著提升,Review 成本随之下降。把高质量的 Prompt 模板沉淀为团队资产,和沉淀代码规范、组件库一样,是提升工程效率的有效手段。

参考资料