每位开发者必知的15种代码生成提示技巧

引言

提示工程对于有效的代码生成变得至关重要。通过精心设计的结构化提示,您可以引导大型语言模型(LLMs)生成、完善和优化您应用程序的代码。在本文中,我们将介绍15种经过验证的提示技术——分为根本基于精炼基于分解基于推理预热。每种技术将通过创建和改进一个简单的Flask web应用程序的过程进行示例说明。

我们将从一个基本的“Hello World” Flask应用程序开始,然后逐步增强它——展示每种技术如何系统地完善或扩展生成代码的能力。

研究说明:我们检查了aixrv.org以寻找新的提示技术。在撰写本文时,我们尚未发现任何超出所列技术的新方法。提示工程正在快速发展,因此请务必关注新兴的实践。


1. 根本技术

根本技术是基本的提示方法,提供了获取简单代码输出的清晰、直接的路径。


1.1. 直接指令提示

概述

  • 您给出一个简单明了的命令,没有额外的细节或上下文。

提示示例

“生成一个最小的 Flask 应用程序,使用 Python 在根端点显示‘Hello World!’。”

生成的代码(概念性)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello World!"

if __name__ == '__main__':

app.run(debug=True)

为什么有效

  • 对于较小的任务,直接、简洁的指令通常就足够了。
  • 如何改进:这为后续技术中的进一步增强奠定了基础

1.2. 基于查询的提示

概述

  • 您将请求以问题的形式提出,鼓励给出解释性的答案或代码片段。

提示示例

“我如何创建一个最小的 Flask 应用,使其在主页上返回‘Hello World!’?”

生成的回应(概念性)

  • 模型可能不仅返回代码片段,还会解释创建 Flask 应用的每一步。

为何有效

  • 提问可以鼓励大型语言模型(LLMs)提供更丰富的信息。
  • 如何改进:与直接指令相比,您将获得额外的上下文理由来解释代码。

1.3. 基于示例的提示

概述

  • 您提供一个所需风格或格式的示例,以便模型理解您期望的结构。

提示示例

“这是一个简单的 Node.js Express ‘Hello World’ 服务器:

const express = require('express');
const app = express();

app.get('/', (req, res) => res.send('Hello World!'));
app.listen(3000, () => console.log('Example app listening on port 3000!'));

在Flask中创建一个类似的“Hello World”服务器。

改进之处

  • 该模型可以镜像您示例中的结构和编码风格,确保跨框架的一致性。
  • 这种方法比直接指令更为精确,因为它将输出锚定在一个已知的模式或风格中。

2. 基于细化的技术

基于细化的技术围绕对现有代码进行迭代、改进或优化。


2.1. 迭代细化提示

概述

 

    • 您从一个初始解决方案开始(例如,一个最小的 Flask 应用),然后指示模型进一步细化或增强代码。

提示序列

 

    1. “生成一个返回‘Hello World!’的最小 Flask 应用”

 

    1. “现在,修改这个 Flask 应用,添加一个 /hello/<name> 端点,以用户的名字进行问候.”

 

细化后的代码片段(概念性)

 

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():

return "你好,世界!"

@app.route('/hello/<name>')
def hello_name(name):
    return f"你好, {name}!"

if __name__ == '__main__':
    app.run(debug=True)

 

为什么有效

 

  • 您在现有代码的基础上进行构建,引导模型逐步改进它。

 

  • 如何改进:这种技术促进了一个迭代工作流程,使您能够以更小的步骤适应和扩展功能。

2.2. 扩展提示

概述

  • 您特别要求模型向现有代码添加新功能或部分。

提示示例

 

“向现有的 Flask 应用添加一个端点,返回包含示例用户列表的 JSON 响应。”

 

优化后的代码片段(概念性)

 

@app.route('/users')
def get_users():

users = [
        {"id": 1, "name": "Alice"},
        {"id": 2, "name": "Bob"}
    ]
    return {"users": users}

 

为什么有效

  • 针对单一新特性,使模型能够集中注意力。
  • 如何改进:比迭代优化提供更细粒度的控制——非常适合基于特性的扩展

