引言:Prompt Engineering 与 AI 代码生成

在人工智能飞速发展的当下,AI 代码生成技术正逐渐改变软件开发的格局。从自动补全代码片段到生成完整的功能模块,AI 代码生成工具如 GitHub Copilot、CodeGeeX 等,正助力开发者提升效率、减少重复性工作。而在这一过程中,Prompt Engineering(提示工程)扮演着举足轻重的角色,它是引导 AI 生成高质量、精准代码的关键。

本文将深入探讨 Prompt Engineering 在 AI 代码生成中的应用,分享 5 大实用技巧,助你充分发挥 AI 代码生成工具的潜力,生成更符合需求的代码。

技巧一:精准清晰的指令描述

明确功能需求

在使用 AI 生成代码时,明确功能需求是首要任务。模糊的指令会导致 AI 生成的代码与预期大相径庭,而精准的描述则能引导 AI 输出符合需求的代码。

例如,若需求是生成一个简单的用户登录功能,模糊的描述可能是 “写一个登录功能”。这样的指令缺乏关键信息,AI 可能不清楚使用何种编程语言、采用怎样的验证机制,以及与数据库的交互方式等。基于此,AI 生成的代码可能仅仅是一个简单的函数框架,无法满足实际应用的需求。

相反,清晰的描述应包含具体的编程语言、技术框架和详细的功能要求,如 “使用 Python 和 Flask 框架,编写一个用户登录功能,该功能需连接 MySQL 数据库,验证用户输入的用户名和密码是否匹配,并返回相应的提示信息”。这种详细的指令为 AI 提供了明确的方向,使其能够生成更完整、准确的代码,如下所示:


from flask import Flask, request, jsonify

import mysql.connector

app = Flask(__name__)

# 配置数据库连接

mydb = mysql.connector.connect(

host="localhost",

user="your_username",

password="your_password",

database="your_database"

)

mycursor = mydb.cursor()

@app.route('/login', methods=['POST'])

def login():

data = request.get_json()

username = data.get('username')

password = data.get('password')

if not username or not password:

return jsonify({"message": "用户名和密码不能为空"}), 400

sql = "SELECT * FROM users WHERE username = %s AND password = %s"

val = (username, password)

mycursor.execute(sql, val)

user = mycursor.fetchone()

if user:

return jsonify({"message": "登录成功"}), 200

else:

return jsonify({"message": "用户名或密码错误"}), 401

if __name__ == '__main__':

app.run(debug=True)

通过这个对比可以看出,清晰的功能需求描述是生成准确代码的基石,它能让 AI 更好地理解任务,减少误解和偏差。

规定输出格式

除了明确功能需求,规定输出格式同样重要。不同的应用场景和项目结构对代码格式有不同的要求,明确的输出格式能确保生成的代码易于集成和使用。

例如,若要生成一个计算两个数之和的函数代码,简单的需求描述 “生成一个计算两数之和的函数” 虽然明确了功能,但未提及输出格式。AI 可能会生成多种形式的代码,如 Python 函数:


def add_numbers(a, b):

return a + b

或者 JavaScript 函数:


function addNumbers(a, b) {

return a + b;

}

然而,如果规定了输出格式,如 “使用 Python 语言,生成一个计算两数之和的函数,函数需包含注释说明功能和参数,采用 PEP8 代码风格”,AI 生成的代码将更加规范和符合要求:


def add_numbers(a, b):

"""

该函数用于计算两个数的和。

:param a: 第一个数

:param b: 第二个数

:return: 两数之和

"""

return a + b

在实际项目中,规定输出格式可以避免后续的代码调整和格式转换工作,提高开发效率,同时也有助于团队协作,使代码风格保持一致,增强代码的可读性和可维护性。

技巧二:提供有效的示例引导

单样本示例引导

在一些简单的代码生成任务中,单样本示例能帮助 AI 快速理解任务模式。例如,若要生成一个将字符串首字母大写的函数,提供一个简单的示例可以让 AI 更准确地把握需求。


# 示例:将字符串 "hello" 首字母大写

def capitalize_example():

s = "hello"

return s.capitalize()

# 任务:将输入字符串首字母大写

def capitalize_task(input_str):

# 请在此处编写代码

