使用大语言模型进行编程的提示词实践指南
学习思考
Jan 12, 2025
type
Post
status
Published
date
Jan 12, 2025
slug
best-practices-for-programing-prompts
summary
大语言模型已经成为开发者工具箱中的重要工具,能够帮助解决各种编程问题、生成代码、调试错误等,然而,要充分发挥 LLM 的潜力,编写有效的提示词至关重要
tags
AI
category
学习思考
icon
password
Property
Apr 23, 2025 05:43 AM

引言

大语言模型(LLM)已经成为开发者工具箱中的重要工具,能够帮助解决各种编程问题、生成代码、调试错误等,然而,要充分发挥 LLM 的潜力和效能,编写有效的提示词(Prompt)至关重要。
这就不得不说下提示工程,这是一门新兴的实用技术,指的是设计、优化和精心制作输入提示,以从大语言模型中获取最佳结果的过程。就像一位摄影师需要掌握摄影技巧才能拍出好照片,一位开发者需要掌握提示工程技巧才能从大语言模型中获取最有价值的编程帮助。提示工程的核心目标是引导大语言模型生成符合特定需求的输出,在编程领域,这意味着生成高质量、可维护、安全且符合需求的代码。
本指南总结了使用 LLM 进行编程(辅助)时的最佳提示实践,并提供了具体示例来说明什么是好的提示和不好的提示,帮助大家在使用各种 AI 编程工具时更加得心应手。

提示工程核心原则

1. 明确具体

  • 明确表达你的请求:清晰地说明你需要什么,避免模糊不清的表述
  • 包含相关上下文和背景信息:提供必要的项目背景、技术栈和约束条件
  • 指定期望的输出格式:说明你希望得到的代码格式、注释风格等
  • 提及任何限制或要求:如性能要求、兼容性考虑、代码风格等

2. 提供充分上下文

  • 解释为什么需要这段代码:说明代码的用途和目标
  • 分享相关的背景知识:项目架构、已有组件、设计模式等
  • 提及之前的尝试(如果有必要的话):已经尝试过的方法及其问题
  • 描述你对该主题的熟悉程度(如果需要的话):这有助于LLM调整回答的技术深度

3. 结构化你的请求

  • 将复杂请求分解为更小的部分:逐步引导LLM完成复杂任务
  • 使用编号列表提出多部分问题:帮助LLM有条理地回答
  • 如果询问多个内容,明确优先级:指出哪些部分最重要
  • 考虑使用标题或章节进行组织:使请求更加结构化

4. 指定输出格式

  • 指明期望的回答长度(简洁vs详细):根据需要指定详细程度
  • 请求特定格式(要点、段落、表格等):根据信息类型选择合适的格式
  • 说明是否需要代码示例、引用或其他特殊元素:明确需要的辅助内容
  • 指定语气和风格(正式、对话式、技术性等):根据用途调整

为编程服务的提示词

1. 代码生成提示

当请求生成代码时,考虑包含:
  • 编程语言和版本:明确指定使用的语言和版本
  • 使用的库或框架:列出相关的依赖项
  • 错误信息(如果是故障排除):提供完整的错误信息和堆栈跟踪
  • 示例输入/输出:提供预期行为的具体例子
  • 性能考虑:说明是否有性能要求
  • 兼容性要求:指明需要支持的环境或平台
这些可以放置在一个文件中,比如 dev.txt,然后在每次请求 LLM 的时候,固定放入 Context 中,这样能保证生成的代码符合要求且具有更高的一致性

2. 代码修改提示

当请求修改现有代码时,尽可能做到:
  • 尽可能提供完整的上下文:不仅仅是需要修改的部分,还包括相关的函数和类
  • 明确指出问题所在:具体说明需要修改的部分
  • 解释期望的行为:描述修改后代码应该如何工作
  • 提及任何不应更改的部分:指明哪些功能必须保持不变,缩小更改范围(实践过的都知道这个多么重要)

3. 调试提示

