Skip to content

提示词工程 (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
# 提示词工程是辅助,不能替代:
- 理解基础概念
- 学习编程语言
- 实践编码经验
- 独立解决问题的能力

参考资源