通过这个示例,AI 能清晰地看到任务的具体要求和实现方式,从而生成如下准确的代码:


def capitalize_task(input_str):

return input_str.capitalize()

这种单样本示例引导在简单任务中效果显著,它能让 AI 在短时间内理解任务模式,生成符合要求的代码。

少样本示例引导

对于复杂的任务,少样本示例引导则更具优势。当需要生成一个实现复杂算法的代码时,如快速排序算法,提供多个示例可以帮助 AI 更好地理解算法的逻辑和步骤。


# 示例1:对列表 [5, 2, 9, 1, 5, 6] 进行快速排序

def quick_sort_example1():

arr = [5, 2, 9, 1, 5, 6]

def partition(arr, low, high):

pivot = arr[high]

i = low - 1

for j in range(low, high):

if arr[j] <= pivot:

i = i + 1

arr[i], arr[j] = arr[j], arr[i]

arr[i + 1], arr[high] = arr[high], arr[i + 1]

return i + 1

def quick_sort_recursive(arr, low, high):

if low < high:

pi = partition(arr, low, high)

quick_sort_recursive(arr, low, pi - 1)

quick_sort_recursive(arr, pi + 1, high)

return arr

return quick_sort_recursive(arr, 0, len(arr) - 1)

# 示例2:对列表 [3, 6, 8, 10, 1, 2, 1] 进行快速排序

def quick_sort_example2():

arr = [3, 6, 8, 10, 1, 2, 1]

def partition(arr, low, high):

pivot = arr[high]

i = low - 1

for j in range(low, high):

if arr[j] <= pivot:

i = i + 1

arr[i], arr[j] = arr[j], arr[i]

arr[i + 1], arr[high] = arr[high], arr[i + 1]

return i + 1

def quick_sort_recursive(arr, low, high):

if low < high:

pi = partition(arr, low, high)

quick_sort_recursive(arr, low, pi - 1)

quick_sort_recursive(arr, pi + 1, high)

return arr

return quick_sort_recursive(arr, 0, len(arr) - 1)

# 任务:对输入列表进行快速排序

def quick_sort_task(input_list):

# 请在此处编写代码

通过这两个示例,AI 能够学习到快速排序算法的关键步骤和逻辑,包括如何选择基准点、如何进行分区以及如何递归地对分区进行排序。基于这些示例,AI 可以生成如下实现快速排序算法的代码:


def quick_sort_task(input_list):

def partition(arr, low, high):

pivot = arr[high]

i = low - 1

for j in range(low, high):

if arr[j] <= pivot:

i = i + 1

arr[i], arr[j] = arr[j], arr[i]

arr[i + 1], arr[high] = arr[high], arr[i + 1]

return i + 1

def quick_sort_recursive(arr, low, high):

if low < high:

pi = partition(arr, low, high)

quick_sort_recursive(arr, low, pi - 1)

quick_sort_recursive(arr, pi + 1, high)

return arr

return quick_sort_recursive(input_list, 0, len(input_list) - 1)

在复杂任务中,少样本示例能够覆盖更多的任务细节和变化情况,帮助 AI 更好地理解任务,从而生成更完整、准确的代码 。

技巧三:合理利用上下文信息

背景知识补充

在 AI 代码生成中,背景知识是引导 AI 理解任务的关键。当开发特定领域的代码时,如医疗信息系统中的患者数据处理功能,补充背景知识能使 AI 生成更贴合实际需求的代码。假设需求是使用 Python 和 Django 框架,开发一个从患者病历中提取关键症状信息的功能。如果仅仅给出 “编写提取患者症状信息的代码” 这样的指令,AI 可能生成一个通用的文本提取函数,但无法满足医疗领域的专业需求。

若补充相关背景知识,如 “在医疗信息系统中,患者病历采用特定的 XML 格式存储,其中症状信息包含在标签内。请使用 Python 和 Django 框架,编写一个从病历中提取标签内容的函数”,AI 就能更好地理解任务背景,生成如下代码:


import xml.etree.ElementTree as ET

from django.http import JsonResponse

def extract_symptoms(request):

if request.method == 'POST':

# 假设接收到的病历数据在request.body中

xml_data = request.body.decode('utf-8')

root = ET.fromstring(xml_data)

symptoms = []

for symptom in root.findall('.//symptom'):