当寻求帮助调试时:
  • 描述预期行为与实际行为:清楚说明代码应该做什么和实际做了什么
  • 提供完整的错误信息:包括错误消息、堆栈跟踪等
  • 描述已尝试的解决方案(如果需要的话):避免重复已经尝试过的方法,提高成功率
  • 提供可重现的最小示例(高阶需求):简化问题以便更容易理解

提示模板示例

最好附带上 dev.txt, 也就是项目背景、技术栈和基本规范,如果使用 Cursor,可以写入 .cursorrules

代码生成模板

我需要一个[功能描述]的[编程语言]函数。 技术要求: - 使用[库/框架/版本] - 需要处理的输入:[输入描述和示例] - 期望的输出:[输出描述和示例] - 性能考虑:[任何性能要求] - 错误处理:[如何处理异常情况] 额外上下文: [项目背景、使用场景等相关信息] 请提供带有适当注释的代码,并简要解释关键部分的工作原理。

代码修改模板

我需要修改以下[编程语言]代码: ``` [粘贴完整代码] ``` 问题描述: [详细描述当前代码的问题] 期望行为: [描述修改后代码应该如何工作] 限制条件: - [列出任何不能改变的部分] - [提及任何性能或兼容性要求] 请提供修改后的完整代码,并简短说明你所做的更改。

调试帮助模板

我正在调试以下[编程语言]代码: ``` [粘贴相关代码] ``` 错误信息: ``` [粘贴完整错误信息] ``` 预期行为: [描述代码应该做什么] 实际行为: [描述代码实际做了什么] 我已经尝试: - [列出已尝试的解决方案] 环境信息: - 操作系统:[OS名称和版本] - [语言/框架]版本:[版本号] - 相关依赖:[相关库和版本] 请帮我找出问题所在并提供解决方案。

迭代提示技巧

与 LLM 交互通常是一个迭代过程,也就是 Vibe Programming 的精髓所在
  1. 从初始提示开始:提供基本信息和请求
  1. 评估回应:检查LLM的回答是否满足需求
  1. 根据有用或缺失的内容完善提示:添加更多细节或澄清要求
  1. 继续对话以深入探讨主题或者完成任务:通过后续问题获取更多信息
迭代提示示例
👨 - 如何在 Python 中处理 CSV 文件? 🤖 - [提供了基本的CSV处理方法] 👨 - 我需要更具体的帮助: 我有一个包含 1000 万行数据的大型 CSV 文件,每行有约 50 个字段。 我需要1.高效地读取这个文件 2.筛选特定条件的行 3.将结果写入新文件。 有什么推荐的库和方法可以处理这种大数据量而不会耗尽内存? 🤖 - [提供了处理大型CSV文件的方法] 👨 - 我决定使用pandas和chunking方法。现在我遇到了一个具体问题: 如何在处理每个数据块时保持一个运行总计,以便在最终输出中包含汇总统计信息?能否提供一个代码示例?

常见问题和解决方案

1. 提示词过于宽泛

⚠️
帮我写一个网站
💡
我需要一个使用React和Tailwind CSS的个人作品集网站,包含首页、项目展示和联系表单三个页面。网站风格应该是极简主义,主色调为蓝色和白色

2. 缺乏必要上下文和信息

⚠️
这段代码为什么不工作?
💡
提供完整代码、错误信息、预期行为和已尝试的解决方案

3. 忽略技术细节

⚠️
写一个爬虫程序
💡
请使用Python 3.9和BeautifulSoup4库编写一个网页爬虫,用于提取网站的文章内容。 技术要求: - 使用requests库获取页面内容 - 使用BeautifulSoup4解析HTML - 实现请求间隔和重试机制,避免被网站封禁 - 将结果保存为JSON格式 输入示例: - 目标URL: https://example-news.com/tech - 要提取的元素: 文章标题、发布日期、作者、正文内容 输出示例: ```json { "articles": [ { "title": "新技术突破", "date": "2023-05-15", "author": "张三", "content": "文章正文..." }, // 更多文章... ] }
性能要求: - 能够处理至少100个页面而不崩溃 - 包含适当的错误处理

4. 一次请求过多功能

