提示词工程 (Prompt Engineering)
简介
提示词工程是与大型语言模型(LLM)有效交互的艺术和科学。通过精心设计的提示词,我们可以引导模型产生更准确、更有用的输出。
核心原则
1. 清晰具体
python
# ❌ 不好
"写代码"
# ✅ 好
"""
用 Python 写一个函数,实现以下功能:
- 输入:一个整数列表
- 输出:返回列表中的最大值和最小值
- 要求:使用内置函数,不使用循环
"""2. 提供上下文
python
# ❌ 不好
"修复这个 bug"
# ✅ 好
"""
我正在开发一个 Flask Web 应用,用户登录时返回 500 错误。
错误信息:'Database connection failed'
相关代码在 auth.py 的 login 函数中。
请帮我检查数据库连接问题。
"""3. 分步骤说明
python
# ✅ 好
"""
请按以下步骤帮我完成这个任务:
1. 先解释代码的问题
2. 给出修复方案
3. 提供修改后的完整代码
4. 说明修改的理由
"""4. 使用示例
python
# ✅ 好
"""
请将以下代码转换为 JavaScript:
Python 代码:
def greet(name):
return f"Hello, {name}!"
print(greet("World"))
期望输出:
function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet("World"));
"""编程领域的提示词技巧
1. 代码生成
基础代码生成
python
prompt = """
请用 Python 实现一个简单的计算器类,支持以下操作:
- 加法 (+)
- 减法 (-)
- 乘法 (*)
- 除法 (/)
要求:
1. 实现基本运算方法
2. 处理除零错误
3. 提供清晰的使用示例
"""指定框架和风格
python
prompt = """
使用 Flask 框架创建一个 RESTful API,包含以下端点:
1. GET /users - 获取所有用户列表
2. GET /users/<id> - 获取指定用户
3. POST /users - 创建新用户
4. PUT /users/<id> - 更新用户
5. DELETE /users/<id> - 删除用户
要求:
- 使用 SQLAlchemy ORM
- 实现基本的错误处理
- 返回 JSON 格式数据
- 添加适当的 HTTP 状态码
- 遵循 RESTful 设计原则
"""指定代码规范
python
prompt = """
请编写一个 Python 函数来验证邮箱地址格式。
要求:
1. 使用正则表达式
2. 遵循 PEP 8 代码规范
3. 添加类型提示 (Type Hints)
4. 添加详细的 docstring
5. 编写单元测试示例
"""2. 代码解释
理解复杂代码
python
prompt = """
请详细解释以下代码的功能和执行流程:
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
请按以下方式解释:
1. 代码的整体功能
2. 每一步的作用
3. 时间复杂度分析
4. 可能的优化方向
"""架构分析
python
prompt = """
请分析这个项目的架构设计:
项目结构:
/app
/controllers
/models
/views
/services
/utils
/main.py
/config.py
请说明:
1. 这是哪种架构模式?
2. 各目录的职责是什么?
3. 模块之间如何交互?
4. 这种架构的优缺点?
"""3. 代码调试
错误定位
python
prompt = """
我的代码运行时出现以下错误:
错误信息:
Traceback (most recent call last):
File "app.py", line 23, in <module>
result = process_data(data)
File "app.py", line 10, in process_data
return data['items'][0]['value']
KeyError: 'items'
相关代码:
def process_data(data):
return data['items'][0]['value']
data = {"name": "test"}
result = process_data(data)
请帮我:
1. 解释错误原因
2. 提供修复方案
3. 给出改进建议(防止类似错误)
"""性能问题
python
prompt = """
以下代码处理大量数据时运行很慢,请帮我优化:
def find_duplicates(arr):
duplicates = []
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
if arr[i] == arr[j]:
duplicates.append(arr[i])
return duplicates
请:
1. 分析当前算法的时间复杂度
2. 找出性能瓶颈
3. 提供优化方案
4. 对比优化前后的性能
"""4. 代码重构
提高可读性
python
prompt = """
请重构以下代码,提高可读性:
def f(x,y,z,a,b,c,d):
r=[]
for i in x:
if i>a and i<b:
for j in y:
if j==i:
r.append(z[i]+c*d)
return r
要求:
1. 使用有意义的变量名
2. 添加必要的注释
3. 提取复杂逻辑到辅助函数
4. 保持功能不变
"""设计模式应用
python
prompt = """
以下代码中包含重复逻辑,请使用设计模式重构:
class PDFExporter:
def export(self, data):
# PDF 导出逻辑
pass
class ExcelExporter:
def export(self, data):
# Excel 导出逻辑
pass
class CSVExporter:
def export(self, data):
# CSV 导出逻辑
pass
请使用适当的设计模式(如工厂模式、策略模式)来重构。
"""5. 代码审查
代码质量检查
python
prompt = """
请审查以下代码,找出所有潜在问题:
def process_user_input(user_data):
sql = f"SELECT * FROM users WHERE name = '{user_data['name']}'"
result = db.execute(sql)
return result
请检查:
1. 安全问题(如 SQL 注入)
2. 错误处理
3. 代码规范
4. 性能问题
5. 给出改进建议
"""最佳实践建议
python
prompt = """
请评估以下代码的最佳实践:
class User:
def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = password
def save(self):
db.execute(f"INSERT INTO users VALUES ('{self.name}', '{self.email}', '{self.password}')")
从以下角度评估:
1. 面向对象设计原则
2. 数据安全性
3. 可维护性
4. 可测试性
"""6. 测试生成
单元测试
python
prompt = """
请为以下函数编写完整的单元测试:
def calculate_discount(price, discount_rate):
if discount_rate < 0 or discount_rate > 1:
raise ValueError("折扣率必须在 0-1 之间")
if price < 0:
raise ValueError("价格不能为负数")
return price * (1 - discount_rate)
使用 pytest 框架,测试以下场景:
1. 正常折扣
2. 边界值测试(折扣率为 0 和 1)
3. 异常情况(负折扣率、大于 1 的折扣率)
4. 异常情况(负价格)
5. 精度测试
"""测试数据生成
python
prompt = """
请帮我生成测试数据,用于测试用户注册功能。
要求:
- 生成 10 条有效用户数据
- 生成 5 条无效数据(覆盖各种边界情况)
- 包含字段:用户名、邮箱、密码、年龄
- 数据格式为 JSON
"""高级技巧
1. Few-Shot Prompting(少样本提示)
提供少量示例帮助模型理解任务模式。
python
prompt = """
根据函数签名和描述,生成 Python 代码:
示例 1:
输入:
- 函数名:calculate_area
- 描述:计算圆的面积
- 参数:radius(半径)
输出:
import math
def calculate_area(radius):
"""计算圆的面积"""
return math.pi * radius ** 2
示例 2:
输入:
- 函数名:calculate_volume
- 描述:计算球的体积
- 参数:radius(半径)
输出:
import math
def calculate_volume(radius):
"""计算球的体积"""
return (4/3) * math.pi * radius ** 3
现在请生成以下函数:
输入:
- 函数名:calculate_circumference
- 描述:计算圆的周长
- 参数:radius(半径)
输出:
"""2. Chain of Thought(思维链)
让模型展示推理过程。
python
prompt = """
请分析以下代码的时间复杂度:
def find_max(arr):
max_val = arr[0]
for item in arr:
if item > max_val:
max_val = item
return max_val
请按以下步骤分析:
1. 识别循环和嵌套循环
2. 统计每条语句的执行次数
3. 计算总的时间复杂度
4. 给出最终结论
"""3. 角色设定(Persona)
设定特定角色,获得更专业的回答。
python
prompt = """
你是一位资深的 Python 开发工程师,有 10 年以上的开发经验,
对代码质量和最佳实践有深刻理解。
请审查以下代码,从专业角度给出详细的改进建议:
# 代码内容...
"""4. 约束条件
明确限制模型的输出格式和内容。
python
prompt = """
请编写一个冒泡排序函数。
要求:
1. 只使用 Python 标准库
2. 不使用任何第三方库
3. 代码行数不超过 20 行
4. 添加类型提示
5. 返回排序列表,不修改原列表
"""应用场景案例
案例 1:API 接口文档生成
python
prompt = """
根据以下代码,生成 Swagger API 文档:
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
@app.route('/users', methods=['GET'])
def get_users():
users = User.query.all()
return jsonify([{'id': u.id, 'name': u.name} for u in users])
@app.route('/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
user = User.query.get_or_404(user_id)
return jsonify({'id': user.id, 'name': user.name, 'email': user.email})
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
user = User(name=data['name'], email=data['email'])
db.session.add(user)
db.session.commit()
return jsonify({'id': user.id}), 201
请生成符合 Swagger/OpenAPI 规范的文档。
"""案例 2:数据库迁移脚本生成
python
prompt = """
我有以下需求:
当前数据库表结构:
- users 表:id, name, email, created_at
- posts 表:id, user_id, title, content, created_at
需要进行以下变更:
1. 在 users 表添加 age 字段(整数类型)
2. 在 posts 表添加 views 字段(整数类型,默认为 0)
3. 为 users.email 添加唯一索引
4. 为 posts.user_id 添加外键约束
请生成:
1. Flask-Migrate 迁移脚本(upgrade 和 downgrade)
2. 纯 SQL 迁移脚本
"""案例 3:日志分析工具
python
prompt = """
请编写一个 Python 脚本,分析 Web 服务器日志文件。
日志格式示例:
2024-01-15 10:23:45 INFO 127.0.0.1 GET /api/users 200 0.023
2024-01-15 10:23:46 ERROR 127.0.0.1 POST /api/login 500 0.156
2024-01-15 10:23:47 WARN 192.168.1.1 GET /api/products 404 0.012
功能需求:
1. 统计各接口的请求次数
2. 统计响应时间分布
3. 找出错误请求(4xx、5xx)
4. 统计各 HTTP 方法(GET、POST 等)的比例
5. 输出格式化报告
要求:
- 使用 argparse 处理命令行参数
- 支持指定日志文件路径
- 支持按时间范围过滤
"""案例 4:配置文件生成器
python
prompt = """
请编写一个工具,生成 Nginx 配置文件。
输入要求:
- 域名:example.com
- 端口:80
- 静态文件目录:/var/www/html
- 后端服务:127.0.0.1:5000
- SSL 证书路径:/etc/ssl/certs/
配置需求:
- 支持 HTTP 和 HTTPS
- 启用 gzip 压缩
- 设置缓存策略(静态文件)
- 反向代理到后端服务
- 安全头部配置
- 请求限流(每秒 100 个请求)
请生成完整的 Nginx 配置文件。
"""案例 5:代码转换工具
python
prompt = """
请将以下 jQuery 代码转换为现代 Vanilla JavaScript:
$(document).ready(function() {
$('#button').click(function() {
$.ajax({
url: '/api/data',
method: 'GET',
success: function(data) {
$('#result').html(data.message);
},
error: function() {
$('#result').html('Error');
}
});
});
});
要求:
1. 使用 fetch API 代替 $.ajax
2. 使用 querySelector 代替 $ 选择器
3. 使用 addEventListener 代替 .click()
4. 使用 async/await 处理异步
5. 添加错误处理
"""最佳实践
1. 提示词结构
python
prompt = """
[角色设定]
你是一位专业的 {领域} 专家。
[任务描述]
请帮我完成 {具体任务}。
[背景信息]
{相关的上下文信息}
[输入数据]
{具体的输入数据}
[输出要求]
1. 要求 1
2. 要求 2
3. 要求 3
[输出格式]
{期望的输出格式}
[示例]
{如果有,提供示例}
"""2. 迭代优化
python
# 第一版:简单请求
prompt = "帮我写一个排序函数"
# 第二版:增加细节
prompt = "帮我写一个快速排序函数,支持自定义比较"
# 第三版:完整规范
prompt = """
用 Python 实现快速排序,要求:
1. 使用递归实现
2. 支持自定义 key 函数(类似 sorted 的 key 参数)
3. 添加类型提示
4. 编写详细注释
5. 提供使用示例
"""3. 错误恢复
python
prompt = """
之前生成的代码有以下问题:
{描述问题}
请根据问题修复代码,确保:
{修复要求}
"""常见陷阱
1. 过于宽泛
python
# ❌ 不好
"写一个好的代码"
# ✅ 好
"写一个 Python 函数,实现冒泡排序算法"2. 缺少约束
python
# ❌ 不好
"写一个网站"
# ✅ 好
"写一个简单的待办事项网站,使用 Flask 和 SQLite"3. 不验证输出
python
# 总是验证模型生成的代码:
- 检查语法是否正确
- 测试功能是否符合要求
- 检查是否有安全漏洞4. 过度依赖
python
# 提示词工程是辅助,不能替代:
- 理解基础概念
- 学习编程语言
- 实践编码经验
- 独立解决问题的能力