提示工程for程序员: 写出让AI理解的完美Prompt
提示工程for程序员:写出让AI理解的完美Prompt
前言
在使用AI编程助手(如Cursor、Claude Code、GitHub Copilot)时,很多程序员遇到的问题是:不知道如何准确地向AI描述需求。他们往往会写出模糊、不完整或者误导性的提示(Prompt),导致AI生成的代码不符合预期,甚至引入新的Bug。
提示工程(Prompt Engineering)不仅仅是"会提问",更是一门精确地表达编程意图的艺术。在这篇文章中,我将分享程序员专属的提示工程技巧,帮助你写出让AI"秒懂"的完美Prompt。
什么是好的Prompt?
在深入技巧之前,让我们先明确什么是"好的Prompt":
好的Prompt的特征
- 明确性(Specific):清楚地说明你想要什么
- 完整性(Complete):提供所有必要的上下文信息
- 结构性(Structured):使用清晰的结构组织信息
- 可验证(Verifiable):生成的结果可以轻松验证正确性
不好的Prompt vs 好的Prompt
| 不好的Prompt | 好的Prompt |
|---|---|
| “帮我写一个排序函数” | “用JavaScript实现一个快速排序函数,支持数字数组排序,时间复杂度O(n log n),包含详细的注释和测试用例” |
| “优化这段代码” | “优化以下代码的性能,重点关注:1. 时间复杂度 2. 内存使用 3. 可读性。当前代码处理10000条数据时耗时5秒,目标是降到1秒以内” |
| “修复Bug” | “修复以下代码中的空指针异常问题,问题出现在line 45,当用户输入为空时触发。请提供修复方案和测试用例” |
技巧一:使用结构化模板
为什么需要模板?
很多程序员在写Prompt时容易遗漏关键信息。使用模板可以确保你每次都提供完整的信息。
通用编程任务模板
# 任务类型:[功能开发/ Bug修复/ 代码重构/ 性能优化/ 其他] ## 任务描述 [清晰、简洁地描述你要做什么] ## 技术栈 - 编程语言:[如 JavaScript/ Python/ Java] - 框架/库:[如 React/ Express/ Django] - 版本要求:[如 Node.js 18+] ## 功能需求 1. [需求1] 2. [需求2] 3. [需求3] ## 非功能性需求 - 性能要求:[如响应时间 < 200ms] - 安全要求:[如防止SQL注入] - 可维护性:[如代码注释覆盖率 > 80%] ## 输入/输出规范 - 输入:[描述输入参数和格式] - 输出:[描述输出结果和格式] - 错误处理:[描述各种错误情况的处理方式] ## 约束条件 - [约束1:如必须使用纯SQL,不能用ORM] - [约束2:如需要兼容IE11] ## 参考示例 [如果有类似的功能或代码示例,粘贴在这里] ## 验收标准 1. [标准1:如所有测试用例通过] 2. [标准2:如代码符合ESLint规范] 3. [标准3:如性能达到预期]实战示例:使用模板
任务:实现一个用户认证中间件
使用模板的Prompt:
# 任务类型:功能开发 ## 任务描述 实现一个Express.js的JWT认证中间件,用于保护API端点 ## 技术栈 - 编程语言:JavaScript (Node.js 18+) - 框架:Express.js 4.x - 依赖:jsonwebtoken, dotenv ## 功能需求 1. 从Authorization header中提取JWT token 2. 验证token的有效性(签名、过期时间) 3. 将解码后的用户信息附加到req.user 4. 如果token无效或过期,返回401 Unauthorized 5. 支持可选的认证(某些端点可以不需要认证) ## 非功能性需求 - 性能要求:中间件执行时间 < 10ms - 安全要求:使用HS256算法,secret存储在环境变量 - 可维护性:添加详细的JSDoc注释 ## 输入/输出规范 - 输入:HTTP请求,包含Authorization: Bearer <token> header - 输出:如果认证成功,req.user包含{ id, email, role };如果失败,返回401 JSON响应 - 错误处理:token过期返回401 with error: "Token expired";token无效返回401 with error: "Invalid token" ## 约束条件 - 不能使用第三方认证中间件(如passport) - 需要支持黑名单机制(某些token被主动注销) ## 参考示例 // 使用方式 app.get('/api/profile', authMiddleware, (req, res) => { res.json(req.user); }); ## 验收标准 1. 所有测试用例通过(包括正常和异常场景) 2. 代码符合ESLint Airbnb规范 3. 中间件不影响其他中间件执行 4. 100% 测试覆盖率Claude生成的结果(节选):
// middleware/auth.jsconstjwt=require('jsonwebtoken');const{promisify}=require('util');/** * JWT认证中间件 * @param {Object} options - 配置选项 * @param {boolean} options.optional - 是否为可选认证(默认false) * @returns {Function} Express中间件 */constauthMiddleware=(options={})=>{returnasync(req,res,next)=>{try{// 1. 提取tokenconstauthHeader=req.headers.authorization;if(!authHeader||!authHeader.startsWith('Bearer ')){if(options.optional){returnnext();}returnres.status(401).json({error:'No token provided'});}consttoken=authHeader.split(' ')[1];// 2. 验证tokenconstdecoded=awaitpromisify(jwt.verify)(token,process.env.JWT_SECRET);// 3. 检查黑名单(可选)if(awaitisTokenBlacklisted(token)){returnres.status(401).json({error:'Token revoked'});}// 4. 附加用户信息到reqreq.user=decoded;next();}catch(error){if(error.name==='TokenExpiredError'){returnres.status(401).json({error:'Token expired'});}if(error.name==='JsonWebTokenError'){returnres.status(401).json({error:'Invalid token'});}returnres.status(500).json({error:'Authentication failed'});}};};module.exports=authMiddleware;技巧二:提供完整的上下文
问题:上下文不足导致误解
不好的Prompt:
优化这个函数: function getData() { // ... 一些代码 }为什么不好?
- AI不知道这个函数的用途
- AI不知道输入是什么格式
- AI不知道性能瓶颈在哪里
解决方案:提供完整的上下文
好的Prompt:
我有一个函数用于从MongoDB获取用户数据,但性能很慢(处理1000条记录需要5秒)。 请帮我优化。 ## 上下文信息 ### 函数代码 \`\`\`javascript async function getUsers() { const users = []; const cursor = db.collection('users').find(); while (await cursor.hasNext()) { const user = await cursor.next(); users.push(user); } return users; } \`\`\` ### 数据规模 - 用户表有10万条记录 - 每个用户文档大小约5KB - 经常需要获取所有用户(用于导出功能) ### 性能要求 - 目标:处理时间 < 1秒 - 内存限制:< 100MB ### 环境问题 - MongoDB 4.4 - Node.js 18 - 运行在4核8GB服务器上 ## 请提供 1. 优化后的代码 2. 性能对比分析 3. 可能的权衡(如内存 vs 速度)技巧三:使用分步引导
为什么需要分步引导?
对于复杂的任务,一次性描述所有需求可能会让AI"迷失方向"。分步引导可以让AI逐步理解你的意图。
实战示例:分步开发一个完整的API
第一步:明确整体架构
我要开发一个博客系统的API,使用Node.js + Express + MongoDB。 请先帮我设计整体的项目结构和API端点规划,不需要写具体实现代码。 功能需求: - 用户注册/登录 - 文章的CRUD - 评论功能 - 标签分类 - 搜索功能Claude的回复:
## 项目结构 \`\`\` blog-api/ ├── src/ │ ├── config/ │ │ └── database.js │ ├── models/ │ │ ├── User.js │ │ ├── Post.js │ │ ├── Comment.js │ │ └── Tag.js │ ├── routes/ │ │ ├── auth.js │ │ ├── posts.js │ │ ├── comments.js │ │ └── tags.js │ ├── middleware/ │ │ ├── auth.js │ │ ├── validator.js │ │ └── errorHandler.js │ ├── controllers/ │ │ ├── authController.js │ │ ├── postController.js │ │ └── commentController.js │ └── utils/ │ ├── jwt.js │ └── validator.js ├── tests/ ├── .env ├── package.json └── server.js \`\`\` ## API端点规划 ### 认证相关 - POST /api/auth/register - 用户注册 - POST /api/auth/login - 用户登录 - POST /api/auth/logout - 用户登出 ### 文章相关 - GET /api/posts - 获取文章列表(支持分页、筛选、排序) - GET /api/posts/:id - 获取单篇文章 - POST /api/posts - 创建文章(需要认证) - PUT /api/posts/:id - 更新文章(需要认证) - DELETE /api/posts/:id - 删除文章(需要认证) ### 评论相关 - GET /api/posts/:postId/comments - 获取文章评论 - POST /api/posts/:postId/comments - 添加评论(需要认证) - DELETE /api/comments/:id - 删除评论(需要认证) ### 标签相关 - GET /api/tags - 获取所有标签 - POST /api/tags - 创建标签(需要认证) \`\`\` **第二步:逐步开发**好的,按照这个结构设计。现在请帮我实现用户注册功能(auth.js路由和authController.js),要求:
- 密码使用bcrypt加密
- 邮箱验证(发送验证邮件)
- 输入验证(使用express-validator)
- 错误处理
**第三步:迭代优化**代码看起来不错。现在请添加以下功能:
- 速率限制(防止恶意注册)
- 支持OAuth2.0登录(Google、GitHub)
- 添加单元测试
## 技巧四:使用负面示例 ### 为什么需要负面示例? 告诉AI"不要做什么"和告诉AI"要做什么"一样重要。负面示例可以帮助AI避免常见的错误。 ### 实战示例 **Prompt:**请实现一个函数,用于解析用户输入的日期字符串。
正面示例(应该支持的格式)
- “2026-06-12”
- “2026/06/12”
- “12-06-2026”
- “June 12, 2026”
- “2026年6月12日”
负面示例(不应该支持或需要报错)
- “2026-13-45” (无效日期)
- “abc” (无法解析)
- “2026-06-12” (XSS攻击)
- null/undefined (需要处理边界情况)
要求
- 使用Day.js库(不要使用moment.js)
- 对于无法解析的输入,抛出明确的错误
- 防止XSS攻击(清理输入)
- 支持时区转换
## 技巧五:请求多种解决方案 ### 为什么需要多种方案? 不同的场景可能需要不同的解决方案。让AI提供多个选项,你可以根据实际需求选择。 ### 实战示例 **Prompt:**我需要在Node.js中实现文件上传功能,请提供3种不同的实现方案,并对比它们的优缺点:
需求
- 支持多文件上传
- 限制文件类型(只允图片)
- 限制文件大小(最大5MB)
- 需要生成缩略图
方案要求
- 方案1:使用multer中间件
- 方案2:使用AWS S3存储
- 方案3:使用云存储(如Cloudinary)
对比维度
- 实现复杂度
- 性能
- 成本
- 可扩展性
- 适用场景
**Claude的回复(节选):** ```markdown ## 方案对比 | 维度 | 方案1:Multer + 本地存储 | 方案2:AWS S3 | 方案3:Cloudinary | |------|------------------------|--------------|------------------| | 实现复杂度 | 低 | 中 | 低 | | 性能 | 中(受服务器带宽限制) | 高 | 高 | | 成本 | 低(只服务器成本) | 中(按使用量付费) | 中(免费额度有限) | | 可扩展性 | 低(受服务器存储限制) | 高 | 高 | | 适用场景 | 小型项目、原型开发 | 大型项目、高并发 | 需要图片处理功能 | ## 推荐 - 如果是个人项目或原型:使用方案1 - 如果需要完全控制:使用方案2 - 如果需要强大的图片处理功能:使用方案3技巧六:迭代优化Prompt
Prompt工程是一个迭代过程
很少有一次就能写出完美Prompt的情况。你需要根据AI的回复不断调整和优化你的Prompt。
迭代流程
初始Prompt ↓ AI生成结果 ↓ 评估结果 ↓ 识别问题(如:缺少上下文、需求不明确、格式不符合要求) ↓ 优化Prompt(添加更多信息、调整结构、明确格式要求) ↓ 重新生成 ↓ 满意为止实战示例:迭代优化
初始Prompt:
写一个爬虫AI回复:生成了一个简单的Python爬虫,但没有处理异常,没有遵守robots.txt,没有限速…
问题识别:
- 需求太宽泛
- 没有指定网站
- 没有提到法律和道德约束
优化后的Prompt:
实现一个Python爬虫,用于抓取技术博客文章(如Medium、Dev.to)。 ## 具体要求 1. 遵守robots.txt规则 2. 添加请求限速(避免对目标网站造成压力) 3. 处理常见异常(如404、超时、网络错误) 4. 使用User-Agent头部 5. 数据存储在SQLite数据库中 6. 支持断点续爬 ## 技术栈 - Python 3.9+ - requests + BeautifulSoup4 - SQLite3 ## 法律与道德要求 - 只爬取公开可访问的内容 - 尊重网站的ToS - 不对网站造成负担 - 不爬取个人隐私信息 ## 输出格式 生成完整的Python代码,包含: 1. 爬虫主类 2. 数据存储模块 3. 异常处理 4. 单元测试 5. 使用说明高级技巧:使用Prompt Chain
什么是Prompt Chain?
Prompt Chain是将一个复杂任务分解为多个简单的子任务,每个子任务的输出作为下一个子任务的输入。
实战示例:开发一个完整的RESTful API
Chain 1:需求分析
我需要开发一个在线书店的RESTful API。 请帮我进行需求分析,输出: 1. 核心功能列表 2. 数据模型设计 3. API端点规划 4. 技术栈建议Chain 2:数据模型实现
根据以下数据模型设计,使用Mongoose实现Schema定义: [粘贴Chain 1的输出中的数据模型部分] 要求: - 添加必要的索引 - 定义虚拟字段 - 添加实例方法 - 添加数据验证Chain 3:API端点实现
根据以下API端点规划,实现具体的路由和控制器: [粘贴Chain 1的输出中的API端点部分] 要求: - 使用Express.js - 添加输入验证 - 实现错误处理 - 添加JWT认证Chain 4:测试
为上述实现的API编写完整的测试用例,使用Jest + Supertest, 覆盖所有端点的正常和异常场景。常见错误与避免方法
错误1:需求描述模糊
错误示例:
优化代码正确做法:
明确说明优化目标、当前性能、期望性能
错误2:没有提供足够的上下文
错误示例:
修复这个Bug正确做法:
提供完整的错误信息、堆栈跟踪、相关代码
错误3:一次要求太多
错误示例:
开发一个完整的电商网站,包含前端和后端正确做法:
分解为多个小任务,逐步完成
错误4:没有指定输出格式
错误示例:
解释这段代码的原理正确做法:
指定输出格式(如:使用Mermaid流程图 + 文字说明)
工具推荐
1. Prompt模板管理器
创建一个prompt-templates.md文件,保存常用的Prompt模板:
# 代码生成模板 \`\`\` 任务:[任务描述] 技术栈: - [技术1] - [技术2] 功能需求: 1. [需求1] 2. [需求2] 输出格式:[如:完整代码 + 测试用例 + 使用说明] \`\`\` # 代码审查模板 \`\`\` 请审查以下代码,重点关注: 1. 安全问题 2. 性能问题 3. 代码规范 代码: [粘贴代码] \`\`\`2. 使用Cursor的Snippet功能
在Cursor中,你可以保存常用的Prompt为Snippet,随时调用。
总结
提示工程for程序员的核心是:精确、完整、结构化地表达编程意图。
关键要点:
- 使用模板:确保不遗漏关键信息
- 提供上下文:让AI理解你的项目和需求
- 分步引导:将复杂任务分解为简单步骤
- 使用负面示例:告诉AI不要做什么
- 请求多种方案:获得更全面的视角
- 迭代优化:根据结果不断改进Prompt
记住:好的Prompt = 好的代码。投资时间学习提示工程,将会大大提高你的AI编程效率。
延伸阅读
- 《Prompt Engineering Guide》- 全面的提示工程指南
- 《The Art of Asking AI》- 如何有效地向AI提问
- OpenAI Prompt Engineering最佳实践
