Prompt Engineering(提示词工程)
概述
Prompt(提示词) 是用户输入给大语言模型的指令或问题。Prompt Engineering(提示词工程) 是设计和优化提示词以获得更好输出结果的技术。
核心原则:好的提示词 = 清晰、具体、有结构
什么是提示词
1. 基本定义
提示词 是与 AI 交互的文本输入:
用户输入: "帮我写一个快速排序算法"
↑
这就是 Prompt
2. 提示词的组成部分
┌─────────────────────────────────────────────────────────┐
│ 提示词结构 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 角色/身份设定 │ │
│ │ "你是一个资深前端工程师..." │ │
│ └──────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 任务描述 │ │
│ │ "帮我实现一个登录表单..." │ │
│ └──────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 上下文/背景信息 │ │
│ │ "使用 React + TypeScript..." │ │
│ └──────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 约束/要求 │ │
│ │ "使用 shadcn/ui 组件,遵循以下规范..." │ │
│ └──────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 输出格式 │ │
│ │ "以 Markdown 格式输出,包含代码块..." │ │
│ └──────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────┐ │
│ │ 示例/参考 │ │
│ │ "参考以下代码风格..." │ │
│ └──────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
好的提示词原则
CREATE 框架
| 原则 | 说明 | 示例 |
|---|---|---|
| Clear | 清晰明确 | "用 Python 写一个冒泡排序" |
| Role | 设定角色 | "你是一个资深前端工程师" |
| Exact | 精确具体 | "生成 10 个随机整数,范围 1-100" |
| Audience | 明确受众 | "向初学者解释闭包的概念" |
| Tone | 设定语气 | "用专业但友好的语气" |
| Example | 提供示例 | "参考以下代码风格" |
好的提示词 vs 差的提示词
示例 1:代码生成
❌ 差的提示词
写一个登录功能
问题:
- 没有指定技术栈
- 没有说明需求细节
- 没有定义输入输出
✅ 好的提示词
你是一个资深前端工程师。请帮我创建一个 React + TypeScript 的登录表单组件:
需求:
1. 包含邮箱和密码输入框
2. 使用 shadcn/ui 组件库
3. 支持表单验证(邮箱格式、密码最少8位)
4. 包含"记住我"复选框
5. 登录按钮在加载时显示 Loading 状态
6. 使用 TypeScript 定义类型
请提供完整的组件代码和类型定义。
示例 2:Bug 修复
❌ 差的提示词
这段代码有问题,帮我看看
问题:
- 没有说明具体问题
- 没有提供错误信息
- 没有说明期望行为
✅ 好的提示词
我的 React 组件有问题,需要你帮忙排查:
问题描述:
点击"提交"按钮后,表单没有提交,也没有任何提示
代码:
```tsx
function SubmitForm() {
const handleSubmit = () => {
console.log('Form submitted')
}
return <button onClick={handleSubmit}>提交</button>
}
期望行为: 点击按钮后应该显示"提交成功"的提示
请分析问题并给出修复后的代码。
---
### 示例 3:代码重构
#### ❌ 差的提示词
优化这段代码
**问题**:
- 没有说明优化目标
- 没有说明约束条件
- 没有说明优先级
#### ✅ 好的提示词
请帮我优化以下代码,目标是提升可读性和性能:
代码:
const getUserData = async (id: string) => {
const user = await fetchUser(id)
const posts = await fetchPosts(user.id)
const comments = await fetchComments(posts.map(p => p.id))
return { user, posts, comments }
}
优化要求:
- 减少不必要的等待(并行处理)
- 添加错误处理
- 添加 TypeScript 类型
- 保持函数命名清晰
请提供优化后的代码和改动说明。
---
### 示例 4:文档编写
#### ❌ 差的提示词
帮我写个文档
#### ✅ 好的提示词
请为以下函数编写 API 文档:
函数:
async function createUser(data: {
email: string
password: string
name: string
}): Promise<{id: string; email: string}>
文档格式:
- 函数描述
- 参数说明(类型、是否必填)
- 返回值说明
- 使用示例
- 可能抛出的错误
使用 Markdown 格式输出。
---
### 示例 5:代码审查
#### ❌ 差的提示词
审查这段代码
#### ✅ 好的提示词
请作为代码审查专家,审查以下 React 组件:
审查重点:
- 类型安全性
- 性能问题(不必要的重渲染)
- 错误处理
- 代码可读性
- 最佳实践遵循情况
代码:
import { useState, useEffect } from 'react'
export function UserProfile({ userId }: { userId: string }) {
const [user, setUser] = useState(null)
const [posts, setPosts] = useState([])
useEffect(() => {
fetchUser(userId).then(setUser)
fetchUserPosts(userId).then(setPosts)
}, [userId])
if (!user) return <div>Loading...</div>
return (
<div>
<h1>{user.name}</h1>
<ul>{posts.map(p => <li key={p.id}>{p.title}</li>)}</ul>
</div>
)
}
请以列表形式输出:
- 发现的问题
- 严重程度(高/中/低)
- 修复建议
---
## 高级提示词技巧
### 1. Few-Shot Prompting(少样本提示)
提供示例帮助 AI 理解期望:
请将以下自然语言转换为 SQL 查询语句。
示例1: 输入:查找所有姓张的用户 输出:SELECT * FROM users WHERE name LIKE '张%'
示例2: 输入:查找年龄大于25的用户 输出:SELECT * FROM users WHERE age > 25
示例3: 输入:查找今年注册的用户 输出:SELECT * FROM users WHERE YEAR(created_at) = YEAR(CURDATE())
现在请转换: 输入:查找所有状态为"活跃"且注册时间在2024年之后的用户 输出:
### 2. Chain of Thought(思维链)
引导 AI 展示推理过程:
请使用逐步推理的方式解决以下问题:
问题:如果一个数列的前三项是 2, 6, 18,求第四项。
推理过程:
- 观察相邻两项的关系
- 计算比例关系
- 验证规律
- 应用规律求解
请按照以上步骤逐步推理并给出答案。
### 3. 角色设定
你是一个有 10 年经验的前端工程师,擅长 React 和 TypeScript。 你熟悉各种设计模式和最佳实践。 你的回答应该专业、准确,并包含实用的代码示例。
### 4. 结构化输出
请以以下格式输出:
问题描述
[问题简述]
根本原因
[根本原因分析]
解决方案
选项1
[方案描述] 优点:... 缺点:...
选项2
[方案描述] 优点:... 缺点:...
推荐
[推荐方案及理由]
代码示例
[代码]
### 5. 约束和边界
请生成一个随机密码生成函数。
约束条件:
- 密码长度:16-32 位(可配置)
- 必须包含:大写字母、小写字母、数字、特殊字符
- 不能包含容易混淆的字符(如 l, 1, O, 0)
- 使用 TypeScript 实现
请不要使用任何外部库。
---
## 常见提示词模板
### 代码生成模板
你是一个{语言/框架}专家。
请帮我实现以下功能: {功能描述}
技术要求:
- 框架:{框架名称}
- 语言:{编程语言}
- 样式:{CSS方案}
- 状态管理:{状态方案}
功能需求: {详细需求列表}
请提供:
- 完整的代码实现
- 必要的说明注释
- 使用示例
代码风格: {风格要求}
### Bug 修复模板
我遇到了一个问题,需要你帮忙解决:
问题描述 {问题描述}
错误信息
{错误日志}
相关代码
{代码}
环境信息
- 框架:{框架和版本}
- 运行环境:{浏览器/Node版本}
- 构建工具:{webpack/vite等}
已尝试的解决方案 {尝试过的方案}
请分析问题原因并提供修复方案。
### 代码审查模板
请审查以下代码:
审查重点 {审查重点列表}
代码
{代码}
上下文 {相关背景信息}
请输出:
- 发现的问题
- 风险评估
- 改进建议
### 重构建议模板
请分析以下代码并提供重构建议:
{代码}
重构目标: {目标:如提升性能、提高可读性、降低复杂度}
约束条件: {约束:如保持 API 不变、不引入新依赖}
请提供:
- 当前代码的问题分析
- 重构后的代码
- 改动说明
---
## 提示词反模式
### ❌ 需要避免的模式
| 反模式 | 问题 | 改进 |
| ------ | ---- | ---- |
| **模糊指令** | "帮我优化" | "优化性能,减少 50% 响应时间" |
| **过多信息** | 冗长的背景描述 | 提取关键信息 |
| **矛盾要求** | "简单但功能全" | 明确优先级 |
| **缺少上下文** | "这个函数怎么改" | 提供完整代码和目的 |
| **假设过多** | "你应该知道..." | 明确说明所有信息 |
### ✅ 良好模式
| 模式 | 说明 |
| ---- | ---- |
| **明确目标** | 清晰说明想要什么 |
| **提供上下文** | 给出必要的背景信息 |
| **结构清晰** | 使用分段和列表 |
| **具体约束** | 明确限制和要求 |
| **示例引导** | 用示例说明期望 |
---
## 针对不同场景的提示词
### 1. 前端开发
请创建一个 React + TypeScript 的用户列表组件:
需求:
- 使用 TypeScript 定义 User 类型:{ id, name, email, avatar }
- 使用 shadcn/ui 的 Table 组件展示用户列表
- 支持分页(每页 10 条)
- 支持按姓名搜索
- 点击行可查看用户详情
API 接口:GET /api/users?page=1&limit=10&search=keyword 返回格式:{ data: User[], total: number }
请提供完整组件代码和必要的类型定义。
### 2. 后端开发
请用 Node.js + Express 创建一个用户认证 API:
需求:
- POST /api/auth/register - 用户注册
- POST /api/auth/login - 用户登录
- POST /api/auth/logout - 用户登出
- GET /api/auth/me - 获取当前用户信息
技术要求:
- 使用 TypeScript
- 使用 Prisma ORM
- 使用 JWT 进行认证
- 密码使用 bcrypt 加密
- 数据库使用 PostgreSQL
数据模型(User):
- id: UUID
- email: 唯一
- password: 加密存储
- name: 用户名
- createdAt: 创建时间
请提供完整的路由、控制器和中间件代码。
### 3. 数据分析
请帮我分析以下数据:
销售数据:
月份,Q1,Q2,Q3,Q4
产品A,120,150,180,200
产品B,80,90,100,110
产品C,200,180,150,120
请提供:
- 季度增长趋势分析
- 产品表现对比
- 潜在问题识别
- 改进建议
使用 Markdown 格式输出,包含数据可视化建议。
### 4. 文档生成
请为以下 API 生成 Swagger/OpenAPI 文档:
API 端点:POST /api/users
请求体: { "email": "string (required, email format)", "password": "string (required, minLength: 8)", "name": "string (required)" }
成功响应(201): { "id": "uuid", "email": "string", "name": "string", "createdAt": "datetime" }
错误响应:
- 400: 参数验证失败
- 409: 邮箱已存在
请生成完整的 OpenAPI 3.0 规范(YAML 格式)。
---
## 提示词迭代优化
### 迭代流程
第一版(基础版) "写一个登录功能" ↓ ❌ 结果不符合预期 ↓ 第二版(添加细节) "用 React 写一个登录表单,包含邮箱和密码" ↓ ⚠️ 接近了,但还不完美 ↓ 第三版(精细化) "请创建一个 React + TypeScript 登录表单,使用 shadcn/ui..." ↓ ✅ 满意
### 迭代技巧
1. **从简单开始**:先给基础版本
2. **逐步添加细节**:一次只加一个要求
3. **观察输出**:分析不符合预期的部分
4. **针对性修正**:指出具体问题
5. **验证结果**:确认是否满足需求
---
## 参考资源
### 官方文档
- [OpenAI Prompt Engineering Guide](https://platform.openai.com/docs/guides/prompt-engineering)
- [Anthropic Prompt Library](https://docs.anthropic.com/prompt-library)
- [Google Prompting Guide](https://ai.google.dev/gemini-api/prompting-strategies)
### 学习资源
- [Learn Prompting](https://learnprompting.org/)
- [Prompt Engineering Guide](https://www.promptingguide.ai/)
### 社区资源
- [Awesome Prompt Engineering](https://github.com/f/awesome-prompt-engineering)
- [Prompt Examples](https://github.com/matthew-burrell/prompt-examples)
---
**文档更新时间:2025 年 12 月**
