第4章:写好Prompt的5个黄金法则——让AI从“听不懂”到“一次到位”

第4章:写好Prompt的5个黄金法则——让AI从“听不懂”到“一次到位” 本章你将收获无效Prompt vs 高效Prompt的15组真实对比案例看完秒懂5个核心法则清晰角色、充分上下文、输出约束、迭代纠错、模板沉淀30可直接复用的Prompt模板按场景分类代码生成、重构、测试、文档一个能直接贴到团队Wiki的《Prompt编写规范》我的踩坑实录那些让AI疯狂“胡编”的错误问法4.1 一个让我尴尬了整天的Prompt失败案例去年夏天我接手了一个维护项目里面有一段巨长的存储过程没人敢动。我试着用AI帮忙优化在Cursor里打了这样一句话“帮我优化这个SQL存储过程。”AI回了我一大段“优化建议”内容无非是“使用索引、避免SELECT *、分解复杂查询”——全是教科书上抄来的东西跟我的具体代码毫无关系。更气人的是它甚至在回答末尾加了一句“请提供具体代码以便进一步分析”。我明明已经把代码贴在对话框里了它根本没“看到”。后来我才明白AI不是人它不会主动去“翻”上下文。你给的代码必须明确告诉它“请分析下面的代码”。你想要的输出格式必须写在Prompt里。甚至你的角色设定都会影响它回答的角度。那天我花了3个小时把那600行存储过程手工拆成了7个小函数。如果我一开始就学会写一个好Prompt可能30分钟就搞定了。这一章我把我两年多总结的5条黄金法则全部拆出来。每一个法则都配了“错误示例”和“正确示例”还有可以直接复制的模板。你不需要成为Prompt专家你只需要记住这5条你的AI使用体验就会有质的飞跃。4.2 法则一设定角色——让AI“扮演”正确的专家AI不知道你的专业背景也不知道你希望它用哪种身份回答问题。默认情况下它的回答是“通用型”的什么都懂一点但什么都不精。4.2.1 为什么角色设定如此关键角色AI的回答风格适合场景不设定角色通用、笼统、啰嗦闲聊、科普资深后端工程师关注性能、安全、设计模式、错误处理生产级代码前端架构师关注组件复用、状态管理、响应式设计UI开发技术面试官会追问细节考察深度准备面试代码审查员会挑毛病指出潜在bugCode Review4.2.2 错误示例 vs 正确示例错误❌帮我写一个用户登录的API。AI可能给你一个超级简化的版本没有密码哈希、没有JWT、没有错误处理——根本不能用。正确✅带角色设定你是一位资深后端工程师擅长Node.js Express。请帮我写一个用户登录的API。 要求 - 使用bcrypt验证密码 - 使用jsonwebtoken生成token有效期7天 - 包含完整的错误处理用户不存在、密码错误、数据库异常 - 返回格式统一为 { code, message, data } - 需要写JSDoc注释你看出差别了吗没有角色时AI把你当成“初学者”给你的也是“教学级代码”。有了角色设定AI会切换到“生产级”模式考虑得更周全。4.2.3 5个常用的角色Prompt模板可直接复制1. 后端开发你是一位资深后端工程师有5年以上生产环境经验。请生成以下代码要求关注安全性防SQL注入、XSS、性能索引、缓存、错误处理和日志。2. 前端开发你是一位资深前端工程师擅长React/Vue和现代CSS。请生成以下UI组件要求响应式设计、无障碍支持、性能优化避免不必要的重渲染、完整的TypeScript类型。3. 测试工程师你是一位测试专家精通单元测试和集成测试。请为以下代码生成测试用例要求覆盖正常路径、边界条件、异常情况使用描述性的测试名称。4. 代码审查员你是一位严格的代码审查员。请审查以下代码指出安全漏洞、性能问题、可维护性问题、代码异味。每条问题给出具体行号和修改建议。5. 技术架构师你是一位技术架构师。请分析以下需求给出技术选型建议和架构设计包括模块划分、数据流向、关键接口、技术栈选型理由。4.2.4 我的实际案例有一次我要设计一个分布式锁自己脑子里只有个大概。我用了角色设定Prompt“你是一位资深架构师有多年高并发经验。请设计一个基于Redis的分布式锁要求支持自动续期、可重入、阻塞等待。请给出完整的Node.js实现并解释每个关键函数的设计思路。”AI给了我一个完整的实现包括Redlock算法的简化版、Lua脚本保证原子性、以及一个我之前没考虑到的“锁续期”机制。这个方案后来直接用在生产环境跑了几个月没出问题。一句话总结别让AI猜你的水平直接告诉它你是谁它就会给你对等的答案。4.3 法则二提供充分上下文——代码、错误信息、预期目标三要素AI不会读心术。你给它一段报错它不知道你的项目结构你给它一段代码它不知道这段代码的目的是什么。你必须主动告诉它“背景信息”。4.3.1 三要素清单要素说明示例代码相关的代码片段不要全项目贴只贴关键部分报错的函数、调用栈涉及的函数错误信息完整的错误堆栈不要只复制最后一行TypeError: Cannot read property map of undefined 堆栈预期目标你想达到的效果“希望点击按钮后能正常显示列表”4.3.2 错误示例 vs 正确示例错误❌这段代码报错了帮我看看。 [粘贴了一整段300行的代码]AI会被淹没不知道该关注哪里。而且你没有提供错误信息它只能瞎猜。正确✅以下是我的Node.js代码片段第45-60行在执行到第58行时报错错误信息如下。我的预期是用户登录成功后返回用户信息和token。 代码 [粘贴相关代码] 错误信息 TypeError: Cannot read property id of undefined at app.post (/app/routes/auth.js:58:23) at Layer.handle [as handle_request] (/node_modules/express/...) 请帮我分析为什么user可能是undefined应该在哪里加空值判断为什么这样更好限定了代码范围45-60行AI不会分心提供了完整错误信息和行号AI能精确定位说明了预期目标AI知道要帮你“修好登录流程”而不是“解释代码”4.3.3 利用Cursor的“”指令快速添加上下文Cursor有一个特别好用的功能在聊天框里输入可以引用文件、符号、代码块。我平时最常用的几个指令效果使用场景File:xxx.js把整个文件内容作为上下文重构整个模块Symbol:getUser只引用某个函数修改单个函数时Code: 选中代码引用选中部分最常见的用法Folder:src/utils引用整个文件夹需要Pro版跨文件重构真实场景有一次我想让AI帮我给一个老项目加TypeScript类型。我直接在Cursor聊天框里敲“请根据这个文件的代码生成对应的TypeScript接口定义。File:services/user.js”AI自动读取了整个文件然后生成了UserService、User、CreateUserDTO等完整的类型定义。省了我半小时手写。4.3.4 我自己用的“上下文模板”现在每次问AI问题我都会用一个固定的模板确保三要素齐全## 问题背景 [一句话说明我要做什么] ## 相关代码 [粘贴代码只贴关键部分不超过50行] ## 错误信息如果有 [粘贴完整堆栈] ## 预期目标 [清晰描述我想要的效果] ## 约束条件如果有 [比如“不要修改其他函数”、“兼容Node 14”]这个模板我存在飞书文档里每次需要问复杂问题时复制出来填空。刚开始觉得有点麻烦养成习惯后回答质量提升非常明显。4.4 法则三明确输出约束——格式、长度、风格、安全AI默认的输出风格是“自由发挥”——它会解释、会啰嗦、会给出多个方案。很多时候你只需要它输出“纯代码”或“一份清单”你必须明确说出来。4.4.1 输出约束的类型约束类型命令示例效果格式约束“输出纯代码不要解释”AI只输出代码块没有前因后果长度约束“答案控制在200字以内”避免啰嗦风格约束“使用箭头函数不要function声明”符合你的代码规范安全约束“不要硬编码API密钥使用环境变量”生成生产级代码边界约束“添加错误处理考虑输入为空的场景”代码更健壮4.4.2 错误示例 vs 正确示例错误❌写一个fetch请求调用天气API。AI会给你一段带解释的示例可能还会教你如何注册API Key。你真正需要的是直接能用的代码。正确✅带输出约束请写一个fetch请求调用天气API接口地址https://api.weather.com/v1/current?cityBeijing。 要求 - 输出纯代码不要解释 - 使用async/await - 添加try-catch错误处理 - API Key从环境变量process.env.WEATHER_API_KEY读取 - 返回JSON数据AI只输出代码没有任何啰嗦的文字。你可以直接复制进项目。4.4.3 5个常用输出约束模板1. 只要代码输出纯代码不要任何解释文字代码用标记。2. 只要表格输出Markdown表格不要其他文字。3. 只要清单输出无序列表每条占一行不要额外解释。4. 代码规范约束代码要求ES6语法、使用const/let、箭头函数、模板字符串、解构赋值。5. 安全约束不要硬编码密码/密钥改用环境变量使用参数化查询防止SQL注入对用户输入做转义。4.4.4 一个让我后悔没加约束的案例有一次我问AI“帮我优化这个慢查询。”AI热情地给我分析了3页纸从索引讲到分库分表洋洋洒洒2000字。我翻了半天才从最后一段找到它真正改的SQL语句。后来我改成“请直接输出优化后的SQL语句不要解释。在SQL后面用--注释说明改了哪里。”这一次AI只输出了两段SQL和简短注释我5秒就拿到了想要的东西。记住AI不是你的老师是你的工具。你完全可以命令它“闭嘴只给答案”。4.5 法则四迭代纠错——没有完美的第一次提问别指望第一次提问AI就给你完美答案。它是概率模型第一次输出的内容可能需要2-3轮对话才能调到最佳。4.5.1 我常用的3轮纠错流程第1轮粗略提问快速拿到一个可用的版本写一个函数把数组中的重复元素去掉。AI可能会给出一个用Set的简单实现。第2轮增加约束提升质量上面的函数很好但需要增加两个功能 1. 保留原数组的顺序 2. 允许传入比较函数用于对象数组去重 请修改代码。第3轮格式优化适配项目代码很好请按以下风格重写 - 使用TypeScript - 添加JSDoc注释 - 导出函数 - 添加单元测试示例4.5.2 纠错对话的常用指令场景指令看不懂“请解释一下第X行是什么意思”需要改“把第X行的YYY改成ZZZ重新输出完整代码”加功能“在现有代码基础上增加XXX功能”改风格“用Promise风格重写不要async/await”简化“去掉无关代码只保留核心逻辑”扩展示例“再加一个使用示例”4.5.3 一次真实的迭代过程附完整对话第1问我“写一个React Hook监听窗口大小变化。”AI答import{useState,useEffect}fromreact;functionuseWindowSize(){const[size,setSize]useState({width:window.innerWidth,height:window.innerHeight});useEffect((){consthandleResize(){setSize({width:window.innerWidth,height:window.innerHeight});};window.addEventListener(resize,handleResize);return()window.removeEventListener(resize,handleResize);},[]);returnsize;}这个版本能用但缺少SSR兼容且window在服务端不存在。第2问我“这个Hook在Next.js中会报错‘window is not defined’请加上SSR兼容。”AI答import{useState,useEffect}fromreact;functionuseWindowSize(){const[size,setSize]useState({width:typeofwindow!undefined?window.innerWidth:0,height:typeofwindow!undefined?window.innerHeight:0});useEffect((){if(typeofwindowundefined)return;consthandleResize(){setSize({width:window.innerWidth,height:window.innerHeight});};window.addEventListener(resize,handleResize);return()window.removeEventListener(resize,handleResize);},[]);returnsize;}SSR兼容有了但初始值0可能不合适而且没有防抖。第3问我“很好。再加两个功能1) 添加防抖避免频繁更新2) 初始值改为null在客户端挂载后再设置实际尺寸。”AI答import{useState,useEffect}fromreact;import{debounce}fromlodash;// 或自己实现防抖functionuseWindowSize(debounceMs200){const[size,setSize]useState(null);useEffect((){if(typeofwindowundefined)return;consthandleResizedebounce((){setSize({width:window.innerWidth,height:window.innerHeight});},debounceMs);// 立即执行一次获取初始值handleResize();window.addEventListener(resize,handleResize);return(){handleResize.cancel();window.removeEventListener(resize,handleResize);};},[debounceMs]);returnsize;}完美可以直接用于生产。你看经过3轮对话代码从“能跑”进化到了“生产级”。如果你的第一版不满意不要着急继续追问即可。4.6 法则五沉淀模板——把高频需求固化让团队复用如果你总是问AI类似的问题比如“写一个React组件”“写一个Express接口”为什么不把它们做成模板这样下次只需要填空不用重新组织语言。4.6.1 我自己积累的5个高频模板可直接复制模板1生成React组件请生成一个React组件功能{{描述}}。 要求 - 使用函数组件和Hooks - 使用TypeScript定义Props类型 - 包含加载状态、错误状态 - 使用TailwindCSS样式 - 输出纯代码模板2生成Express API请生成一个Express路由方法{{GET/POST}}路径{{/api/xxx}}。 功能{{描述}}。 要求 - 使用async/await - 添加try-catch错误处理 - 返回统一格式 { code, message, data } - 添加JSDoc注释模板3分析错误日志以下是错误日志请分析根本原因并提供修复方案。 错误信息 {{粘贴日志}} 代码上下文 {{粘贴相关代码}} 我的环境{{Node版本/浏览器版本}}模板4写单元测试请为以下代码生成Jest单元测试。 代码 {{粘贴函数}} 要求 - 覆盖正常路径、边界条件、异常情况 - 使用describe/it结构 - 测试名称清晰描述预期行为模板5代码审查请审查以下代码指出 1. 安全漏洞如SQL注入、XSS 2. 性能问题如N1查询、内存泄漏 3. 可维护性问题如重复代码、过长函数 4. 代码规范问题 每条问题给出具体行号和修改建议。4.6.2 如何用Cursor Variables实现“一键填空”Cursor有一个Variables功能需要Pro版可以定义变量占位符。例如你在.cursorrules文件中写variables:framework:Reactstyling:TailwindCSSlang:TypeScript然后在Prompt中写请生成一个{{framework}}组件使用{{styling}}语言{{lang}}Cursor会自动替换成具体值。这比手动填更快。4.6.3 把模板沉淀到团队Wiki我们团队把最常用的10个Prompt模板整理成一个Wiki页面标题叫《AI提问模板库》。新人入职第一周就被要求熟悉这些模板并提交自己的模板作为作业。结果团队内部的AI使用效率提升了50%以上而且代码风格更统一了。以前每个人问出来的代码都不一样有的用function有的用箭头函数现在大家都用模板生成的代码风格高度一致review起来省心多了。4.7 30个可直接复用的Prompt模板按场景分类这里我把我最常用的30个模板整理出来你可以直接复制到你的笔记里需要时填空使用。代码生成类10个生成函数请用{{语言}}写一个纯函数功能{{描述}}。要求{{输入验证、错误处理、默认值}}。输出纯代码。生成React组件生成React组件{{名称}}功能{{描述}}。使用{{TypeScript/JS}}样式{{TailwindCSS/CSS Module}}包含{{加载/错误}}状态。生成Express路由生成Express路由{{方法}} {{路径}}功能{{描述}}。使用async/await错误处理完整返回{{JSON/HTML}}。生成SQL查询生成SQL查询{{描述}}。表结构{{粘贴}}。要求使用参数化查询添加索引建议输出纯SQL。生成正则表达式请生成正则表达式匹配{{描述}}。要求考虑{{边界情况}}输出纯正则不要解释。生成Dockerfile请为{{语言}}项目生成Dockerfile。要求多阶段构建、使用非root用户、设置时区。输出纯代码。生成GitHub Actions请生成GitHub Actions工作流功能{{CI/CD描述}}。要求{{缓存依赖、并行任务、通知}}。生成配置文件请生成{{ESLint/Prettier/Babel}}配置文件规则{{自定义规则列表}}。输出JSON格式。生成自定义Hook生成React自定义Hookuse{{功能}}。功能{{描述}}。使用useState、useEffect添加TypeScript类型。生成API客户端生成API客户端函数{{框架}}调用{{API描述}}。使用{{axios/fetch}}添加TypeScript类型。重构类5个优化性能请优化以下代码的性能。当前痛点{{慢/内存高/响应慢}}。输出优化后的代码并用注释说明改动。重构为设计模式请将以下代码重构为{{工厂/单例/策略}}模式。保持功能不变提高可扩展性。拆分大函数以下函数超过200行请拆分为多个小函数每个函数单一职责。输出拆分后的代码和调用关系。消除重复代码请消除以下代码中的重复逻辑。提取公共函数输出重构后的代码。添加错误处理请为以下代码添加完整的错误处理和边界检查。输出修改后的代码。测试类5个生成单元测试请为以下函数生成Jest单元测试。覆盖正常、边界、异常。输出describe/it结构。生成E2E测试请为{{页面/功能}}生成Playwright/Cypress端到端测试脚本。场景{{正常流程、异常流程}}。生成测试数据请生成模拟数据用于测试{{API/组件}}。格式{{JSON/数组}}字段{{列出}}数量{{N}}条。分析测试覆盖率以下是被测代码和覆盖率报告请建议如何提高覆盖率。指出未覆盖的分支和需要补充的测试用例。生成压力测试脚本请生成K6压力测试脚本测试{{API}}。并发用户{{N}}持续时间{{M}}分钟定义阈值。文档类5个生成README请为以下项目生成README。包含安装、快速开始、配置说明、常见问题。输出Markdown。生成API文档请根据以下路由代码生成API文档。输出Markdown表格包含路径、方法、参数、响应示例。生成JSDoc注释请为以下函数添加JSDoc注释。包含param、returns、throws、example。生成架构说明文档请根据以下信息生成架构说明文档。包含Mermaid流程图输出Markdown。生成贡献指南请为开源项目生成贡献指南。包含如何报告bug、如何提交PR、代码规范、行为准则。其他类5个生成Git提交信息请根据以下代码变更生成符合Conventional Commits规范的Git提交信息。格式type(scope): subject。生成.env.example请为{{项目类型}}生成.env.example文件。敏感变量用空值或占位符添加注释。生成Docker Compose请生成docker-compose.yml用于{{服务描述}}。使用自定义网络添加健康检查。生成Git Hooks请生成Git pre-commit hook脚本用于运行{{lint/test}}。只检查暂存文件失败则阻止提交。生成代码审查报告请生成一份代码审查报告模板用于团队Code Review。包含审查概览、问题列表按严重程度、改进建议、审查结论。4.8 团队Prompt编写规范可直接贴到Wiki如果你带团队或者想让自己的Prompt习惯影响更多人下面这份规范可以直接复制到团队文档里。# 团队AI提问规范 ## 原则 1. **角色先行**明确告诉AI你的身份“你是一位资深后端工程师” 2. **上下文完整**附上相关代码、错误信息、预期目标 3. **输出约束**说明格式、长度、风格、安全要求 4. **迭代优化**第一版不满意就追问最多3轮 5. **模板沉淀**高频需求写成模板团队共享 ## 禁止事项 - ❌ 不要问“帮我看看这段代码”——太模糊 - ❌ 不要贴整段300行代码——只贴关键部分 - ❌ 不要直接使用AI生成的不安全代码SQL拼接、硬编码密钥 - ❌ 不要让AI设计核心业务逻辑——它不懂你的业务 ## 推荐模板 此处引用4.7节的模板 ## 例子 可放一个团队的优秀Prompt示例 ## 反馈 如果你发现新的有用模板请提交到Wiki。4.9 今日行动升级你的Prompt习惯练习角色设定今天问AI任何问题前先加上“你是一位资深XXX”。改一个你之前问过的问题找一条你以前问过但AI答得不好的聊天记录用本章的法则重写Prompt对比新旧答案。创建你的第一个模板把你最常问的3个问题写成模板填空形式。分享到团队把你的模板发给同事问问他们是否也觉得有用。下一章预告系统指令与角色设定——如何让AI扮演架构师、测试、产品经理第4章你学会了写好Prompt的5个法则。第5章我们深入一个最关键的点——角色设定。第5章我会教你如何设计系统指令System Prompt让AI在所有对话中都“记住”自己是架构师5个不同角色的完整指令模板架构师、测试工程师、产品经理、代码审查员、技术写作在Cursor中设置Rules的完整步骤一个能让AI自动遵循团队代码规范的隐藏技巧