提示工程 101:编程必备提示词模板
什么是提示工程?
提示工程是为 AI 工具编写清晰、具体指令以获得最佳输出的技能。可以把它看作是学习如何提出正确的问题。
为什么重要? 模糊提示和精心设计的提示之间的区别可能是:
- 模糊:"给我写一个函数" → 通用、无法使用的代码
- 精心设计:"编写一个 Python 函数,接受整数列表并返回偶数之和。包含空列表和非整数值的错误处理。" → 处理边缘情况的生产就绪代码
关键原则:你提供的上下文和具体性越多,AI 的响应就越好。这不是打字更多的问题 - 而是更聪明地打字。
在本指南中,你将学习 5 个基本提示词模板,它们将使你的编程效率提高 10 倍。
五大核心提示词模板
1. 像我 10 岁一样解释(ELI10)
用途:通过简单类比理解复杂概念
模板:
用简单的语言解释 [概念],就像我只有 10 岁一样。
使用日常类比,避免技术术语。
示例:解释什么是 API。
何时使用:
- 学习新的编程概念
- 理解不熟悉的技术术语
- 向非技术利益相关者解释代码
示例用法:
提示词:
用简单的语言解释什么是 API,就像我只有 10 岁一样。
使用日常类比,避免技术术语。
AI 响应:
想象你在餐厅。你(顾客)想要食物,但你不能进入厨房自己做。所以你看菜单,告诉服务员你想要什么,服务员给你端来。
API(应用程序编程接口)就像那个服务员。它是一个信使:
- 接收你的请求(你想要什么)
- 告诉系统(厨房)做某事
- 带回响应(你的食物)
例如,当你在手机上查看天气时,你的应用使用 API 向天气服务询问"纽约的天气如何?",API 带回答案。
专业提示:跟进问题"给我一个真实世界的编码示例"以实际看到它的应用。
2. 带注释的代码生成器
用途:生成功能性代码,同时在阅读时教你
模板:
编写执行 [任务] 的 [语言] 代码。
要求:
- 包含详细注释解释每一步
- 使用清晰、描述性的变量名
- 添加边缘情况的错误处理
- 遵循 [样式指南] 最佳实践
示例:编写读取 CSV 文件并将其转换为 JSON 的 Python 代码。
何时使用:
- 快速构建功能
- 学习新语言的语法
- 实现你在概念上理解的算法
示例用法:
提示词:
编写读取 CSV 文件并将其转换为 JSON 的 Python 代码。
要求:
- 包含详细注释解释每一步
- 使用清晰、描述性的变量名
- 添加边缘情况的错误处理
- 遵循 PEP 8 样式指南
AI 响应:
import csv
import json
import os
def csv_to_json(csv_file_path, json_file_path):
"""
将 CSV 文件转换为 JSON 格式。
参数:
csv_file_path (str): 输入 CSV 文件的路径
json_file_path (str): 输出 JSON 文件的路径
返回:
bool: 转换成功返回 True,否则返回 False
"""
# 检查 CSV 文件是否存在
if not os.path.exists(csv_file_path):
print(f"错误:未找到 {csv_file_path}")
return False
try:
# 以读模式打开 CSV 文件
with open(csv_file_path, 'r', encoding='utf-8') as csv_file:
# 创建 CSV DictReader 对象
# 这会自动使用第一行作为键
csv_reader = csv.DictReader(csv_file)
# 将所有行转换为字典列表
data = list(csv_reader)
# 将数据写入 JSON 文件
with open(json_file_path, 'w', encoding='utf-8') as json_file:
# indent=2 使 JSON 易于阅读
# ensure_ascii=False 保留非英文字符
json.dump(data, json_file, indent=2, ensure_ascii=False)
print(f"成功将 {csv_file_path} 转换为 {json_file_path}")
return True
except csv.Error as e:
print(f"CSV 错误:{e}")
return False
except json.JSONDecodeError as e:
print(f"JSON 错误:{e}")
return False
except Exception as e:
print(f"意外错误:{e}")
return False
# 使用示例
if __name__ == "__main__":
csv_to_json('data.csv', 'data.json')
为什么有效:注释解释"为什么",而不仅仅是"什么"。错误处理向你展示如何编写健壮的代码。
3. 代码审查与改进
用途:获得对你的代码的建设性反馈
模板:
审查以下代码并建议改进:
- 可读性(命名、结构、注释)
- 性能(时间/空间复杂度)
- 最佳实践(设计模式、约定)
- 边缘情况(错误处理、验证)
- 安全性(如果适用)
[粘贴你的代码]
请清楚地解释每个建议。
何时使用:
- 独立编写代码后
- 提交 pull request 之前
- 学习代码质量标准
- 准备代码面试
示例用法:
提示词:
审查以下代码并建议在可读性、性能、最佳实践和边缘情况方面的改进:
def calc(nums):
x = 0
for n in nums:
if n % 2 == 0:
x = x + n
return x
AI 响应:
代码审查:
可读性问题:
- 函数名
calc太模糊 - 它计算什么?- 变量名
x和n没有传达意义- 没有文档字符串解释目的、参数或返回值
改进版本:
def sum_even_numbers(numbers):
"""
计算列表中所有偶数的和。
参数:
numbers (list): 整数列表
返回:
int: 偶数之和,如果列表为空则返回 0
"""
total = 0
for number in numbers:
if number % 2 == 0:
total += number
return total性能优化(对于大列表):
def sum_even_numbers(numbers):
"""列表中所有偶数的和。"""
return sum(num for num in numbers if num % 2 == 0)要处理的边缘情况:
- 空列表 → 目前返回 0(很好!)
- 包含非整数值的列表 → 会崩溃。添加类型检查:
if not all(isinstance(num, int) for num in numbers):
raise TypeError("所有元素必须是整数")
专业提示:让 AI 审查你的审查 - "还有什么我应该考虑的吗?"
4. 调试我的代码
用途:更快地诊断和修复错误
模板:
我遇到此错误:
[粘贴完整错误消息]
这是我的代码:
[粘贴相关代码]
上下文:
- 我要做的事:[描述目标]
- 我尝试过的:[列出调试步骤]
- 我的环境:[PYTHON 3.9、WINDOWS 11 等]
请解释:
1. 导致错误的原因(根本原因)
2. 如何修复(逐步解决方案)
3. 为什么会发生这种情况(这样我将来可以避免它)
何时使用:
- 被 bug 困扰超过 15 分钟
- 错误消息难以理解
- 学习独立调试
示例用法:
提示词:
我遇到此错误:
TypeError: 'NoneType' object is not subscriptable
这是我的代码:
def get_weather(city):
data = fetch_weather_api(city)
return data['temperature']
result = get_weather('InvalidCity')
上下文:
- 我正在尝试从 API 获取天气数据
- 我已验证 API 密钥是正确的
- 环境:Python 3.10
请解释:
1. 导致错误的原因
2. 如何修复
3. 为什么会发生这种情况
AI 响应:
根本原因: 函数
fetch_weather_api(city)在城市无效时返回None(而不是字典)。然后你尝试访问None['temperature'],这会导致错误。逐步修复:
def get_weather(city):
data = fetch_weather_api(city)
# 检查数据是否成功获取
if data is None:
return "错误:无法获取天气数据"
# 检查 'temperature' 键是否存在
if 'temperature' not in data:
return "错误:温度数据不可用"
return data['temperature']为什么会发生这种情况: 当请求失败时(无效输入、网络问题、速率限制),API 通常返回
None或空响应。在访问数据之前始终检查数据是否存在。使用 try/except 的更好方法:
def get_weather(city):
try:
data = fetch_weather_api(city)
return data['temperature']
except (TypeError, KeyError) as e:
return f"获取天气错误:{e}"
专业提示:修复后,询问"还有其他我应该处理的边缘情况吗?"
5. 重构以提高清晰度
用途:将混乱的代码转换为干净、可维护的代码
模板:
重构此代码使其更易读和可维护。
保持相同的功能但改进:
- 变量和函数名
- 代码结构(如果需要,拆分为更小的函数)
- 注释和文档
- 删除代码重复
- 遵循 [语言] 约定
[粘贴代码]
解释你做了什么改变以及为什么。
何时使用:
- 功能正常后(使其干净)
- 继承遗留代码
- 准备代码供团队审查
- 学习干净代码原则
示例用法:
提示词:
重构此代码使其更易读和可维护:
def process(d):
r = []
for i in d:
if i['a'] > 18 and i['s'] == 'active':
r.append({'n': i['n'], 'e': i['e']})
return r
AI 响应:
重构版本:
def filter_active_adults(users):
"""
筛选成年(年龄 > 18)且状态为活动的用户。
参数:
users (list): 用户字典列表,键包括:
'name'、'email'、'age'、'status'
返回:
list: 仅包含 'name' 和 'email' 的筛选字典列表
"""
filtered_users = []
for user in users:
is_adult = user['age'] > 18
is_active = user['status'] == 'active'
if is_adult and is_active:
filtered_users.append({
'name': user['name'],
'email': user['email']
})
return filtered_users所做的更改:
- 函数名:
process→filter_active_adults(描述它做什么)- 变量名:
d→users、r→filtered_users、i→user- 字典键:
'a'→'age'、'n'→'name'等- 可读性:将条件提取到命名变量
- 文档:添加了包含目的、参数和返回值的文档字符串
更好的方法(Pythonic 版本):
def filter_active_adults(users):
"""筛选年龄 > 18 且状态为活动的用户。"""
return [
{'name': user['name'], 'email': user['email']}
for user in users
if user['age'] > 18 and user['status'] == 'active'
]
高级技巧
技巧 1:链式提示(多步骤工作流)
对于复杂项目,将其分解为连续提示:
步骤 1 - 架构:
我想构建一个待办事项应用,包括:
- 添加/编辑/删除任务
- 标记完成
- 按状态筛选
- 保存到 localStorage
规划架构:
1. 我需要哪些组件/函数?
2. 我应该使用什么数据结构?
3. 用户流程是什么?
步骤 2 - 实现:
基于架构计划,编写带有语义标签的待办事项列表 UI 的 HTML 结构。
步骤 3 - 功能:
编写添加任务的 JavaScript 函数。
使用上一步的 HTML 结构。
步骤 4 - 持久化:
添加 localStorage 支持以保存/加载任务。
与现有的 addTask() 函数集成。
为什么有效:将复杂任务分解为更小的提示为 AI 提供更好的上下文并产生更准确的代码。
技巧 2:迭代细化
从宽泛开始,然后通过后续问题缩小范围:
初始提示:
解释数据库如何工作。
跟进 1:
这很有帮助。现在解释 SQL 和 NoSQL 数据库之间的区别。
跟进 2:
对于 Web 应用,我应该何时选择 PostgreSQL 而不是 MongoDB?
跟进 3:
给我一个在 Node.js 中连接到 PostgreSQL 的代码示例。
为什么有效:每个响应都建立在先前的上下文之上,创建个性化的学习路径。
技巧 3:基于角色的提示
要求 AI 采用特定角色以获得定制的响应:
作为老师:
你是一位耐心的编程老师。向一个理解同步代码但对 Promise 感到困惑的
初学者解释 JavaScript 中的 async/await。使用类比和简单示例。
作为代码审查员:
你是一位审查初级开发者 pull request 的高级开发者。
审查此代码并提供建设性反馈:
[粘贴代码]
作为面试官:
你是初级开发者职位的技术面试官。
向我提出一个涉及数组的中等难度编程问题。
等待我的解决方案,然后提供反馈。
常见错误及修复方法
错误 1:太模糊
❌ 不好的提示:
给我写一个程序
✅ 好的提示:
编写一个 Python 脚本:
1. 读取名为 'users.csv' 的 CSV 文件,列:name、age、city
2. 筛选 age > 18 的行
3. 将结果保存到 'adults.csv'
4. 打印筛选了多少用户
为什么更好:具体要求消除歧义。
错误 2:没有提供上下文
❌ 不好的提示:
修复此错误:第 12 行的 TypeError
✅ 好的提示:
我正在学习 Python。我正在尝试连接字符串和整数,
但在第 12 行得到"TypeError: can only concatenate str (not "int") to str"。
这是我的代码:
name = "Age: " + 25
如何修复?为什么会发生此错误?
为什么更好:上下文帮助 AI 提供相关的教育性答案。
错误 3:接受第一个响应而不迭代
❌ 不好的方法: AI 给出代码 → 复制/粘贴 → 继续
✅ 好的方法: AI 给出代码 → 阅读并理解 → 提出澄清问题:
- "为什么这里使用字典而不是列表?"
- "你能解释这个解决方案的时间复杂度吗?"
- "这处理了哪些边缘情况?"
为什么更好:学习发生在后续问题中。
错误 4:不指定你的水平
❌ 不好的提示:
解释机器学习
✅ 好的提示:
向一个了解 Python 基础但没有统计学背景的初学者程序员解释机器学习。
使用简单的类比。
为什么更好:根据你的知识水平量身定制。
练习题
将每个模板应用于实际问题:
练习 1:ELI10
使用 ELI10 模板理解:
1. 什么是递归?
2. JavaScript 中 == 和 === 的区别是什么?
3. 什么是 Docker 容器?
练习 2:代码生成器
生成代码:
1. 检查字符串是否为回文的函数
2. 从新闻网站抓取标题的脚本
3. 带验证的登录表单的 React 组件
练习 3:调试
调试这段故意破坏的代码:
def calculate_average(numbers):
return sum(numbers) / len(numbers)
result = calculate_average([])
# 这会崩溃!使用调试模板修复它。
练习 4:重构
重构这个混乱的函数:
def f(x):
y=0
for i in x:
if i>0:y+=i
return y
练习 5:代码审查
编写一个简单函数(任何语言),然后使用代码审查模板获取反馈。
实现建议。
下一步
你已经学会了 5 个核心模板。以下是如何掌握它们:
- 每天练习:每次编码会话至少使用 1 个模板
- 建立提示库:将你最好的提示保存在笔记本中
- 实验:根据你的特定需求修改模板
- 分享知识:向其他学习者教授这些模板
继续你的学习:
- 应用它:使用这些模板尝试 CSV → Markdown 演示
- 规划你的旅程:阅读 AI 编程学习路线图
- 加入社区:分享你的提示工程技巧(启动后链接)
记住:提示工程是一项技能。你练习得越多,就越擅长与 AI 工具沟通。从简单开始,迭代和细化。
快速参考卡
将此添加到书签以供日常使用:
| 模板 | 何时使用 | 关键要素 |
|---|---|---|
| ELI10 | 学习新概念 | "像我 10 岁一样解释"、类比、无术语 |
| 代码生成器 | 构建功能 | 语言、任务、注释、错误处理 |
| 代码审查 | 改进代码 | 可读性、性能、最佳实践 |
| 调试 | 修复错误 | 错误消息、代码、上下文、环境 |
| 重构 | 清理代码 | 结构、命名、文档 |
专业提示:组合模板!示例:"生成代码(模板 2),然后审查它(模板 3),然后解释关键概念(模板 1)。"
最后更新:2025 年 10 月