2.3. 样式/格式转换

概述

  • 您可以请求样式修改,例如 PEP 8 合规性、命名约定或架构模式。

提示示例

“获取当前的 Flask 应用代码,并将函数名称转换为遵循 PEP 8 命名(例如,hello_worldhello_world)。同时,确保行长度不超过 79 个字符。”

为什么有效

  • 模型系统地应用您的编码风格偏好。
  • 如何改进: 在功能建立后,您可以确保代码符合风格指南或其他最佳实践——这是生产环境中的一个重要步骤。

3. 基于分解的技术

基于分解的提示将大型任务分解为较小的步骤,从而增强了清晰度和准确性。


3.1. 按函数分解

概述

  • 您将复杂任务分解为多个子函数或模块。

提示示例

  1. “创建一个函数 init_db(),用于初始化Flask应用的SQLite数据库.”
  2. “创建一个函数 insert_user(name),用于向数据库添加用户.”
  3. “创建一个函数 get_all_users(),用于从数据库中检索所有用户.”

结果(概念性)

import sqlite3

def init_db():


conn = sqlite3.connect('mydatabase.db')
c = conn.cursor()
c.execute('CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)')
conn.commit()
conn.close()

def insert_user(name):
conn = sqlite3.connect('mydatabase.db')

这段代码展示了如何使用 SQLite 数据库。在开始时,通过 `sqlite3.connect` 方法连接到名为 `mydatabase.db` 的数据库。如果该数据库不存在,则会自动创建。接着,使用 `cursor` 方法创建一个游标对象 `c`,并通过 `execute` 方法执行 SQL 语句,创建一个名为 `users` 的表,表中包含 `id` 和 `name` 两个字段,其中 `id` 是主键。然后,通过 `commit` 方法提交更改,最后使用 `close` 方法关闭数据库连接。

接下来的 `insert_user` 函数用于插入用户数据,函数参数 `name` 表示用户的名称。再次连接到 `mydatabase.db` 数据库以进行数据插入操作。


c = conn.cursor()
c.execute('INSERT INTO users (name) VALUES (?)', (name,))
conn.commit()
conn.close()

def get_all_users():
conn = sqlite3.connect('mydatabase.db')
c = conn.cursor()
c.execute('SELECT id, name FROM users')

results = c.fetchall()
conn.close()
return results

如何改进

  • 将大型任务组织成模块化的部分,使其更易于维护
  • 鼓励系统化的代码生成。

3.2. 基于块的提示

概述

  • 您提供部分代码,并要求模型填充特定缺失的部分。

提示示例

“以下是一个Flask应用的开头。请填充缺失的路由,以便添加用户和从数据库中检索所有用户。”

from flask import Flask, request
from db_utils import init_db, insert_user, get_all_users

app = Flask(__name__)

init_db()

# TODO: 在这里添加路由

if __name__ == '__main__':
    app.run(debug=True)

为什么有效

  • 将模型的焦点集中在缺失的部分,确保与提供的代码一致性
  • 如何改进:比广泛的提示更有针对性——在实际项目环境中逐步构建时非常有用。

3.3. 分步说明

概述

  • 列出您希望在代码中执行的每个子任务或逻辑步骤。

提示示例

  1. “导入必要的库。”
  2. “设置数据库初始化。”
  3. “创建一个路由以使用 insert_user() 添加新用户。”
  4. “创建一个路由以使用 get_all_users() 列出所有用户。”

为什么有效

  • 使代码生成过程更加透明
  • 如何改进:通过指定明确的操作顺序,模型可以更可靠地生成正确的功能顺序。

4. 基于推理的技术

基于推理的提示鼓励模型在提供代码之前阐明(或至少模拟)其思维过程。


4.1. 思维链提示

概述

    • 您要求模型逐步分解其推理或逻辑,然后再提供代码解决方案。

提示示例

“逐步解释如何为Flask应用添加身份验证,然后提供最终的代码片段。”

