既然你已经掌握了与 AI 协作的正确思维模式,接下来我们来学习最实用的技能:如何有效地提示模型。
提示(Prompting)是与 AI 模型对话的核心技能。就像与同事沟通需要清晰表达需求一样,好的提示能让 AI 模型更准确地理解你的意图,生成高质量的代码和解决方案。
让我们从一个简单的例子开始。假设你想让 AI 帮你创建一个用户登录功能:
糟糕的提示:
做个登录
优秀的提示:
创建一个用户登录页面,包含以下功能:
- 邮箱和密码输入框
- 记住我复选框
- 忘记密码链接
- 表单验证(邮箱格式、密码长度)
- 使用 React + TypeScript
- 遵循现有的 design system
为什么第二个提示更好?因为它提供了:
好的提示就像给同事写需求文档,信息越充分,结果越符合预期。
AI 模型无法读心术,你必须明确表达想要什么。
模糊的提示:
优化这段代码
明确的提示:
优化这段 React 组件的性能,具体要求:
- 减少不必要的重渲染
- 使用 useMemo 缓存计算结果
- 代码保持可读性
提供足够的背景信息,让 AI 理解你的项目环境。
缺乏上下文:
修复这个 bug
丰富上下文:
我正在开发一个电商网站,使用 Next.js + Prisma + PostgreSQL。
购物车功能出现 bug:用户添加商品到购物车后,数量显示错误。
相关代码在 src/components/Cart.tsx,使用 Zustand 管理状态。
请帮我找出问题并提供修复方案。
明确限制和边界条件,避免 AI 生成过度复杂或不合适的解决方案。
无约束提示:
帮我写个函数处理数据
有约束提示:
写一个 JavaScript 函数处理用户数据:
- 输入:用户对象数组
- 输出:过滤掉无效邮箱的用户
- 要求:函数名 validateUsers,支持链式调用
- 性能要求:O(n) 时间复杂度
让 AI 扮演特定角色,通常能获得更专业的回答:
作为资深的 React 开发者,请帮我审查这个组件的代码质量,
重点关注性能优化和最佳实践:
[你的代码]
对于复杂任务,要求 AI 分步骤执行:
请帮我重构这个登录组件,请按以下步骤进行:
1. 首先分析现有代码的问题
2. 提出重构方案
3. 逐步实施重构
4. 最后提供测试建议
提供输入输出示例,让 AI 更好理解期望:
我需要一个函数来格式化日期,要求如下:
输入:"2024-01-15T08:30:00Z"
输出:"15 Jan 2024, 08:30"
输入:"2024-12-25T23:59:59Z"
输出:"25 Dec 2024, 23:59"
请实现这个 JavaScript 函数。
针对特定场景,提出明确的优化要求:
优化这段 Python 代码的性能:
- 当前执行时间:2.5秒
- 目标执行时间:< 0.5秒
- 数据规模:100万条记录
- 约束:不能使用第三方库
[你的代码]
有效模式:
我在开发 [项目类型],遇到 [具体问题]:
错误信息:[完整错误日志]
相关代码:[相关代码片段]
重现步骤:[如何复现]
环境信息:[操作系统、版本、依赖等]
请帮我分析可能的原因并提供解决方案。
有效模式:
我需要开发 [功能描述]:
功能需求:
- 需求1:详细描述
- 需求2:详细描述
技术要求:
- 语言/框架:[具体技术栈]
- 性能要求:[具体指标]
- 兼容性要求:[浏览器/版本等]
现有代码结构:[相关文件路径]
请提供完整的实现方案。
有效模式:
请帮我重构这段代码:
当前问题:
- 代码重复:[具体位置]
- 可读性差:[具体问题]
- 性能瓶颈:[具体指标]
重构目标:
- 提高代码复用性
- 增强可维护性
- 优化性能到 [具体指标]
约束条件:
- 保持 API 接口不变
- 不能破坏现有功能
[待重构代码]
有效模式:
我想学习 [技术名称],请帮我:
学习目标:[具体要掌握的内容]
当前基础:[现有知识水平]
应用场景:[要在什么项目中使用]
请提供:
1. 核心概念解释
2. 实用的代码示例
3. 最佳实践建议
4. 常见坑点提醒
让我们看一个真实的项目例子,展示提示优化如何显著改善结果。
初版提示:
做个用户注册的 API
AI 结果(不理想):
// 缺少错误处理、验证、安全性考虑
app.post('/register', (req, res) => {
const { email, password } = req.body;
// 直接存入数据库,没有验证
db.users.create({ email, password });
res.send('注册成功');
});
优化后的提示:
我正在使用 Express.js 开发用户注册 API,请帮我实现:
技术栈:Node.js + Express + Prisma + PostgreSQL
功能要求:
1. 用户邮箱唯一性验证
2. 密码强度验证(至少8位,包含大小写和数字)
3. 密码哈希存储(使用 bcrypt)
4. 适当的错误处理和状态码
5. 输入数据验证(使用 Joi 或类似库)
6. 防止 SQL 注入
7. 返回结构化的 JSON 响应
数据库模型:
```prisma
model User {
id Int @id @default(autoincrement())
email String @unique
password String
createdAt DateTime @default(now())
}
请提供完整的路由实现代码。
**AI 结果(高质量):**
```javascript
const express = require('express');
const bcrypt = require('bcrypt');
const { PrismaClient } = require('@prisma/client');
const Joi = require('joi');
const router = express.Router();
const prisma = new PrismaClient();
// 输入验证模式
const registerSchema = Joi.object({
email: Joi.string().email().required(),
password: Joi.string().min(8).pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/).required()
});
// 密码强度验证函数
function validatePassword(password) {
return /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/.test(password);
}
router.post('/register', async (req, res) => {
try {
// 验证输入数据
const { error, value } = registerSchema.validate(req.body);
if (error) {
return res.status(400).json({
success: false,
message: '输入数据无效',
errors: error.details.map(detail => detail.message)
});
}
const { email, password } = value;
// 检查邮箱是否已存在
const existingUser = await prisma.user.findUnique({
where: { email }
});
if (existingUser) {
return res.status(409).json({
success: false,
message: '该邮箱已被注册'
});
}
// 哈希密码
const saltRounds = 12;
const hashedPassword = await bcrypt.hash(password, saltRounds);
// 创建用户
const user = await prisma.user.create({
data: {
email,
password: hashedPassword
},
select: {
id: true,
email: true,
createdAt: true
}
});
res.status(201).json({
success: true,
message: '注册成功',
data: user
});
} catch (error) {
console.error('注册错误:', error);
res.status(500).json({
success: false,
message: '服务器内部错误'
});
}
});
module.exports = router;
这个例子充分展示了详细提示如何产生更专业、更安全的代码。
问题: 提示太长太复杂,AI 难以抓住重点
解决: 分步骤,每次聚焦一个具体任务
问题: 认为 AI 了解你的项目背景
解决: 始终提供必要的上下文信息
问题: 使用"优化"、"改进"等模糊词汇
解决: 明确指出具体的优化目标和衡量标准
问题: AI 给出答案后直接使用,不验证结果
解决: 始终测试和验证 AI 生成的代码
问题: 在一个提示中要求完成复杂的多步骤任务
解决: 拆分成多个相关的提示,逐步推进
从简单开始,逐步增加细节:
第一轮:帮我创建一个用户管理的界面
第二轮:为这个界面添加搜索功能
第三轮:优化搜索的性能,添加防抖
第四轮:增加搜索历史的本地存储
让 AI 分析不同方案的优劣:
对于处理大量数据的场景,请比较以下方案:
1. 分页加载
2. 虚拟滚动
3. 无限滚动
分析各自的优缺点、适用场景、实现复杂度。
当遇到问题时,让 AI 帮助分析:
这段代码在 [特定情况] 下会出现 [错误现象]:
[代码片段]
[错误日志]
请帮我:
1. 分析错误原因
2. 提供多种解决方案
3. 解释每种方案的权衡
4. 推荐最佳实践
让 AI 扮演代码审查者的角色:
请以资深开发者的视角审查这段代码:
[代码]
重点关注:
1. 代码质量和可读性
2. 性能优化机会
3. 潜在的 bug 风险
4. 安全性问题
5. 最佳实践遵循情况
不要满足于 AI 的第一个答案,学会追问:
> [初始提示]
> [AI 回答]
> 这个方案很好,但是能考虑 [特定约束] 吗?
> 有没有更简洁的实现方式?
> 这个方案的扩展性如何?
让 AI 解释它的思路:
请解释你为什么选择这个实现方式?
考虑了哪些因素?
有什么替代方案吗?
探索不同的实现可能性:
这个方案不错,但我想看看其他可能:
1. 能不能提供函数式编程的版本?
2. 有没有使用现代 ES6+ 语法的方法?
3. 考虑到兼容性,有没有更传统的实现方式?
有效的提示是一门艺术,需要不断练习和优化。记住这些关键点:
- 明确胜过模糊 - 具体说明你想要什么
- 上下文很重要 - 提供足够的背景信息
- 约束创造质量 - 明确限制和边界条件
- 渐进式开发 - 复杂任务分步骤完成
- 验证和迭代 - 始终测试并持续优化
好的提示技巧不仅能提高 AI 的输出质量,更能培养你自己的系统思维能力。当你学会清晰表达需求时,不仅与 AI 协作更高效,与团队成员的沟通也会变得更加顺畅。
在下一章中,我们将学习如何管理上下文,这对于处理复杂项目和长期对话至关重要。
现在你已经掌握了提示模型的核心技能。尝试在你的项目中应用这些技巧,你会注意到 AI 输出质量的显著提升。记住,提示是一个迭代的过程,不断练习和优化是关键。