⚠️
我想要一个API,可以获取用户数据,处理支付,发送电子邮件通知,并生成报告
💡
我需要设计一个RESTful API系统,具有以下功能 # 1. 用户管理(最高优先级) - 用户注册和身份验证端点 - 用户资料CRUD操作 - 权限管理 请提供用户管理部分的API设计,包括端点定义、请求/响应格式和安全考虑。
我们使用 Node.js 和 Express 框架

高级提示词技巧

1. 角色设定

给LLM分配特定角色可以引导其以特定方式思考问题
💡
请你作为一位有 10 年经验的高级安全工程师,审查以下Python代码中的安全漏洞 ```python def process_user_input(user_input): query = "SELECT * FROM users WHERE username = '" + user_input + "'" results = database.execute(query) return results ``` 请详细分析可能的安全风险,并提供符合OWASP最佳实践的修复方案。

2. 思维链提示

要求LLM逐步思考问题,可以获得更深入的分析
💡
请分析以下算法的时间复杂度,并一步步解释你的推理过程: ```python def mystery_function(n): result = 0 for i in range(n): for j in range(i, n): result += i * j return result ``` 请首先确定每个循环的执行次数,然后推导出总体时间复杂度。

3. 对比学习

通过对比不同方法,可以获得更全面的理解
💡
请比较 React 中的 Redux 和 Context API 用于状态管理的优缺点。分析应包括: 1. 学习曲线 2. 性能考虑 3. 适用场景 4. 代码复杂性 5. 社区支持 对于每种方法,请提供一个简单的计数器实现示例。

4. 逐步引导技巧

要求 LLM 将复杂任务分解为清晰的步骤,并在每个步骤后等待反馈
💡
我将帮助你实现一个基于React和Express的全栈应用。让我们逐步进行: 第1步:首先,我们需要创建项目结构。请确认你想要的文件结构是: - 前端和后端分开的结构 - 前端使用Create React App - 后端使用Express与Node.js 这样的结构合适吗?或者你有其他偏好?

5. 精简沟通原则

在编程提示中保持简洁和直接,避免过多的冗词
⚠️
我想要你帮我实现一个非常棒的用户登录系统,这个系统应该非常安全,并且有很多功能,比如说它应该能够支持用户注册,登录,忘记密码等等功能,而且我希望它能够非常安全,不会被黑客攻击,我想使用 Node.js 和 Express 来实现这个系统,但是我不知道应该怎么开始…
💡
请实现一个基于Node.js和Express的用户认证系统,包含: 1. 用户注册和登录 2. 密码重置功能 3. JWT认证 4. 防止SQL注入和XSS攻击 请提供关键文件结构和代码示例。

完整项目开发最佳实践

当使用LLM进行完整项目开发或迭代时,要求 LLM 按照以下原则可以显著提高效率和成功率

💡迭代开发原则

  • 明确的进度反馈:在每个开发阶段后请求反馈
  • 问题优先解决:先解决失败的编辑或错误,再继续前进
  • 最小交互原则:尽量减少来回交互,提高效率
  • 进度跟踪:记录和文档化已完成的工作

💡数据完整性原则

  • 使用真实数据:请求必要的API密钥或凭证进行测试
  • 清晰的错误状态:实现明确的错误提示和处理
  • 解决根本原因:当遇到API或连接问题时,专注于解决根本问题
  • 有效的错误处理:实现详细、可操作的错误消息

💡主动和用户交互原则

  • 专注于当前需求:优先解决我们的即时问题和需求
  • 明确的确认:在完成任务后需要我们明确确认
  • 专注于当前任务:不进行与我们指示无关的更改
  • 清晰的步骤沟通:清晰地传达它的下一步计划

结论

编写有效的编程提示是一项可以通过实践发展和成长的技能,通过清晰、具体并提供上下文,你可以从 LLM 获得更有价值和相关的回应,而且如果初始回应没有完全解决你的需求,你始终可以完善你的提示。良好的提示工程不仅能节省时间,还能显著提高 LLM 生成的代码质量和相关性,相信随着你与 LLM 交互经验的积累,你将开发出适合自己编程风格和需求的提示策略。
  • AI
  • 递归“扫盲”贴
    如何在 Rust 中实现 Visitor 模式