前言

AI辅助编程已经成为现代软件开发的重要工具。然而,许多开发者发现同样的AI模型,不同人使用的效果天差地别。关键在于**Prompt Engineering(提示词工程)**的技巧。

本文将系统介绍AI辅助编程中的Prompt工程方法,从基础原则到高级技巧,帮助您从零到一构建高效的提示词体系。

一、Prompt工程基础原则

1.1 清晰性原则(Clarity)

好的Prompt应该明确、具体、无歧义。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
❌ 差的Prompt:
"帮我写个函数"

✅ 好的Prompt:
"请用TypeScript编写一个函数,实现以下功能:
1. 接收一个数字数组作为输入
2. 返回数组中的第二最大值
3. 如果数组长度小于2,返回null
4. 包含完整的类型注解和JSDoc注释
5. 添加边界情况处理"

1.2 上下文原则(Context)

提供足够的背景信息,让AI理解需求的全貌。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
✅ 完整上下文的Prompt:
"项目背景:这是一个Vue 3 + Nuxt 3的电商网站
技术栈:TypeScript, Pinia, VueUse
需求:创建一个购物车组件
具体要求:
- 支持商品数量增减
- 实时计算总价
- 持久化到localStorage
- 响应式设计,支持移动端
- 遵循项目现有的代码风格(使用Composition API)"

1.3 示例原则(Examples)

通过示例让AI更好地理解期望的输出格式。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
✅ 提供示例的Prompt:
"请按照以下格式生成API响应:

示例请求:GET /api/users/123
示例响应:
{
  "success": true,
  "data": {
    "id": 123,
    "name": "张三",
    "email": "zhangsan@example.com"
  },
  "timestamp": "2025-01-09T14:00:00Z"
}

现在请为:POST /api/users 生成类似的响应格式"

1.4 约束原则(Constraints)

明确限制条件,避免AI生成不符合要求的内容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
✅ 带约束的Prompt:
"请生成一个用户注册表单的验证函数,要求:
1. 只使用原生JavaScript,不依赖任何库
2. 代码不超过50行
3. 不使用正则表达式
4. 必须包含以下验证规则:
   - 用户名:3-20个字符
   - 邮箱:标准格式
   - 密码:至少8位,包含大小写字母和数字
5. 返回详细的错误信息对象"

二、高级Prompt技巧

2.1 Few-Shot Learning(少样本学习)

通过提供少量示例,显著提升AI的输出质量。

场景1:代码风格迁移

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Prompt:
"我将提供代码风格转换的示例,请根据示例转换新代码:

示例1 - 转换前:
function add(a, b) {
  return a + b;
}

示例1 - 转换后:
const add = (a: number, b: number): number => {
  return a + b;
}

示例2 - 转换前:
var getUser = function(id) {
  return database.findUser(id);
}

示例2 - 转换后:
const getUser = (id: string): User | null => {
  return database.findUser(id);
}

现在请转换以下代码:
function calculateDiscount(price, percentage) {
  return price * (percentage / 100);
}"

输出:

1
2
3
const calculateDiscount = (price: number, percentage: number): number => {
  return price * (percentage / 100);
}

场景2:测试用例生成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Prompt:
"根据以下示例,为新的函数生成测试用例:

示例函数:sum(a, b)
示例测试:
describe('sum', () => {
  it('should return sum of two positive numbers', () => {
    expect(sum(2, 3)).toBe(5);
  });

  it('should handle negative numbers', () => {
    expect(sum(-2, 3)).toBe(1);
  });

  it('should handle zero', () => {
    expect(sum(0, 0)).toBe(0);
  });
});

请为以下函数生成类似结构的测试:
function isAdult(age: number): boolean {
  return age >= 18;
}"

2.2 Chain of Thought(思维链)

引导AI展示推理过程,提高复杂任务的准确性。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
✅ 使用思维链的Prompt:
"请按照以下步骤分析并优化这段代码:

步骤1:识别代码的主要功能和目的
步骤2:列出当前代码存在的问题(性能、可读性、安全性等)
步骤3:针对每个问题提出具体的优化方案
步骤4:实现优化后的代码
步骤5:对比优化前后的性能差异

代码:
[你的代码]

请开始分析:"

实际案例:性能优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Prompt:
"请用思维链方法优化以下数组查找函数:

步骤1 - 分析:这个函数做什么?时间复杂度是多少?
步骤2 - 问题:有什么性能问题?
步骤3 - 方案:如何优化?
步骤4 - 实现:写出优化后的代码
步骤5 - 验证:对比性能提升

代码:
function findUser(users, userId) {
  for (let i = 0; i < users.length; i++) {
    if (users[i].id === userId) {
      return users[i];
    }
  }
  return null;
}"

AI的回答:

步骤1 - 分析:
- 功能:在用户数组中查找指定ID的用户
- 时间复杂度:O(n),最坏情况需要遍历整个数组

步骤2 - 问题:
- 每次查找都需要线性遍历
- 如果users很大或查找频繁,性能较差
- 没有利用可能的索引结构

步骤3 - 方案:
- 如果只需要查找一次:保持O(n),但可以提前返回
- 如果需要多次查找:先构建Map,将查找优化到O(1)
- 如果数据有序:可以使用二分查找O(log n)

步骤4 - 实现:
// 方案A:单次查找(保持原样,添加早期返回)
function findUser(users: User[], userId: string): User | null {
  return users.find(user => user.id === userId) || null;
}

// 方案B:多次查找(使用Map缓存)
function createUserLookup(users: User[]) {
  const userMap = new Map<string, User>();
  users.forEach(user => userMap.set(user.id, user));
  return (userId: string) => userMap.get(userId) || null;
}

// 使用
const findUser = createUserLookup(users);

步骤5 - 验证:
- 单次查找:10,000条数据约0.5ms
- Map查找:10,000条数据约0.001ms(快500倍)
- 适用场景选择:单次查找用方案A,多次查找用方案B

2.3 角色扮演(Role-Playing)

为AI设定特定角色,获得更专业的回答。

1
2
3
4
5
6
7
8
9
✅ 角色扮演Prompt:
"你是一位拥有10年经验的资深前端架构师,精通React、Vue、性能优化和工程化。
你的特点是:
1. 代码简洁优雅,注重可维护性
2. 性能意识强,善于优化
3. 重视用户体验和可访问性
4. 熟悉最新的前端技术趋势

现在请以这个角色,为我设计一个高性能的虚拟列表组件。"

常用角色模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 角色模板1:安全专家
"你是一位网络安全专家,专注于OWASP Top 10漏洞防护。
请审查以下代码的安全问题:"

// 角色模板2:性能优化专家
"你是Web性能优化专家,熟悉Core Web Vitals、浏览器渲染原理。
请分析这个网页的性能瓶颈:"

// 角色模板3:代码审查专家
"你是代码审查专家,擅长识别代码坏味道和反模式。
请评估以下代码质量并提出改进建议:"

// 角色模板4:测试工程师
"你是资深的测试工程师,精通TDD和BDD。
请为以下功能设计完整的测试策略:"

2.4 分步引导(Step-by-Step)

将复杂任务分解为多个步骤,逐步引导AI完成。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
✅ 分步任务Prompt:
"我们将分5步构建一个完整的REST API。

第1步:设计API端点和数据模型
- 设计用户资源的CRUD端点
- 定义请求/响应的数据结构
- 请先完成第1步,等我确认后再进行第2步

第2步:实现数据验证
第3步:实现错误处理
第4步:添加认证和授权
第5步:编写API文档和测试

现在开始第1步:"

三、不同场景的Prompt策略

3.1 代码生成场景

策略:功能描述 + 技术栈 + 约束条件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
✅ 代码生成最佳实践Prompt:
"请生成一个[功能描述]

