AI总写错代码?掌握这5个Prompt技巧,效率提升50%

周五下午四点半,我盯着 Cursor 刚生成的代码,整个人都麻了。
本来只是想让它帮我写个用户登录接口,结果它给我搞了个 300 行的怪物——参数类型全错、数据库连接写死在代码里、还混用了三种不同的错误处理方式。我深吸一口气,删掉重来。第二次,它又把我没让它动的配置文件改得面目全非。
那一刻我突然意识到:问题不在 AI,在于我压根没告诉它”该做什么、不该做什么”。
你有没有这种感觉?AI 编程工具装上了,热情也很高,但用了一段时间发现——生成的代码要么牛头不对马嘴,要么看起来对但跑起来就炸。反复修改几轮后,还不如自己手写来得快。
说实话,我之前也觉得 Prompt 工程没那么重要,不就是跟 AI 说几句话嘛,能难到哪去?直到我看到同事用同样的 Cursor,写同样的功能,十分钟搞定我折腾一小时的活儿。差距在哪?他的 Prompt 结构清晰、上下文完整、边界明确。
这篇文章会手把手教你 5 个立刻见效的 Cursor Prompt 技巧。不是什么高深理论,都是实战总结出来的”大白话公式”。看完你就知道怎么让 AI 真正读懂你的需求,生成准确、可用的代码。
为什么你的 Prompt 总是”失效”
AI 不是读心术,它只能”看到”你给的信息
很多人以为 AI 很聪明,应该能猜到我想要什么。错了。AI 再强大,也只是个”高级文本补全器”——它只能基于你提供的信息做推理。你没说的东西,它就只能靠”猜”。
这就像你打电话让朋友帮忙买咖啡,只说了一句”帮我买杯咖啡”。他到了店里一脸懵:要美式还是拿铁?大杯还是中杯?加糖吗?最后他只能凭感觉随便买一杯。AI 也一样。
特别是在大型项目里,AI 的”失忆”问题更明显。它的上下文窗口是有限的,没法把你整个代码库都装进”脑子”里。你让它修改一个函数,它可能压根不知道这个函数被其他 20 个地方调用过,一改就崩盘。
常见的三种 Prompt 灾难
灾难1:过于模糊
❌ “帮我实现排序”
这种指令就像给 GPS 输入”我要去北京”——去北京哪里?用什么交通工具?什么时候到?AI 收到这种指令,只能自由发挥。它可能给你写个冒泡排序,也可能调用一个你项目里根本没有的第三方库。
✅ “在 utils/array.ts 文件中添加一个函数,对用户列表按注册时间降序排序,使用原生 Array.sort() 方法,不引入新依赖”
看到区别了吗?后者明确了:在哪个文件、操作什么数据、用什么方法、有什么限制。
灾难2:缺乏上下文
❌ “添加错误处理”
AI:添加到哪里?处理什么错误?用 try-catch 还是错误码?返回什么格式?
这就像医生问你”哪里不舒服”,你只回一个”疼”。医生能给你看病吗?不能。
✅ “在 api/login.ts 的 handleLogin 函数中添加错误处理:
- 捕获网络请求失败(使用 try-catch)
- 返回统一的错误格式
{ success: false, error: string } - 参考现有的
api/register.ts的错误处理方式”
灾难3:没有约束条件
❌ “优化这个组件的性能”
AI 收到这个指令,可能把你的代码改得面目全非——引入新库、修改状态管理、甚至重写整个组件架构。你想要的只是加个 React.memo,结果它给你来了个大手术。
✅ “优化 UserList.tsx 组件的性能:
- 只能使用 React.memo 或 useMemo
- 不要修改 组件的 props 接口
- 不要引入 新的第三方库”
AI “幻觉”的真相
你有没有遇到过:AI 生成的代码里调用了一个根本不存在的函数?或者引用了你项目里没有的变量?这就是 AI 的”幻觉”。
根据 Cursor 官方的最佳实践研究,提供清晰的上下文信息可以减少 70% 的幻觉问题。为什么?
AI 在信息不完整时会自动”脑补”。你没告诉它现有的代码长什么样,它就根据”常见模式”推测。比如你让它写登录功能,它可能默认你有一个 authService.login() 方法——但你项目里根本没有这个东西。
解决办法很简单:把相关的现有代码明确展示给 AI。
我现在每次写 Prompt,都会先问自己三个问题:
- AI 知道我在哪个文件操作吗?
- AI 知道现有代码的结构吗?
- AI 知道什么能改、什么不能改吗?
这三个问题答不上来,就别急着发 Prompt。
结构化 Prompt 的黄金公式
5W1H 框架:让 AI 秒懂你的需求
记者写新闻有个经典公式:5W1H(Who、What、When、Where、Why、How)。写 Prompt 也能用这套方法。
- What(目标):你要 AI 做什么?
- Why(原因):为什么要这样做?(帮 AI 理解意图)
- Where(位置):在哪个文件/模块操作?
- When(时机):什么情况下触发?
- Who(对象):操作的数据对象是什么?
- How(方式):使用什么技术栈/库?
听起来复杂?其实不用每次都写全。核心是:让 AI 不用猜。
举个例子,你想让 AI 添加一个数据验证功能:
❌ 模糊版:
添加用户输入验证✅ 5W1H版:
**What**: 在用户注册表单添加输入验证
**Where**: src/components/RegisterForm.tsx
**Who**: 验证用户名、邮箱、密码三个字段
**How**: 使用现有的 Yup 库(已安装)
**When**: 用户点击提交按钮时触发
**Why**: 防止无效数据提交到后端AI 收到这个指令,基本不会跑偏。
Cursor 官方推荐的结构化模板
Cursor 团队总结了一个更实用的模板,我自己用了几个月,真的好用:
## Goal(目标)
[一句话说明要实现什么]
## Context(上下文)
[当前文件、相关代码、技术栈]
## Current Behavior(当前行为)
[现在的状态是什么]
## Desired Behavior(期望行为)
[你希望达到什么效果]
## Acceptance Criteria(验收标准)
[什么情况下算完成]
## Constraints(约束)
[不能修改什么、必须遵守什么规则]这个模板最妙的地方在于 Constraints(约束) 部分。很多人写 Prompt 只说”要做什么”,不说”不要做什么”,结果 AI 自由发挥得太过头。
实战案例:React 登录功能
让我用一个真实场景对比一下。假设你要给 React 项目添加用户登录功能。
❌ 模糊 Prompt(新手常见):
帮我实现用户登录功能AI 收到这个,可能给你写个 200 行的组件,引入一堆你不需要的库,甚至自己”发明”一个不存在的 API 接口。
✅ 结构化 Prompt(高手做法):
## Goal
在 React 项目中实现用户登录功能
## Context
- 项目使用 React 18 + TypeScript
- 状态管理:Redux Toolkit
- 已有 API 服务:src/services/authService.ts(包含 login 方法)
- UI 库:Ant Design 5.x
## Current Behavior
登录页面(src/pages/Login.tsx)只有静态 UI,没有交互逻辑
## Desired Behavior
1. 用户输入用户名和密码后点击"登录"
2. 调用 authService.login() 进行身份验证
3. 成功:保存 token 到 Redux,跳转到 /dashboard
4. 失败:显示错误提示(使用 Ant Design 的 message.error)
## Acceptance Criteria
- [ ] 表单验证:用户名和密码不能为空
- [ ] 登录过程显示 loading 状态
- [ ] 密码输入框使用 type="password"
- [ ] 通过 ESLint 和 TypeScript 检查
## Constraints
- **不要修改** authService.ts 文件
- **不要引入** 新的第三方库
- **必须使用** 现有的 Redux slice(src/store/authSlice.ts)对比一下生成效果:
第一个 Prompt,AI 可能给你这样的代码:
// ❌ AI 自由发挥的结果
import { useState } from 'react';
import axios from 'axios'; // 你没让它装新库,它自己装了
function Login() {
const [username, setUsername] = useState('');
const [password, setPassword] = useState('');
const handleLogin = async () => {
// 直接调用不存在的 API
const res = await axios.post('/api/auth/login', { username, password });
localStorage.setItem('token', res.data.token); // 没用 Redux
};
// ... 剩下 150 行你不需要的代码
}第二个 Prompt,AI 会严格按照你的要求生成:
// ✅ 结构化 Prompt 的结果
import { useState } from 'react';
import { Form, Input, Button, message } from 'antd';
import { useDispatch } from 'react-redux';
import { login } from '@/services/authService';
import { setToken } from '@/store/authSlice';
import { useNavigate } from 'react-router-dom';
export default function Login() {
const [loading, setLoading] = useState(false);
const dispatch = useDispatch();
const navigate = useNavigate();
const handleSubmit = async (values: { username: string; password: string }) => {
setLoading(true);
try {
const { token } = await login(values.username, values.password);
dispatch(setToken(token));
navigate('/dashboard');
} catch (error) {
message.error('登录失败,请检查用户名和密码');
} finally {
setLoading(false);
}
};
return (
<Form onFinish={handleSubmit}>
<Form.Item name="username" rules={[{ required: true, message: '请输入用户名' }]}>
<Input placeholder="用户名" />
</Form.Item>
<Form.Item name="password" rules={[{ required: true, message: '请输入密码' }]}>
<Input.Password placeholder="密码" />
</Form.Item>
<Button type="primary" htmlType="submit" loading={loading}>
登录
</Button>
</Form>
);
}看到区别了吗?第二份代码:
- 使用了你指定的 Ant Design 组件
- 调用了你现有的 authService
- 用了 Redux 存储 token
- 有表单验证和 loading 状态
- 没有引入任何新依赖
这就是结构化 Prompt 的威力。
5个立刻见效的 Prompt 技巧
技巧1:先规划,再编码(Plan Mode)
这是我用了之后最惊喜的功能。
以前我都是直接让 AI 动手写代码,结果经常翻车——改了不该改的文件、删了关键代码、逻辑乱七八糟。后来发现 Cursor 有个 Plan 模式(按 Shift+Tab 切换),完全改变了我的工作流。
Plan 模式的逻辑是:AI 先思考,再动手。
具体流程:
- 你描述需求
- AI 分析你的代码库,提出问题(比如”你希望保留现有的错误处理吗?”)
- AI 制定一个行动计划(会修改哪些文件、添加什么功能)
- 你审核和修改这个计划
- 确认后,AI 才开始写代码
为什么这么有用?因为它给了你一个”后悔的机会”。
举个例子,上周我让 AI 给项目添加国际化功能。在 Plan 模式下,AI 先给我列了个计划:
计划:
1. 安装 i18next 和 react-i18next
2. 创建 src/i18n/locales/ 目录
3. 修改 App.tsx 添加 I18nProvider
4. 更新所有组件的硬编码文本(约 30 个文件)我一看第 4 步,立刻叫停:“等等,别动那 30 个文件,我先做 3 个页面试试。“然后修改了计划,AI 才开始执行。
如果没有 Plan 模式,AI 可能已经把 30 个文件全改了,我再想恢复就麻烦了。
实战价值:避免 AI 直接动手搞砸代码,特别适合大型重构和新功能开发。
技巧2:提供具体的代码示例
AI 有个特点:它很擅长”照葫芦画瓢”。你给它看几个例子,它就能模仿你的风格。这在技术上叫 Few-shot Prompting。
场景:你想让 AI 帮你写 API 接口,但你有自己的代码风格和错误处理习惯。
❌ 没有示例的 Prompt:
帮我写一个获取用户列表的 API 接口AI 可能给你写成这样:
app.get('/users', (req, res) => {
// 风格完全不是你的
const users = db.getUsers();
res.json(users);
});✅ 提供示例的 Prompt:
帮我写一个获取用户列表的 API 接口,参考以下现有接口的风格:
**示例1**:
\`\`\`typescript
export const getProductById = async (req: Request, res: Response) => {
try {
const { id } = req.params;
const product = await productService.findById(id);
if (!product) {
return res.status(404).json({
success: false,
error: 'Product not found'
});
}
res.json({ success: true, data: product });
} catch (error) {
logger.error('Error fetching product:', error);
res.status(500).json({
success: false,
error: 'Internal server error'
});
}
};
\`\`\`
请按照这个风格实现 getUserList 接口:
- 使用 async/await
- 统一的错误处理
- 返回格式:{ success, data/error }
- 使用 logger 记录错误AI 会生成这样的代码:
export const getUserList = async (req: Request, res: Response) => {
try {
const users = await userService.findAll();
res.json({ success: true, data: users });
} catch (error) {
logger.error('Error fetching users:', error);
res.status(500).json({
success: false,
error: 'Internal server error'
});
}
};完美匹配你的代码风格。
小技巧:在项目根目录创建一个 prompts/templates.md 文件,把常用的代码示例存在里面,需要时直接复制粘贴到 Prompt 里。
技巧3:明确”不要做什么”
这个技巧救过我无数次。
AI 默认会尽力”帮你”——但有时候它的”帮助”是你不需要的。比如你让它修复一个 bug,它可能顺便把周围的代码也”优化”了一遍,结果引入新的问题。
根据 Cursor 团队的研究,明确约束条件可以减少 60% 的意外修改。
实战案例:
❌ 没有约束的 Prompt:
修复 UserList 组件的分页 bugAI 可能会:
- 修改组件的 props 接口(导致父组件报错)
- 重写整个分页逻辑(引入新 bug)
- 引入新的第三方库(增加依赖)
✅ 明确约束的 Prompt:
修复 UserList 组件的分页 bug
**约束**:
- **不要修改** 组件的 props 接口(TypeScript 类型)
- **不要引入** 新的第三方库
- **只修改** handlePageChange 函数内部逻辑
- **不要改动** 样式和 UI 结构AI 会严格遵守这些规则,只改必要的部分。
还有一个进阶技巧:让 AI 先列出它的假设。
修复分页 bug,在开始前请列出你的假设:
1. 你认为 bug 的原因是什么?
2. 你打算修改哪些代码?
3. 你会引入什么依赖或改变什么接口吗?AI 会先回答这些问题,你可以检查它的理解是否正确,再让它动手。这招特别适合复杂的 bug 修复。
技巧4:用验收标准作为锚点
这个技巧是从敏捷开发借鉴来的。
在 Prompt 的开头(不是结尾)定义验收标准,AI 会以此为目标进行推理,就像给它设定了”必须达成的目标”。
对比一下:
❌ 没有验收标准:
重构 DataTable 组件的性能AI:重构成什么样算完成?用什么方法?衡量标准是什么?(它只能瞎猜)
✅ 有验收标准:
重构 DataTable 组件的性能
**验收标准**(必须全部满足):
- [ ] 渲染 1000 行数据时,FPS 不低于 55
- [ ] 使用 React.memo 和 useMemo
- [ ] 不修改组件的 API(props 和 callbacks)
- [ ] 通过现有的所有单元测试
- [ ] 代码必须通过 ESLint 检查
**当前问题**:
渲染 500 行数据时,FPS 掉到 20,滚动卡顿AI 会以这些标准为”北极星”,确保每一步改动都朝着这个方向。如果它发现某个优化会破坏测试或改变 API,它会自动避开。
好处:防止 AI 做”看起来有用但实际没用”的改动。
技巧5:区分 Inline Edit 和 Agent Mode
很多人不知道,Cursor 有两种工作模式,用对场景效率能翻倍。
Inline Edit(Cmd+K):
- 适用:单文件小改动、重构、bug 修复
- 特点:快速、精准、不会跨文件乱改
- 举例:改个函数名、加个参数、修个 bug
Agent Mode(Cmd+I 或 Chat):
- 适用:多文件推理、新功能开发、架构级改动
- 特点:可以分析整个代码库、跨文件操作、制定计划
- 举例:添加新功能、大规模重构、技术栈迁移
我之前总是用 Agent Mode 干所有事情,结果效率很低。后来发现:简单任务用 Inline Edit,复杂任务用 Agent Mode。
决策树:
需要修改多个文件吗?
├─ 是 → Agent Mode
└─ 否 → 需要理解复杂上下文吗?
├─ 是 → Agent Mode
└─ 否 → Inline Edit举个例子:
场景1:把函数 getUserData 重命名为 fetchUserData
→ 用 Inline Edit:选中函数名,Cmd+K,输入”重命名为 fetchUserData”,秒改。
场景2:添加用户权限管理功能(涉及 Model、Controller、View、Config 多个文件)
→ 用 Agent Mode:它会分析项目结构,问你问题,制定计划,然后跨文件实现。
选错模式的后果:
- Inline Edit 干复杂任务 → 它看不到全局,容易遗漏关联改动
- Agent Mode 干简单任务 → 杀鸡用牛刀,等待时间长,还可能过度发挥
小技巧:如果不确定用哪个,先用 Agent Mode 的 Plan 功能看看它打算改几个文件。如果只改 1-2 个文件,切回 Inline Edit 更快。
进阶技巧:打造你的 Prompt 工具箱
创建可复用的 Prompt 模板
写了一段时间 Prompt 后,你会发现很多任务是重复的——新增 API 端点、添加组件、写单元测试、数据库迁移……
与其每次从头写,不如把常用的 Prompt 做成模板。
我现在的项目根目录都有个 prompts/ 文件夹,里面按任务类型分类:
prompts/
├── api-endpoint.md # 新增 API 端点模板
├── react-component.md # React 组件模板
├── unit-test.md # 单元测试模板
├── migration.md # 数据库迁移模板
└── refactor.md # 重构模板示例:API 端点模板(prompts/api-endpoint.md)
# 新增 API 端点模板
## Goal
在 [模块名] 中添加 [功能描述] 的 API 端点
## Context
- 路由文件:src/routes/[模块].routes.ts
- 控制器:src/controllers/[模块].controller.ts
- 服务层:src/services/[模块].service.ts
- 数据模型:src/models/[模块].model.ts
## Desired Behavior
**请求**:
- Method: [GET/POST/PUT/DELETE]
- Path: /api/[路径]
- Body/Query: [参数说明]
**响应**:
- 成功:{ success: true, data: [...] }
- 失败:{ success: false, error: "..." }
## Acceptance Criteria
- [ ] 遵循现有的错误处理模式(参考其他端点)
- [ ] 使用 async/await
- [ ] 添加输入验证(使用 Joi 或 Zod)
- [ ] 记录错误日志(使用 logger)
- [ ] 通过 TypeScript 类型检查
## Constraints
- **不要修改** 现有的路由配置结构
- **不要引入** 新的第三方库(除非必要且说明理由)
- **必须使用** 现有的数据库连接(不要创建新连接)需要时,复制模板,填空即可。
团队协作福利:团队成员共享这些模板,大家写出来的代码风格一致,新人上手也快。
使用 Agent Skills(2026 新特性)
这是 2026 年 AI 编程工具的一个大趋势。
简单来说,Agent Skills 就是可以复用的”AI 应用程序”。你可以把最佳实践封装成一个 Skill,需要时直接调用,就像调用一个函数。
举个例子:
我之前写博客文章时,每次都要手动给文章配图。后来我创建了一个 Agent Skill,自动帮我:
- 分析文章内容
- 识别需要配图的章节
- 生成图片提示词
- 标注插入位置
现在我只需要运行这个 Skill,它就自动完成整个流程。
如何创建 Agent Skills?
在 Cursor 中,你可以在 .cursor/ 目录下创建自定义 Skill:
.cursor/
└── skills/
├── code-review.md # 代码审查 Skill
├── test-generator.md # 测试生成 Skill
└── api-doc.md # API 文档生成 Skill最新动态:2025 年 12 月,Agent Skills 成为开放规范,Claude Code、Cursor、VS Code、GitHub Copilot 等主流工具都已支持。这意味着你写的 Skill 可以跨工具使用。
老实讲,我刚开始觉得 Skills 有点”过度工程化”,直到我在一个多人协作项目中用了团队共享的 Skills——代码质量和效率立刻上了一个台阶。
优化项目结构,辅助 AI 理解
AI 不是人,它理解代码库的方式和我们不一样。一个结构清晰的项目,AI 的表现会好得多。
实用建议:
创建
/prompts文件夹
存放常用的 Prompt 模板和代码示例,方便复制粘贴。使用
.cursor/目录存放项目上下文
创建一个.cursor/context.md文件,写明:- 项目技术栈
- 代码风格规范
- 常用的第三方库
- 特殊约定(比如”我们用
_开头命名私有方法”)
AI 会自动读取这个文件,理解你的项目特点。
清晰的目录结构和命名
AI 会根据文件名和目录结构推测代码用途。如果你的文件叫utils.ts、helpers.ts、common.ts,AI 会懵——这些都是什么?改成这样更好:
utils/ ├── date-formatter.ts ├── string-validator.ts └── array-helpers.ts
我有个经验:项目结构越混乱,AI 的幻觉越多。整理好目录结构,不仅人看着舒服,AI 也更懂你。
避坑指南:常见错误与解决方案
错误1:信息过载——一次性给太多
刚开始用 AI 编程时,我犯过这样的错:把整个需求文档、三个相关文件、五篇参考文章全粘贴给 AI,心想”信息越多越好”。
结果呢?AI 被淹没了。
它要么抓不住重点,要么理解偏差,要么干脆超时报错。就像你给一个人同时讲十件事,他记住的反而最少。
正确做法:渐进式披露
不要一开始就把所有信息倒给 AI,而是:
- 先说核心需求
- AI 有疑问时,再提供详细信息
- 分步骤给出上下文
举个例子:
❌ 信息过载版:
帮我重构用户认证模块。
[粘贴 500 行代码]
[粘贴需求文档]
[粘贴三篇技术文章]
要求:性能提升、安全加固、代码优雅...✅ 渐进式版本:
第一轮:
我想重构用户认证模块,目标是提升安全性。
当前使用 JWT,存在的问题:token 没有刷新机制。
你需要了解什么信息?
[AI 会问:现在的 token 过期时间是多久?存储在哪里?]
第二轮:
token 过期时间 1 小时,存储在 localStorage。
这是当前的认证逻辑(关键代码):
[只粘贴核心的 50 行代码]
你打算怎么改进?
[AI 给出方案,你确认后再让它动手]这样做的好处:AI 能聚焦核心问题,你也能随时纠正它的理解。
错误2:过度依赖 AI,不审查代码
这个坑我踩得最狠。
有一次,AI 帮我写了个数据处理函数,跑起来没报错,单元测试也过了。我看着代码挺工整,就直接合并了。结果上线后发现——这个函数在边缘情况下会返回错误结果,导致用户数据错乱。
AI 生成的代码,特别是”看起来完全正确”的代码,最危险。
警示:AI 生成速度越快,你越需要仔细审查。
我现在养成了习惯,AI 写完代码后,我会问自己三个问题:
- 边缘情况:空数组、null、undefined、极大值、极小值,处理了吗?
- 副作用:这段代码会影响其他模块吗?
- 性能:有没有死循环、内存泄漏、不必要的重复计算?
实用技巧:让 AI 自己审查代码。
请审查你刚才生成的代码,回答以下问题:
1. 如果输入是空数组,会发生什么?
2. 这段代码有性能问题吗?
3. 你使用了哪些假设?这些假设在所有情况下都成立吗?AI 会重新检查代码,经常能发现自己的问题。
错误3:期望一次性得到完美答案
很多人把 AI 当成”魔法按钮”——输入需求,立刻得到完美代码。这不现实。
AI 更像一个协作者,而不是”全自动代码生成器”。最高效的工作方式是迭代对话:
- 你描述需求
- AI 给出初步方案或问题
- 你确认、修正、补充
- AI 根据反馈优化
- 重复 3-4,直到满意
正确示范:
你:帮我实现用户列表的搜索功能
AI:好的,我打算添加一个搜索框,实时过滤用户列表。
你希望搜索哪些字段?用户名、邮箱,还是其他?
你:搜索用户名和邮箱,但不需要实时过滤,
点击"搜索"按钮后再触发
AI:明白了。那是前端过滤还是发请求到后端?
你:前端过滤,数据量不大
AI:好的,我会使用 Array.filter(),
先给你看一下实现计划...看到了吗?这是对话,不是”下命令”。
技巧:使用 Cursor 的”Show Work”模式(在设置中开启),AI 会展示它的推理步骤,你能看到它是怎么思考的,更容易发现问题。
番外:别把时间浪费在”调教” Prompt 上
最后说个反直觉的建议:不要过度追求完美 Prompt。
我见过有人花 30 分钟精心设计一个 Prompt,结果生成的代码还不如自己写。这就本末倒置了。
Prompt 工程的目的是提升效率,不是展示你的 Prompt 写得多漂亮。如果一个任务你自己 10 分钟能写完,就别花 20 分钟写 Prompt 了。
什么时候值得用 AI?
- ✅ 重复性任务(批量修改、模板生成)
- ✅ 不熟悉的领域(新技术栈、新库)
- ✅ 复杂但有模式的任务(API 端点、CRUD 操作)
什么时候不值得?
- ❌ 简单到闭着眼睛能写的代码
- ❌ 需要深度思考的算法设计
- ❌ 高度定制化、没有参考模式的代码
记住:AI 是工具,不是目的。能快速解决问题才是王道。
结论
写好 Prompt 不是什么高深技术,核心就三件事:说清楚目标、给足上下文、定好边界。
回顾一下这篇文章的 5 个关键技巧:
- 用 Plan Mode 先规划——给自己一个”后悔的机会”
- 提供代码示例——让 AI 照着你的风格来
- 明确约束条件——告诉 AI 什么不能动
- 设定验收标准——给 AI 一个明确的目标
- 选对工作模式——简单任务 Inline Edit,复杂任务 Agent Mode
掌握这些后,你会发现 AI 不再是一个”智障助手”,而是真正能提升效率的编程伙伴。我自己用了这些方法后,AI 生成代码的准确率至少提升了 50%,很多重复性工作现在 10 分钟就能搞定。
现在就打开 Cursor,用结构化模板试试看。从下一个功能开始,按照”Goal - Context - Desired Behavior - Constraints”的格式写 Prompt。你会立刻感受到不同。
记住:AI 编程的未来不是”AI 替代程序员”,而是”会用 AI 的程序员替代不会用的”。这个技能差距,就从你写的第一个高质量 Prompt 开始拉开。
使用结构化Prompt提升AI代码质量
掌握Cursor Prompt工程的完整实战流程,从模糊指令到精准输出
⏱️ 预计耗时: 30 分钟
- 1
步骤1: 理解AI的工作机制:避免常见Prompt灾难
AI只能基于你提供的信息进行推理,不会读心术。常见三种灾难:
**过于模糊**:
❌ "帮我实现排序"
✅ "在 utils/array.ts 文件中添加函数,对用户列表按注册时间降序排序,使用原生 Array.sort(),不引入新依赖"
**缺乏上下文**:
❌ "添加错误处理"
✅ "在 api/login.ts 的 handleLogin 函数中添加错误处理:捕获网络请求失败(try-catch),返回统一格式 { success: false, error: string },参考 api/register.ts 的处理方式"
**没有约束条件**:
❌ "优化这个组件的性能"
✅ "优化 UserList.tsx 组件性能:只能使用 React.memo 或 useMemo,不要修改 props 接口,不要引入新的第三方库"
核心要点:提供清晰上下文可减少70%的AI幻觉问题,明确约束条件可减少60%的意外修改。 - 2
步骤2: 使用结构化Prompt黄金公式
采用Cursor官方推荐的6部分模板:
## Goal(目标)
一句话说明要实现什么
## Context(上下文)
• 项目技术栈(React 18 + TypeScript)
• 相关文件路径(src/pages/Login.tsx)
• 已有服务(src/services/authService.ts)
• 使用的库(Ant Design 5.x)
## Current Behavior(当前行为)
登录页面只有静态UI,没有交互逻辑
## Desired Behavior(期望行为)
1. 用户输入用户名密码后点击登录
2. 调用 authService.login() 验证
3. 成功:保存token到Redux,跳转到 /dashboard
4. 失败:显示错误提示(Ant Design message.error)
## Acceptance Criteria(验收标准)
• 表单验证:用户名和密码不能为空
• 登录过程显示loading状态
• 密码输入框使用 type="password"
• 通过ESLint和TypeScript检查
## Constraints(约束)
• 不要修改 authService.ts 文件
• 不要引入新的第三方库
• 必须使用现有的 Redux slice(src/store/authSlice.ts)
这个模板确保AI不用猜测,生成的代码符合你的项目规范。 - 3
步骤3: 掌握5个立刻见效的实战技巧
**技巧1:先规划再编码(Plan Mode)**
• 按 Shift+Tab 切换到Plan模式
• AI先分析代码库并提出问题
• 制定行动计划(会修改哪些文件)
• 你审核和修改计划后再执行
• 避免AI直接动手搞砸代码
**技巧2:提供具体代码示例(Few-shot Prompting)**
• 在Prompt中粘贴你现有的代码示例
• AI会模仿你的代码风格和错误处理习惯
• 建议创建 prompts/templates.md 存放常用示例
**技巧3:明确"不要做什么"**
• 在Constraints部分列出禁止项
• 减少60%的意外修改
• 进阶技巧:让AI先列出假设(bug原因、修改范围、依赖变更)
**技巧4:用验收标准作为锚点**
• 在Prompt开头定义验收标准
• AI以此为"北极星"进行推理
• 防止做"看起来有用但实际没用"的改动
**技巧5:区分Inline Edit和Agent Mode**
• Inline Edit(Cmd+K):单文件小改动,快速精准
• Agent Mode(Cmd+I):多文件推理、新功能开发、架构级改动
• 决策树:需要修改多个文件?→ 是用Agent,否则用Inline - 4
步骤4: 打造可复用的Prompt工具箱
**创建Prompt模板库**:
在项目根目录创建 prompts/ 文件夹,分类存放:
• api-endpoint.md(API端点模板)
• react-component.md(React组件模板)
• unit-test.md(单元测试模板)
• migration.md(数据库迁移模板)
• refactor.md(重构模板)
每个模板包含Goal、Context、Desired Behavior、Acceptance Criteria、Constraints五部分,使用时复制填空即可。
**使用Agent Skills(2026新特性)**:
在 .cursor/skills/ 目录下创建可复用的AI应用程序:
• code-review.md(代码审查Skill)
• test-generator.md(测试生成Skill)
• api-doc.md(API文档生成Skill)
2025年12月Agent Skills成为开放规范,可跨Cursor、VS Code、GitHub Copilot等工具使用。
**优化项目结构辅助AI理解**:
• 创建 .cursor/context.md 文件,记录项目技术栈、代码风格规范、特殊约定
• 使用清晰的目录结构和文件命名(date-formatter.ts 而非 utils.ts)
• 项目结构越混乱,AI幻觉越多 - 5
步骤5: 避开三大常见错误
**错误1:信息过载**
❌ 一次性粘贴500行代码+需求文档+技术文章
✅ 渐进式披露:先说核心需求 → AI提问 → 提供详细信息 → 分步骤给出上下文
**错误2:过度依赖AI不审查代码**
AI写完代码后问自己三个问题:
• 边缘情况(空数组、null、undefined、极值)处理了吗?
• 这段代码会影响其他模块吗?
• 有没有死循环、内存泄漏、不必要的重复计算?
实用技巧:让AI自己审查代码,回答"如果输入是空数组会发生什么""有性能问题吗""使用了哪些假设"
**错误3:期望一次性得到完美答案**
AI是协作者不是魔法按钮,正确方式是迭代对话:
1. 你描述需求
2. AI给出初步方案或问题
3. 你确认、修正、补充
4. AI根据反馈优化
5. 重复3-4直到满意
开启Cursor的"Show Work"模式,查看AI的推理步骤,更容易发现问题。
常见问题
为什么我的Prompt写得很详细,AI还是生成错误代码?
• 你是否明确了操作的文件路径?(AI不知道在哪个文件操作)
• 你是否提供了现有代码示例?(AI不知道你的代码风格)
• 你是否说明了约束条件?(AI自由发挥过度)
实用做法:在Prompt中回答三个问题:AI知道我在哪个文件操作吗?AI知道现有代码的结构吗?AI知道什么能改什么不能改吗?如果答不上来,补充相关信息后再发Prompt。
另外,使用Plan Mode让AI先制定计划,你审核后再执行,可以避免很多问题。
Inline Edit和Agent Mode什么时候用哪个?
**需要修改多个文件?**
• 是 → 使用Agent Mode(Cmd+I或Chat)
• 否 → 需要理解复杂上下文吗?
- 是 → Agent Mode
- 否 → Inline Edit(Cmd+K)
具体场景:
• Inline Edit:改函数名、加参数、修单个bug、重构单个函数
• Agent Mode:添加新功能(涉及Model/Controller/View)、大规模重构、技术栈迁移、需要分析整个代码库的任务
小技巧:不确定时先用Agent Mode的Plan功能看它打算改几个文件,如果只改1-2个文件,切回Inline Edit更快。
如何让AI生成的代码符合我的项目代码风格?
**方法1:提供具体代码示例(最有效)**
在Prompt中粘贴你现有的代码示例,AI会模仿你的风格、错误处理方式、命名规范。这叫Few-shot Prompting。
**方法2:创建项目上下文文件**
在 .cursor/context.md 中记录:
• 项目技术栈
• 代码风格规范(如"我们用 _ 开头命名私有方法")
• 常用的第三方库
• 特殊约定
AI会自动读取这个文件。
**方法3:创建可复用的Prompt模板**
在项目根目录创建 prompts/ 文件夹,存放API端点、React组件、单元测试等常用模板,需要时复制填空。团队成员共享模板后,代码风格自然一致。
AI生成的代码看起来对,但运行时有bug怎么办?
**永远审查AI生成的代码**,问自己三个问题:
1. 边缘情况处理了吗?(空数组、null、undefined、极大值、极小值)
2. 这段代码会影响其他模块吗?(副作用检查)
3. 有性能问题吗?(死循环、内存泄漏、不必要的重复计算)
**实用技巧**:让AI自己审查代码
"请审查你刚才生成的代码,回答:1)如果输入是空数组会发生什么?2)这段代码有性能问题吗?3)你使用了哪些假设?这些假设在所有情况下都成立吗?"
AI会重新检查,经常能发现自己的问题。另外开启Cursor的"Show Work"模式,查看AI的推理步骤,更容易发现潜在问题。
什么时候值得用AI写代码,什么时候不值得?
• 重复性任务(批量修改文件、生成模板代码、重构重复逻辑)
• 不熟悉的领域(新技术栈、新库、不常用的API)
• 复杂但有模式的任务(API端点、CRUD操作、表单验证、数据转换)
不值得用AI的场景:
• 简单到闭着眼睛能写的代码(改个变量名、加个注释)
• 需要深度思考的算法设计(核心业务逻辑、复杂算法优化)
• 高度定制化、没有参考模式的代码(创新性功能、特殊业务场景)
判断标准:如果你自己10分钟能写完,就别花20分钟写Prompt了。Prompt工程的目的是提升效率,不是展示你的Prompt写得多漂亮。AI是工具不是目的,能快速解决问题才是王道。
Plan Mode具体怎么用?什么场景下最有效?
1. 按 Shift+Tab 切换到Plan模式
2. 描述你的需求
3. AI分析代码库并提出问题(如"你希望保留现有的错误处理吗?")
4. AI制定行动计划(列出会修改哪些文件、添加什么功能)
5. 你审核和修改这个计划
6. 确认后AI才开始写代码
**最有效的场景**:
• 大型重构(避免AI改错文件或删关键代码)
• 新功能开发(涉及多个文件时先看计划)
• 不确定AI理解是否正确时(通过计划验证AI的理解)
• 复杂任务(如添加国际化功能、迁移数据库)
Plan Mode的核心价值是给你一个"后悔的机会",避免AI直接动手搞砸代码,特别适合不可逆的大改动。
如何避免AI生成的代码引入不需要的第三方库?
**明确禁止引入新库**:
"**不要引入** 新的第三方库"
"**不要安装** 任何npm包"
"**只使用** 项目已有的依赖(package.json中的库)"
**指定必须使用的库**:
"**必须使用** 现有的Ant Design组件(已安装5.x版本)"
"**必须使用** 项目中的authService(src/services/authService.ts)"
**提供现有库的示例**:
在Context部分列出项目已有的依赖和使用方式,AI会优先使用这些库而不是自己"发明"新的。
**使用Plan Mode**:
让AI先制定计划时就能看到它打算引入什么库,及时阻止不需要的依赖。
记住:越明确的约束,AI越不会自由发挥。
18 分钟阅读 · 发布于: 2026年1月29日 · 修改于: 2026年2月4日




评论
使用 GitHub 账号登录后即可评论