symptoms.append(symptom.text)

return JsonResponse({'symptoms': symptoms})

else:

return JsonResponse({'error': 'Only POST method is allowed'}, status = 405)

补充背景知识能够为 AI 提供任务的上下文,使其理解任务的特定需求和约束,从而生成更符合实际应用场景的代码。

关联相关代码片段

在项目开发中,关联相关代码片段能帮助 AI 生成更连贯、一致的代码。当需要生成项目中某个功能模块的代码时,如电商系统中的订单支付功能,将该功能与已有的用户认证、商品库存管理等相关代码片段关联起来,能让 AI 更好地理解代码之间的关系和依赖。

假设已有的用户认证代码片段如下:


from django.http import JsonResponse

from django.views.decorators.csrf import csrf_exempt

import jwt

from user.models import User

@csrf_exempt

def authenticate_user(request):

if request.method == 'POST':

data = request.json()

username = data.get('username')

password = data.get('password')

try:

user = User.objects.get(username = username, password = password)

payload = {'user_id': user.id, 'username': user.username}

token = jwt.encode(payload, 'your_secret_key', algorithm='HS256')

return JsonResponse({'token': token}, status = 200)

except User.DoesNotExist:

return JsonResponse({'error': 'Invalid credentials'}, status = 401)

else:

return JsonResponse({'error': 'Only POST method is allowed'}, status = 405)

在生成订单支付功能代码时,可以这样关联:“在我们的电商系统中,订单支付功能依赖于用户认证。已有的用户认证代码如上述 authenticate_user 函数所示,它通过 JWT 进行用户身份验证。请编写订单支付功能代码,确保在支付前验证用户身份,使用 Python 和 Django 框架,支付功能需与已有的用户认证和商品库存管理功能协同工作”。通过这样的关联,AI 能够理解订单支付功能与其他模块的关系,生成的代码如下:


import stripe

from django.http import JsonResponse

from django.views.decorators.csrf import csrf_exempt

from django.views.decorators.http import require_POST

import jwt

from user.models import User

from product.models import Product

stripe.api_key = 'your_stripe_secret_key'

@csrf_exempt

@require_POST

def process_payment(request):

# 从请求头中获取JWT token

token = request.headers.get('Authorization').split(' ')[1]

try:

payload = jwt.decode(token, 'your_secret_key', algorithms=['HS256'])

user = User.objects.get(id = payload['user_id'])

except (jwt.ExpiredSignatureError, jwt.InvalidTokenError, User.DoesNotExist):

return JsonResponse({'error': 'Unauthorized'}, status = 401)

data = request.json()

amount = data.get('amount')

product_id = data.get('product_id')

try:

product = Product.objects.get(id = product_id)

if product.stock < 1:

return JsonResponse({'error': 'Product out of stock'}, status = 400)

# 这里简化处理,实际需要更复杂的Stripe支付流程

charge = stripe.Charge.create(

amount = amount,

currency='usd',

source = data.get('token'),

description='Payment for product'

)

product.stock -= 1

product.save()

return JsonResponse({'message': 'Payment successful'}, status = 200)

except Product.DoesNotExist:

return JsonResponse({'error': 'Product not found'}, status = 404)

except Exception as e:

return JsonResponse({'error': str(e)}, status = 500)

关联相关代码片段能够让 AI 在生成代码时,充分考虑代码之间的关联性和整体性,避免生成孤立、不兼容的代码,从而提高代码的质量和可维护性。

技巧四:采用链式思维提示

复杂问题分解

在处理复杂问题时,将其分解为多个步骤是 Prompt Engineering 的关键策略。复杂问题往往涉及多个子任务和逻辑环节,直接要求 AI 生成完整代码可能导致代码逻辑混乱、功能缺失或错误频出。而通过将问题分解,能让 AI 更清晰地理解任务,逐步生成准确的代码。

以开发一个复杂软件系统的代码为例,假设要开发一个电商平台的订单管理系统,该系统需具备订单创建、查询、更新和删除功能,同时要与库存管理系统和支付系统进行交互。这个问题包含多个子任务,若不进行分解,直接让 AI 生成代码,可能会得到结构混乱、难以维护的代码。