技术栈:
- 语言:TypeScript
- 框架:Nuxt 3
- 状态管理:Pinia
- UI库:Nuxt UI

功能要求:
1. [具体需求1]
2. [具体需求2]
3. [具体需求3]

代码规范:
- 使用Composition API
- 遵循TypeScript严格模式
- 添加完整的类型定义
- 包含错误处理
- 添加代码注释

请生成完整的组件代码:"

实际案例:表单组件生成

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
Prompt:
"生成一个用户登录表单组件

技术栈:
- Vue 3 Composition API
- TypeScript
- Tailwind CSS
- Zod验证

功能:
1. 邮箱和密码输入
2. 表单验证(邮箱格式、密码至少8位)
3. 显示验证错误信息
4. 提交loading状态
5. 记住我选项
6. 忘记密码链接

要求:
- 响应式设计
- 可访问性(ARIA标签)
- 错误提示友好
- 代码结构清晰"

3.2 代码重构场景

策略:问题描述 + 重构目标 + 约束条件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
✅ 代码重构Prompt:
"请帮我重构以下代码

当前问题:
- 函数过长(200行)
- 职责不清晰
- 难以测试
- 可读性差

重构目标:
- 拆分为多个小函数
- 单一职责原则
- 提高可测试性
- 改善可读性

约束:
- 保持对外接口不变
- 不改变原有功能
- 添加类型注解
- 性能不能下降

原始代码:
[你的代码]

请提供:
1. 重构后的代码
2. 重构说明
3. 测试建议"

3.3 Bug修复场景

策略:Bug描述 + 复现步骤 + 环境信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
✅ Bug修复Prompt:
"请帮我分析并修复以下Bug

Bug描述:
用户报告登录后刷新页面,用户状态丢失

复现步骤:
1. 打开应用
2. 输入用户名密码登录
3. 登录成功跳转到首页
4. 刷新页面(F5)
5. 用户状态丢失,回到登录页

环境信息:
- Vue 3.3.0
- Pinia 2.1.0
- Nuxt 3.8.0
- 浏览器:Chrome 120

相关代码:
[认证相关代码]

请提供:
1. Bug原因分析
2. 修复方案
3. 修复后的代码
4. 预防此类问题的建议"

3.4 代码解释场景

策略:目标受众 + 详细程度 + 关注重点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
✅ 代码解释Prompt:
"请解释以下代码

目标受众:初级开发者
详细程度:详细,逐行解释
关注重点:
- 算法原理
- 时间复杂度
- 为什么这样实现

代码:
[你的代码]

请按照以下结构解释:
1. 代码功能概述
2. 逐行详细解释
3. 关键技术点
4. 可能的优化方向"

3.5 测试生成场景

策略:测试框架 + 覆盖率要求 + 测试类型

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
✅ 测试生成Prompt:
"请为以下函数生成完整的测试

测试框架:Vitest
覆盖率要求:100%分支覆盖
测试类型:
- 单元测试
- 边界测试
- 异常测试

被测函数:
[你的代码]

测试要求:
1. 正常情况测试
2. 边界值测试
3. 异常输入测试
4. Mock外部依赖
5. 包含测试描述
6. 使用BDD风格(describe/it)

请生成完整的测试代码。"

四、Prompt模板库

4.1 代码审查模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
"请作为资深代码审查专家,审查以下代码

审查维度:
1. 代码质量(可读性、可维护性)
2. 性能问题(时间复杂度、空间复杂度)
3. 安全问题(注入、XSS、CSRF等)
4. 最佳实践(设计模式、SOLID原则)
5. 潜在Bug(边界情况、异常处理)

代码:
[你的代码]

请提供:
- 问题清单(按优先级排序)
- 每个问题的详细说明
- 改进建议和示例代码"

4.2 性能优化模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
"请分析并优化以下代码的性能

当前性能:
- 加载时间:2.5秒
- 首次渲染:1.2秒
- 用户反馈:感觉卡顿

代码:
[你的代码]

