Tutorial 5: 提示词技巧

Abstract

高效的 AI 提示词技巧

Authors

Walter Fan

Status

WIP

Updated

2026-02-07

为什么提示词很重要

在氛围编程中,提示词(Prompt)是你与 AI 沟通的桥梁。好的提示词可以:

  • 获得更准确的代码

  • 减少来回修改的次数

  • 提高开发效率

  • 得到更好的代码质量

Note

AI 给出什么样的答案,很大程度上取决于你问什么样的问题。

提示词基础框架

RACE 框架

一个有效的提示词通常包含四个要素:

RACE 框架

┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   R - Role (角色)                                               │
│   定义 AI 扮演的角色                                            │
│   例:你是一个资深 Python 开发者                                 │
│                                                                 │
│   A - Action (行动)                                             │
│   明确要 AI 做什么                                              │
│   例:帮我实现一个缓存装饰器                                     │
│                                                                 │
│   C - Context (上下文)                                          │
│   提供背景信息                                                  │
│   例:用于 Flask API,需要支持 Redis                            │
│                                                                 │
│   E - Expectation (期望)                                        │
│   描述期望的输出                                                │
│   例:包含类型注解和单元测试                                     │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

示例对比

糟糕的提示词:

帮我写一个缓存函数

好的提示词:

【角色】你是一个资深 Python 后端开发者
【背景】我在开发一个 Flask API,需要缓存频繁查询的数据
【行动】请帮我实现一个缓存装饰器,要求:
1. 支持 Redis 作为缓存后端
2. 支持设置过期时间
3. 支持自定义缓存 key
4. 处理 Redis 连接失败的情况
【期望】
- 完整的代码实现
- 类型注解
- 使用示例
- 简单的单元测试

提示词技巧

1. 明确具体

越具体的要求,越好的结果:

不好:

写一个排序函数

:

写一个 Python 函数,实现:
- 对字典列表按指定 key 排序
- 支持升序和降序
- 支持多个排序字段
- 处理 key 不存在的情况

2. 提供约束

告诉 AI 不要做什么:

实现用户注册功能:
- 使用 FastAPI
- 不要使用 ORM,直接写 SQL
- 不要使用第三方验证库
- 密码使用 bcrypt 加密

3. 给出示例

用示例说明期望的格式:

将以下数据转换为 CSV 格式:

输入:
[
    {"name": "Alice", "age": 30},
    {"name": "Bob", "age": 25}
]

期望输出:
name,age
Alice,30
Bob,25

4. 分步骤请求

复杂任务分解为多个步骤:

第一步:设计数据库表结构
- 用户表
- 订单表
- 商品表

请先给出 ER 图和建表语句,确认后再继续。

5. 要求解释

让 AI 解释它的思路:

实现一个 LRU 缓存,并解释:
1. 为什么选择这种数据结构
2. 时间复杂度分析
3. 可能的优化方向

编程场景提示词模板

代码生成

【任务】实现 {功能描述}
【技术栈】{语言/框架/版本}
【要求】
1. {具体要求 1}
2. {具体要求 2}
3. {具体要求 3}
【约束】
- {不要做什么}
- {性能要求}
【输出】
- 完整代码
- 使用示例
- 简要说明

实例:

【任务】实现一个 HTTP 重试装饰器
【技术栈】Python 3.11 + httpx
【要求】
1. 支持配置最大重试次数
2. 支持指数退避
3. 只对特定状态码重试(5xx)
4. 支持自定义重试条件
【约束】
- 不使用第三方重试库
- 异步函数
【输出】
- 完整代码
- 使用示例
- 测试用例

代码重构

【当前代码】
{粘贴代码}

【问题】
- {问题 1}
- {问题 2}

【重构目标】
- {目标 1}
- {目标 2}

【约束】
- 保持 API 不变
- 不引入新依赖

实例:

【当前代码】
def process_data(data):
    result = []
    for item in data:
        if item['status'] == 'active':
            if item['type'] == 'A':
                result.append(item['value'] * 2)
            elif item['type'] == 'B':
                result.append(item['value'] * 3)
    return result

【问题】
- 嵌套太深
- 缺少类型注解
- 魔法数字

【重构目标】
- 降低圈复杂度
- 添加类型注解
- 提取常量

Bug 修复

【代码】
{粘贴代码}

【问题描述】
{描述 bug 现象}

【期望行为】
{描述正确行为}

【已尝试】
{已经尝试过的解决方案}

实例:

【代码】
async def fetch_users(ids: list[int]) -> list[User]:
    tasks = [get_user(id) for id in ids]
    return await asyncio.gather(*tasks)

【问题描述】
当某个 id 不存在时,整个请求失败

【期望行为】
单个失败不影响其他,返回成功的结果

【已尝试】
- 添加 try-except,但不知道怎么处理 gather

代码解释

【代码】
{粘贴代码}

请解释:
1. 整体功能
2. 关键步骤
3. 为什么这样设计
4. 潜在问题

测试生成

【代码】
{粘贴代码}

【测试框架】pytest

【要求】
1. 正常情况测试
2. 边界条件测试
3. 异常情况测试
4. 使用 fixture 和参数化

高级技巧

1. 角色扮演

让 AI 扮演特定角色,获得专业视角:

你是一个有 10 年经验的安全专家。
请审查以下代码的安全问题:
{代码}

常用角色:

  • 资深开发者

  • 安全专家

  • 性能优化专家

  • 代码审查员

  • 架构师

2. 思维链(Chain of Thought)

要求 AI 展示推理过程:

请一步步分析这个算法问题:
1. 首先理解问题
2. 分析可能的解法
3. 选择最优解法并说明原因
4. 实现代码
5. 分析时间和空间复杂度

3. 少样本学习(Few-shot)

通过示例教 AI 你想要的格式:

将函数转换为类方法,示例:

输入:
def add(a, b):
    return a + b

输出:
class Calculator:
    @staticmethod
    def add(a: int, b: int) -> int:
        return a + b

现在转换这个函数:
def multiply(a, b):
    return a * b

4. 对比分析

让 AI 比较不同方案:

比较以下两种缓存实现方案:
1. 使用 Redis
2. 使用本地内存(如 cachetools)

从以下维度分析:
- 性能
- 可扩展性
- 运维成本
- 适用场景

给出你的推荐和理由。

5. 迭代优化

分多轮对话逐步优化:

第一轮:

实现一个基本的 LRU 缓存

第二轮:

添加线程安全支持

第三轮:

添加过期时间功能

第四轮:

优化性能,减少锁竞争

常见错误

1. 太模糊

错误:

帮我优化这段代码

正确:

帮我优化这段代码的性能:
- 当前处理 10000 条数据需要 5 秒
- 目标:降到 1 秒以内
- 可以使用多线程

2. 信息过载

错误:

(粘贴 500 行代码)
帮我改进这段代码

正确:

这是一个数据处理模块的核心函数(完整代码见附件):
(粘贴关键的 50 行)

主要问题是第 23-35 行的循环效率低,
请帮我优化这部分。

3. 缺少上下文

错误:

这段代码报错了,怎么修

正确:

这段代码报错了:

代码:
{代码}

错误信息:
{完整错误信息}

环境:Python 3.11, FastAPI 0.100

4. 期望不明确

错误:

帮我写个 API

正确:

帮我写一个用户管理 API:
- GET /users - 获取用户列表(支持分页)
- POST /users - 创建用户
- GET /users/{id} - 获取单个用户
- PUT /users/{id} - 更新用户
- DELETE /users/{id} - 删除用户

使用 FastAPI,返回统一的响应格式。

实战练习

练习 1:代码生成

使用 RACE 框架,让 AI 生成一个:

  • 文件监控工具

  • 监控指定目录的文件变化

  • 支持过滤特定扩展名

  • 变化时执行回调函数

练习 2:代码重构

找一段你写过的”不太好”的代码,构造提示词让 AI 重构。

练习 3:Bug 修复

描述一个你遇到过的 bug,看 AI 能否帮你定位和修复。

练习 4:对比分析

让 AI 比较两种你熟悉的技术方案,评估 AI 的分析质量。

小结

本教程介绍了高效的提示词技巧:

  • RACE 框架: Role, Action, Context, Expectation

  • 基本技巧: 明确具体、提供约束、给出示例

  • 高级技巧: 角色扮演、思维链、少样本学习

  • 常见错误: 太模糊、信息过载、缺少上下文

关键要点:

  1. 好的提示词 = 好的结果

  2. 越具体越好

  3. 迭代优化比一次完美更实际

下一步

在下一个教程中,我们将学习 MCP Server,扩展 AI 的能力边界。

练习

  1. 用 RACE 框架重写你之前的 5 个提示词

  2. 收集 10 个好用的提示词模板

  3. 对比不同提示词的效果差异

  4. 建立你自己的提示词库

参考资源