为什么有效

    • 鼓励模型生成一个解释路径来解决问题,从而产生更连贯或正确的代码。

 

    • 如何改进: 除了代码,您还可以获得推理,这有助于调试或进一步优化。

 


4.2. 零样本思维链

概述

    • 要求模型在没有提供推理格式的明确示例的情况下,逐步推理解决问题。

提示示例

“解释您如何决定在Flask中使用哪个库进行密码哈希,然后展示将该库集成到用户注册中的代码。”

如何改进

    • 与思维链类似,但要求模型自发提出推理步骤。

 

    • 在代码生成的上下文中,这通常导致对库选择和使用说明的全面方法。

4.3. 少样本推理链

概述

  • 提供一个或多个简短示例,说明如何对问题进行推理。然后要求模型在新问题上复制这一过程。

提示示例

  1. 示例: 要创建一个登录系统,我们识别用户表,检查用户凭证,并验证它们。代码片段如下。让我们对用户注册采用这种方法。”
  2. “使用上述逐步推理的方法,添加一个‘/register’路由,并在数据库中安全地存储新用户凭证。”

为什么有效

  • 将逐步指令的清晰性与示例演示相结合。
  • 如何改进: 为模型提供一个框架,以便对新请求应用一致、系统的逻辑。

5. 预设技术

基于预设的提示使用附加上下文(角色、参考或模板)来影响生成代码的风格和领域知识。


5.1. 基于角色的提示

概述

  • 模型被指示采用特定领域专家的观点或角色。

提示示例

“你是一名专注于安全的高级Python后端开发人员。生成一个Flask路由以安全地处理用户注册。”

为什么有效

  • 模型根据角色的领域知识量身定制解决方案,通常包括安全最佳实践。
  • 如何改进:有助于生成符合专家级模式和潜在陷阱的代码。

5.2. 骨架(模板)引导

概述

  • 你提供一个骨架或大纲,并留有占位符供模型填写。

提示示例

“在这个Flask应用模板中填写占位符,以实现用户登录表单:

from flask import Flask, request, render_template

app = Flask(__name__)

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # 第一步:______
        # 第二步:______
        # 第三步:返回______
    return render_template('login.html')

if __name__ == '__main__':

app.run(debug=True)

为什么有效

  • 限制模型填充一个特定框架
  • 如何改进:确保代码无缝集成到预定结构中——在大型团队或预定义架构中非常有用。

5.3. 参考重型提示

概述

  • 提供扩展的参考材料,如文档或数据模式,然后提示模型在生成的代码中使用它。

提示示例

“根据以下SQLAlchemy文档[链接或片段],更新Flask应用程序路由,以使用SQLAlchemy模型处理用户数据,而不是原始SQL调用。”

为什么有效

  • 大型语言模型(LLM)可以适应特定领域的参考,生成与最佳实践文档一致的解决方案。
  • 如何改进:允许专业知识的整合,确保生成的代码与参考材料保持准确和最新。


结论

 

通过利用这15种提示技术,您可以系统地开发、扩展和优化Flask应用程序或任何代码库,使用大型语言模型。每一种新技术要么建立在之前的基础上,要么提供新的方法来完善、分解、推理或引导代码生成过程:

  • 根本技术奠定基础,使初始代码生成的摩擦最小化。

 

  • 精炼技术对生成的代码进行打磨和扩展。

 

  • 分解技术将复杂任务分解为可管理的部分。

 

  • 推理技术鼓励模型提供(或模拟)逐步的思考过程,从而提高清晰度和正确性。

 

  • 引导技术添加上下文、角色或参考资料,以影响代码的风格和领域相关性。

 

随着大型语言模型的不断发展,提示策略也在不断演变。请继续尝试这些方法的变体,关注新的最佳实践(例如,在aixrv.org或类似论坛上),并根据您的特定领域和工作流程需求调整提示。

准备好进一步提升您的Flask应用程序了吗?

尝试在单一工作流程中结合多种技术。例如,可以从基于示例基于角色的提示开始,使用迭代优化来细化输出,最后采用参考重型的方法,以确保您的代码符合特定的库或组织标准。

更多