优化要求:
1. 识别性能瓶颈
2. 提供优化方案
3. 考虑懒加载、缓存、CDN等
4. 优化前后对比
5. 保持功能不变

请提供完整的优化方案和代码。"

4.3 API设计模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
"请设计RESTful API

资源:[资源名称]
操作:CRUD

设计要求:
1. 遵循RESTful规范
2. 合理的HTTP状态码
3. 统一的响应格式
4. 错误处理设计
5. 认证和授权
6. API版本控制
7. 请求限流

请提供:
1. 完整的API端点列表
2. 请求/响应示例
3. 错误码定义
4. OpenAPI/Swagger文档"

4.4 数据库设计模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
"请设计数据库schema

业务场景:[描述业务场景]
核心实体:[列出主要实体]

设计要求:
1. 规范化设计(至少3NF)
2. 合理的索引策略
3. 考虑查询性能
4. 数据完整性约束
5. 软删除支持
6. 审计字段(created_at, updated_at)

请提供:
1. ER图描述
2. 完整的DDL语句
3. 索引设计说明
4. 查询优化建议"

五、Prompt优化技巧

5.1 迭代优化法

通过多次迭代,逐步改进Prompt效果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 第1版 - 基础Prompt
"写一个排序函数"

// 第2版 - 添加约束
"用JavaScript写一个快速排序函数"

// 第3版 - 添加细节
"用TypeScript写一个快速排序函数,包含类型注解和注释"

// 第4版 - 添加示例
"用TypeScript写一个快速排序函数,要求:
1. 泛型实现,支持任意类型
2. 自定义比较函数
3. 包含JSDoc注释
4. 添加单元测试示例"

// 第5版 - 优化后的最终版本
"你是一位算法专家,请实现一个生产级的快速排序函数:

技术要求:
- TypeScript泛型实现
- 时间复杂度O(n log n)
- 空间复杂度O(log n)
- 随机化pivot避免最坏情况

功能要求:
- 支持自定义比较器
- 稳定排序
- 处理边界情况
- 完整的类型和注释

请提供:
1. 完整实现代码
2. 算法说明
3. 复杂度分析
4. 测试用例"

5.2 A/B测试法

对比不同Prompt的效果,选择最优方案。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// Prompt A
"生成一个用户登录表单"

// Prompt B
"生成一个响应式的用户登录表单,包含邮箱、密码字段,使用Tailwind CSS样式,支持表单验证"

// 对比结果:
- Prompt A:生成的表单功能简单,缺少验证
- Prompt B:生成的表单完整,包含验证和样式

// 结论:Prompt B效果更好,使用更具体的描述

5.3 负面约束法

明确告诉AI不要做什么。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
✅ 使用负面约束的Prompt:
"请生成一个登录页面

要求:
✅ 现代化设计
✅ 响应式布局
✅ 表单验证
✅ 错误提示

❌ 不要使用jQuery
❌ 不要使用alert()
❌ 不要硬编码文本
❌ 不要忽略可访问性

请生成Vue 3组件代码。"

六、工具和自动化

6.1 Prompt管理工具

方案1:版本控制

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 创建Prompt仓库
prompts/
├── code-generation/
│   ├── basic-component.txt
│   ├── api-handler.txt
│   └── database-model.txt
├── code-review/
│   ├── security-review.txt
│   ├── performance-review.txt
│   └── style-review.txt
└── refactoring/
    ├── optimize-performance.txt
    └── improve-readability.txt

方案2:变量化Prompt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// prompt-templates.js
export const promptTemplates = {
  codeReview: (code, language) => `
请审查以下${language}代码

${code}

审查重点:
1. 代码质量
2. 性能问题
3. 安全漏洞
4. 最佳实践
`,

  generateTests: (functionCode, functionName) => `
请为函数${functionName}生成测试

${functionCode}

测试要求:
- 使用Vitest
- 覆盖正常和异常情况
- 包含边界测试
`
}

6.2 CLI工具集成