将其分解为以下步骤:首先是订单数据结构设计,确定订单数据的存储格式和字段定义;其次是订单创建功能实现,编写代码实现用户下单时创建订单记录,并更新库存和触发支付流程;接着是订单查询功能,实现根据订单 ID、用户 ID 等条件查询订单信息;然后是订单更新功能,允许修改订单状态、收货地址等信息;最后是订单删除功能,在满足一定条件下删除订单记录,并处理相关的库存和支付记录。

逐步引导生成

在分解问题后,逐步引导 AI 生成代码是实现精准代码生成的关键。每一步的提示引导都应清晰明确,确保 AI 理解当前任务的目标和要求。

例如,在实现订单创建功能时,提示可以这样写:“首先,定义一个函数create_order,该函数接收用户 ID、商品列表、收货地址等参数。在函数内部,连接数据库,插入一条新的订单记录,订单记录应包含订单 ID(自动生成)、用户 ID、订单创建时间、订单状态(初始为‘未支付’)等字段。插入成功后,调用库存管理系统的接口,减少相应商品的库存数量。最后,返回订单创建结果,若成功返回订单 ID,若失败返回错误信息。使用 Python 和 Django 框架实现。” 通过这样详细的提示,AI 可以逐步生成如下代码:


from django.http import JsonResponse

from django.views.decorators.csrf import csrf_exempt

from.models import Order, OrderItem

import requests

@csrf_exempt

def create_order(request):

if request.method == 'POST':

data = request.json()

user_id = data.get('user_id')

product_list = data.get('product_list')

shipping_address = data.get('shipping_address')

# 自动生成订单ID,这里简单示例,实际应用中需更复杂的生成逻辑

import uuid

order_id = str(uuid.uuid4())

try:

# 创建订单记录

new_order = Order.objects.create(

order_id = order_id,

user_id = user_id,

order_time = timezone.now(),

order_status = '未支付',

shipping_address = shipping_address

)

for product in product_list:

product_id = product.get('product_id')

quantity = product.get('quantity')

# 创建订单项记录

OrderItem.objects.create(

order = new_order,

product_id = product_id,

quantity = quantity

)

# 调用库存管理系统接口减少库存

inventory_url = 'http://inventory_system.com/decrease_stock'

inventory_data = {

'product_id': product_id,

'quantity': quantity

}

response = requests.post(inventory_url, json = inventory_data)

if response.status_code != 200:

raise Exception('库存更新失败')

return JsonResponse({'order_id': order_id}, status = 200)

except Exception as e:

return JsonResponse({'error': str(e)}, status = 500)

else:

return JsonResponse({'error': 'Only POST method is allowed'}, status = 405)

通过逐步引导,AI 能够按照清晰的逻辑生成代码,每一步都有明确的目标和实现方式,从而提高代码的准确性和可维护性。这种链式思维提示方法在处理复杂问题时尤为有效,它能将复杂的任务拆解为简单的步骤,让 AI 逐步完成,最终得到完整准确的代码 。

技巧五:系统性测试与优化

建立评估指标

在 AI 代码生成过程中,建立科学合理的评估指标是确保代码质量的关键。这些指标涵盖多个维度,能全面反映代码的优劣,为后续的优化提供有力依据。

准确性是评估代码质量的核心指标之一,它要求代码能够准确无误地实现预期功能。这不仅包括语法的正确性,更涉及逻辑的严密性。以一个简单的数学计算函数为例,若要求生成一个计算两个整数之和的函数,代码不仅要符合 Python 或其他编程语言的语法规范,在逻辑上也要确保输入的两个整数能被正确相加,返回准确的结果。任何语法错误,如变量未定义、语法结构错误,或者逻辑错误,如计算逻辑错误,都会导致代码无法准确实现功能,降低准确性。

可读性对于代码的维护和团队协作至关重要。易读的代码结构清晰、变量命名规范、注释详实。在一个大型项目中,多个开发者可能会参与到代码的维护和扩展中,如果代码可读性差,其他人很难理解代码的逻辑和功能,这将极大地增加维护成本和出错的概率。例如,使用有意义的变量名,如用total_price表示总价,而不是简单的tp,能让代码更易理解;在关键代码段添加注释,解释代码的功能和实现思路,能帮助其他开发者快速掌握代码的意图。

可维护性衡量代码在后续修改、扩展时的难易程度。具有良好可维护性的代码通常采用模块化设计,各个模块功能独立、职责单一,模块之间的耦合度低。当需求发生变化或需要修复漏洞时,开发者能够轻松定位到相关代码模块进行修改,而不会对其他部分产生过多影响。比如,在一个电商系统中,将用户管理、订单管理、商品管理等功能分别封装在不同的模块中,每个模块有清晰的接口和功能定义,当需要添加新的商品属性时,只需在商品管理模块中进行修改,而不会影响到其他模块的正常运行。

迭代优化 Prompt

根据评估指标的反馈,对 Prompt 进行迭代优化是提升 AI 生成代码质量的重要手段。通过不断调整 Prompt 的内容和结构,引导 AI 生成更符合要求的代码。

例如,最初的 Prompt 为 “使用 Python 编写一个简单的文件读取函数”,AI 生成的代码可能只是实现了基本的文件读取功能,没有考虑到异常处理等情况。根据准确性和可维护性的评估要求,对 Prompt 进行优化,改为 “使用 Python 编写一个健壮的文件读取函数,该函数需处理文件不存在、权限不足等常见异常情况,并返回有意义的错误信息”。优化后的 Prompt 为 AI 提供了更详细的任务要求,AI 生成的代码如下:


def read_file(file_path):

try:

with open(file_path, 'r', encoding='utf-8') as file:

content = file.read()

return content

except FileNotFoundError:

return "文件不存在"

except PermissionError:

return "权限不足,无法读取文件"

except Exception as e:

return f"读取文件时出现错误: {str(e)}"

对比优化前后的代码,优化后的代码增加了异常处理机制,能够更好地应对各种可能出现的情况,提高了代码的准确性和健壮性。通过这种迭代优化的方式,不断根据评估结果调整 Prompt,能让 AI 生成的代码质量逐步提升,更符合实际项目的需求。在实际应用中,可能需要多次迭代优化 Prompt,每次优化后都重新评估代码质量,直到生成的代码满足所有的评估指标要求。

实战案例分析

案例一:Web 应用开发

在一个 Web 应用开发项目中,需要使用 React 和 Node.js 开发一个简单的博客系统。借助 AI 代码生成工具,运用 Prompt Engineering 技巧来实现这一功能。

首先,明确功能需求。使用精准清晰的指令描述,告知 AI 要开发一个博客系统,该系统需包含用户注册登录、文章发布、文章列表展示、文章详情查看等功能。同时,规定输出格式为符合 React 和 Node.js 项目结构的代码,采用 ES6 语法规范,使用 Axios 进行 HTTP 请求,数据库使用 MongoDB。

为了让 AI 更好地理解任务,提供有效的示例引导。给出一个简单的 React 组件示例,展示如何创建一个按钮组件,并处理点击事件;再给出一个 Node.js 中使用 Express 框架连接 MongoDB 的示例,展示如何进行数据库查询操作。

在开发过程中,合理利用上下文信息。补充背景知识,说明博客系统的业务流程,如用户注册时需要验证邮箱格式、密码强度等;文章发布时需要进行内容审核等。同时,关联相关代码片段,将用户认证模块的代码与文章发布功能关联起来,确保只有登录用户才能发布文章。

对于复杂问题,采用链式思维提示。将博客系统的开发分解为多个步骤,先完成用户认证模块,再进行文章数据结构设计,接着实现文章发布、列表展示和详情查看功能。在每个步骤中,逐步引导 AI 生成代码,例如在实现文章列表展示功能时,提示 AI 先从 MongoDB 中查询文章数据,然后将数据传递给 React 组件进行渲染,同时要处理分页逻辑。

完成代码生成后,建立评估指标进行系统性测试与优化。评估指标包括代码的准确性,即功能是否正常实现;可读性,代码结构是否清晰、注释是否完善;可维护性,模块划分是否合理、是否易于扩展。根据评估结果,对 Prompt 进行迭代优化。例如,发现文章列表展示时加载速度较慢,通过分析发现是数据库查询语句未优化,于是调整 Prompt,要求 AI 优化查询语句,增加索引等操作。经过多次迭代优化,最终生成的代码能够高效、稳定地运行,满足项目需求 。

案例二:数据分析脚本编写

在数据分析项目中,需要使用 Python 和 Pandas 库编写一个数据分析脚本,用于处理销售数据。数据包含订单编号、客户名称、销售金额、销售日期等字段,要求统计每个客户的总销售额,并按销售额从高到低排序,最后生成可视化图表展示结果。

运用精准清晰的指令描述,向 AI 明确功能需求,包括数据处理步骤、统计要求和可视化需求。规定输出格式为 Python 脚本,使用 Pandas 库进行数据处理,Matplotlib 库进行可视化。

为了引导 AI 准确生成代码,提供有效的示例引导。给出一个使用 Pandas 读取 CSV 文件并进行简单数据统计的示例,如统计某列数据的平均值;再给出一个使用 Matplotlib 绘制柱状图的示例,展示如何设置图表标题、坐标轴标签等。

合理利用上下文信息,补充背景知识,说明销售数据的来源和可能存在的数据质量问题,如数据缺失、格式不一致等,并要求 AI 在代码中添加数据清洗步骤。同时,关联相关代码片段,将数据读取部分与数据清洗、统计和可视化部分关联起来,确保整个数据分析流程的连贯性。

采用链式思维提示,将数据分析任务分解为多个步骤。首先读取销售数据文件,然后进行数据清洗,接着统计每个客户的总销售额,再对统计结果进行排序,最后使用 Matplotlib 生成柱状图展示排名前 10 的客户销售额。在每个步骤中,逐步引导 AI 生成代码,例如在数据清洗步骤中,提示 AI 检查数据是否存在缺失值,若存在则使用指定方法进行填充;检查数据格式是否正确,若不正确则进行转换。

完成代码生成后,建立评估指标进行系统性测试与优化。评估指标包括代码的准确性,即统计结果是否正确、可视化图表是否符合要求;运行效率,处理大规模数据时的运行时间是否在可接受范围内;代码的可复用性,是否将常用功能封装成函数以便在其他项目中复用。根据评估结果,对 Prompt 进行迭代优化。例如,发现处理大规模数据时运行效率较低,通过分析发现是数据统计部分的算法复杂度较高,于是调整 Prompt,要求 AI 优化统计算法,采用更高效的数据结构和计算方法。经过多次优化,生成的数据分析脚本能够快速、准确地处理销售数据,并生成直观的可视化图表,为业务决策提供有力支持。

总结与展望

回顾 5 大技巧

本文深入探讨了 Prompt Engineering 在 AI 代码生成中的 5 大实用技巧,这些技巧是提升 AI 生成代码质量和准确性的关键。精准清晰的指令描述是基础,明确功能需求和规定输出格式,能让 AI 准确理解任务,生成符合预期的代码。有效的示例引导,无论是单样本还是少样本示例,都能帮助 AI 快速掌握任务模式,尤其在复杂任务中,少样本示例能覆盖更多细节,引导 AI 生成更完整的代码。合理利用上下文信息,通过补充背景知识和关联相关代码片段,能使 AI 生成的代码更贴合实际应用场景,与现有项目更好地融合。采用链式思维提示,将复杂问题分解为多个步骤,逐步引导 AI 生成代码,能确保代码逻辑清晰、结构合理。系统性测试与优化,通过建立评估指标,从准确性、可读性和可维护性等多维度评估代码质量,并根据评估结果迭代优化 Prompt,不断提升代码质量 。

未来发展趋势

随着 AI 技术的不断进步,Prompt Engineering 在 AI 代码生成领域将迎来更广阔的发展空间。未来,AI 代码生成工具将更加智能,能够理解更复杂的自然语言指令,生成更高质量的代码。Prompt Engineering 的技巧和方法也将不断演进,更加注重人机协作的效率和效果。同时,随着低代码 / 无代码平台的兴起,Prompt Engineering 将在这些平台中发挥重要作用,帮助非专业开发者更轻松地创建应用程序。

对于开发者而言,持续学习和探索 Prompt Engineering 的新技巧、新方法至关重要。掌握这些技能,不仅能提升工作效率,还能在 AI 时代的软件开发中占据优势。希望本文介绍的 5 大技巧能为读者在 AI 代码生成的实践中提供有益的参考,助力大家充分发挥 AI 的潜力,创造出更优秀的软件作品。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