Claude Code CLI配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# ~/.claude/config.json
{
  "prompts": {
    "review": {
      "system": "你是代码审查专家",
      "template": "请审查以下代码的质量、性能和安全性\n\n{code}"
    },
    "test": {
      "system": "你是测试工程师",
      "template": "请生成完整的测试用例\n\n{code}"
    }
  }
}

# 使用
claude code review src/components/UserForm.vue
claude code test src/utils/auth.ts

自定义Shell脚本

1
2
3
4
5
6
7
#!/bin/bash
# ai-prompt.sh

CODE=$(cat $1)
PROMPT=$(cat ~/.prompts/code-review.txt)

echo "$PROMPT" | sed "s/{CODE}/$CODE/g" | claude

6.3 IDE插件配置

VSCode Code Snippets

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// .vscode/prompt-snippets.code-snippets
{
  "AI Code Review": {
    "prefix": "ai-review",
    "body": [
      "请审查以下代码:",
      "",
      "```$1",
      "$TM_SELECTED_TEXT",
      "```",
      "",
      "审查维度:",
      "1. 代码质量",
      "2. 性能问题",
      "3. 安全漏洞",
      "4. 最佳实践"
    ]
  }
}

七、常见问题和解决方案

7.1 AI理解偏差

问题:AI没有理解真实意图

解决方案:

1
2
3
4
5
❌ 模糊的描述:
"优化这个代码"

✅ 明确的描述:
"这个函数处理100万条数据需要30秒,请优化到1秒以内"

7.2 输出格式不符合预期

问题:AI生成的格式不对

解决方案:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
✅ 明确指定格式:
"请以以下格式输出:

## 问题描述
[描述]

## 解决方案
\`\`\`typescript
[代码]
\`\`\`

## 测试用例
[测试]"

7.3 上下文丢失

问题:AI忘记了前面的要求

解决方案:

1
2
3
✅ 在每个Prompt中重复关键约束:
"请实现[功能]
(重要:必须使用TypeScript,不能使用any类型)"

7.4 输出过长被截断

问题:AI输出不完整

解决方案:

1
2
3
✅ 分阶段请求:
"第1部分:先生成数据模型和接口定义
完成后再生成第2部分:具体实现"

八、最佳实践总结

8.1 Prompt设计检查清单

  • 目标明确:清楚说明要做什么
  • 上下文充分:提供必要的背景信息
  • 约束清晰:明确限制和不能做什么
  • 示例具体:提供输入输出示例
  • 格式规范:指定输出格式
  • 角色设定:给AI设定专业角色
  • 分步引导:复杂任务分解步骤
  • 迭代优化:多次尝试改进Prompt

8.2 不同模型的Prompt适配

Claude vs GPT-4

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// Claude偏好:详细说明
"请帮我实现一个功能,具体要求如下:
1. 使用TypeScript
2. 遵循SOLID原则
3. 包含完整的类型注解
4. 添加详细的注释说明
..."

// GPT-4偏好:简洁直接
"实现TypeScript版本的X功能,遵循SOLID原则"

8.3 团队协作建议

  1. 建立Prompt库:共享优质Prompt模板
  2. 版本管理:使用Git管理Prompt版本
  3. 效果评估:记录不同Prompt的效果
  4. 定期更新:根据AI模型更新优化Prompt

结语

Prompt工程是AI辅助编程的核心技能。通过系统学习和实践,您可以:

  1. 提升效率:用更少的对话获得更好的结果
  2. 保证质量:生成符合规范的代码
  3. 降低成本:减少API调用次数
  4. 持续优化:建立可复用的Prompt体系

记住:

  • 好的Prompt = 清晰的目标 + 充分的上下文 + 明确的约束
  • 持续迭代优化是关键
  • 建立自己的Prompt库很重要

AI是强大的助手,而Prompt工程是您驾驭这个助手的关键技能。开始构建您的Prompt体系吧!


延伸阅读:

相关文章: