高效AI提示工程:WordPress代码生成实战指南

本文深入探讨如何通过精心设计的AI提示词生成高质量的WordPress代码,涵盖PHP函数编写、API集成、WP CLI命令开发等实战技巧,帮助开发者提升AI辅助编程效率。

高效AI提示工程:WordPress代码生成实战指南

引言

未来几年,所有代码的编写方式无疑将发生重大转变。理解大型学习模型(LLM)的工作原理以及如何通过提示词与其最佳交互,将成为开发者必备的关键技能。许多开发者和非开发者已经开始这样做,因为能够按需生成代码的能力极具价值。

过去两年我一直在实验代码生成,最近6个月取得了巨大飞跃。随着时间的推移,这将成为常见模式,但即使模型不断进步,与ChatGPT或Claude等AI提示交互的基本核心概念将始终存在。

这被称为提示工程,我将分享在为WordPress站点生成PHP、SASS、JS和HTML代码时发现特别有效的方法和技巧。这些概念同样适用于任何其他CMS或开发框架。

付出与回报成正比

与AI提示交互生成代码时,最重要的规则是:输入质量直接决定输出质量。记住你不是在向人描述任务——这听起来显而易见,但却是一个我们甚至没有意识到的新概念。

当你要求ChatGPT或Anthropic的Claude编写代码时,必须非常清晰。人类可以猜测你的意思、提出问题并自行修正错误,但AI不会这样做。它只遵循你输入的文字。如果你遗漏了什么,AI不会知道缺失了什么。

对人说: “你能修改文章标题,让博客文章前面加上’前缀:’,但页面保持不变吗?确保正确转义以避免安全问题”

对AI提示: “编写一个WordPress函数,使用the_title过滤器修改所有文章标题,使用内置函数在标题前添加’前缀:’。这仅适用于文章(非页面)”

这是一个非常基础的例子,我绝不认为上面的AI提示是好的。但与向人提出的请求相比,一些关键方面将产生更好的结果:

  • 提到WordPress为提示提供了重要的上下文细节
  • 使用内置函数告诉模型首先关注哪里寻找解决方案
  • 提供the_title过滤器钩子精确告诉模型在何处以及如何以最佳方式执行此代码

这三个方面共同大大缩小了模型的关注范围,使其能够更专注于核心任务,从而产生更高质量的输出。

代码组织与重用

编写高效AI提示生成代码的第一步是牢固掌握最适合实现理想最终结果的系统、工具、API和方法。

精心设计的提示生成代码,无论是为WordPress还是任何其他编程框架或语言,都以最简单的方式充分利用当前代码库。

如果每个函数或代码块都独立于所有其他代码运行,AI生成的代码很快就会失控。你会发现代码库充满冗余,使其臃肿、难以测试,并且通常更难使用。

未来几年,我预测干净、有组织的代码将成为罕见的主要优势。本质上,如果AI不知道,它不会重用现有代码库的各个方面。

最终,输入上下文大小将变得足够大以接受整个代码库作为输入,这将有所帮助。但即使到那时,你的代码库也需要组织良好且易于理解。拥有DRY(不要重复自己) mindset始终是扎实编程的核心,无论是由人类还是AI crafted。

完全可以在几乎没有主题领域知识的情况下生成代码,但结果更有可能在未来造成问题。由AI推动的零碎构建的代码库更容易出现错误,也更难理解。最重要的是,这些问题会随着时间的推移不断累积。

我对所有开发者的最大建议是:随着越来越多的代码由AI生成,始终保持简单性和组织性。

好提示与坏提示

当提示指令过于模糊时,你很可能会得到一个部分完整的答案,其中包含如何填补空白的说明。在大多数情况下,这通常不太有用。

以下是一些导致不太理想的代码生成输出的提示示例:

坏提示: “提供代码向reddit发出API请求获取我的最新帖子”

“我想在网站上以列表形式显示”

向设计师/开发者提供此指令可能足以按预期实现,但对AI提示来说不行。它太模糊,缺乏足够的上下文信息供AI可靠地创建高质量代码输出。

  • 未提及WordPress,因此提供的代码可能无法在WP站点上使用。可能是Python或服务器端JavaScript
  • 未提供使用Reddit API的上下文,因此可能不会返回工作代码,而是获得如何编码的说明
  • 未提供从Reddit拉取内容类型的详细信息:评论、帖子还是两者?特定subreddit还是所有subreddit?
  • 未提供所需输出的详细信息,因此可能推荐使用插件或软件而不是代码

如果你的AI提示确实提供了PHP(虽然不太可能,但根据之前的对话可能会发生),它仍然不会是很有用的代码。它不会使用任何内部WP函数,如wp_remote_post和wp_remote_retrieve_body,而是使用原始PHP代码通过cURL发出请求。

生成的语法在某些托管环境中更容易失败,并且开发者和提示工程师将来也更难理解和评估。

因为没有提供关于请求本身的上下文,所以不会提供工作代码。最终它将达不到预期,并且需要大量的后续工作才能更接近最终产品。

虽然在生成代码时使用后续提示是可能的,有时甚至是有利的,但我建议尝试在第一个提示中尽可能接近最终结果。与AI来回的长对话通常会导致更多的混乱、不准确和最终的挫败感。

好提示: 现在来看一个更好的提示示例,它将产生显著更好的结果。

“创建一个WordPress函数,使用wp_remote_post()向{REDDIT API URL}发出API请求,使用API密钥{YOUR API-KEY}生成我最新帖子和评论的列表。我总是使用我的reddit用户名{YOUR REDDIT-USERNAME}。该函数将具有以下可选参数:

  • $limit(整数)默认为20,但接受1到100之间的数字。如果提供无效值,返回提及问题的WP_Error
  • $subreddits(数组)默认为[],接受包含要包含帖子和评论的特定subreddit的字符串数组。提供时设置适当的API参数,否则包含所有帖子和评论
  • $type(字符串)默认为’posts’,也可以传递为’comments’。此参数的值确定我们要列出的reddit内容类型,帖子或评论,并将设置适当的API参数/参数来过滤返回的结果

将检查wp_remote_post()返回的响应是否有错误,如果收到不成功的响应,将返回包含相关错误信息的详细WP_Error。

传递给函数的任何参数都将验证错误以验证格式和类型是否正确。发现问题时返回相关的WP_Error。

当从API请求收到成功的200响应时,响应体将使用内置WP核心函数(wp_remote_retrieve_*)提取,并限制为提供关联数组集合,每个包含以下属性/键:

  • type: comment|message
  • subject: 线程的标题/主题
  • content: 帖子或评论文本,取决于type值,可以支持API返回的任何HTML
  • published_on: 内容发布时的ISO日期时间
  • subreddit
  • url: 到帖子或直接到评论的哈希URL

此数据将填充基于此Emmet结构的HTML模板:

div.reddit-feed>article.reddit-feed__item>h2.reddit-feed__title+p.reddit-feed__byline+div.reddit-feed__content

模板将:

  • 提供这样的署名行:“X天前在/r/{subreddit}",其中subreddit是指向subreddit的链接,天数前使用WP human time diff函数
  • 使用wp_trim_words()缩短超过120个字的冗长内容,缩短时添加省略号
  • 将h2标题链接到reddit上的评论或帖子URL
  • __item将有一个bem修饰符,将类型标识为–post或–comment

还提供SASS/SCSS代码以以下方式设置模板样式:

  • 顶级容器将在20px和40px之间有上下边距,使用clamp()和视口宽度测量规则,基于600px和1680px之间的屏幕宽度进行调整
  • 每个项目将有20px底部边距和底部填充,以及1.5px底部边框,为20%黑色
  • 最后一个项目没有底部边框、没有填充和没有边距
  • h2将仅在底部有10px边距,并且是正文字体大小的1.3倍
  • 署名行将仅在底部有20px边距,并且是正文字体大小的0.9倍。所有文本将着色为60%黑色,包括subreddit链接,该链接将仅用下划线标识为链接
  • 内容及其中的任何HTML将没有边距

创建最终代码后,整体审查以识别任何语法或功能问题,使其尽可能接近生产就绪”

高级示例:复杂的自定义WP CLI命令

将所有这一切付诸实践可能看起来像以下示例,该示例显示如何创建复杂、详细的提示来创建一套强大的自定义WP CLI命令,这些命令将提供以下方式:

  • 为整个站点生成SEO报告
  • 从markdown文件安全创建新帖子
  • 查找并报告帖子内容和任何ACF自定义字段中的任何损坏链接

为此,我们需要为AI提示提供许多特定细节,以大纲格式执行此操作非常有帮助。如果做得好,这将比通常从头开始编写代码快至少10倍。

这是一个很好的例子,说明当正确用于代码生成时AI可以有多强大,但也很清楚,要真正有效,你需要相当深入的WordPress编程知识才能提及特定功能和方法。虽然你可以在没有这些知识的情况下生成代码,但如果你有,质量会好得多,并且不容易出错。

WordPress代码生成的AI提示:

“为我创建一个PHP类,添加到现有的WordPress功能插件中。

类的命名空间将是Kevinlearynet 类名将是WP_CLI 该类将使用单例模式,使用时将放在单个文件中 它将向我们的WordPress站点添加3个自定义WP CLI命令:

wp kevinlearynet create-post-from-markdown wp kevinlearynet list-seo-metadata wp kevinlearynet find-broken-links

每个命令将是一个单独的类方法,其名称使用下划线和小写字母 所有命令将在需要时提供实时输出,以报告任何成功操作或发生的错误 所有命令将在完成时提供最终摘要,或有关发生的任何错误及其原因的详细信息。

从markdown创建帖子将:

  • $title参数是可选的,默认为markdown中的H1
  • $markdown参数是必需的,如果缺失或不是有效的markdown语法,则提供错误消息并停止脚本
  • $slug参数是可选的,默认为标题的slugified版本,使用WP sanitize_title()函数
  • 如果找到具有相同slug或标题的现有帖子,则提供错误消息并停止脚本
  • 当成功创建帖子时,WP管理员中其编辑视图的URL在成功输出中提供
  • $status参数是可选的,默认为draft,但可以设置为任何有效的post_status字符串

列出SEO元数据命令将:

  • 输出将使用WP CLI表格格式,包含帖子标题、url、发布日期、seo标题、seo描述的列
  • 使用自定义WP_Query获取输出中包含的帖子,具有以下默认参数:
    • post_type是page或post
    • posts_per_page是500
  • seo标题和seo描述将从rank math或yoast seo插件中提取,具体取决于安装和激活的是哪一个。如果两者都不可用,将返回错误消息并停止脚本
  • 允许使用内置WP CLI帖子列表命令可用的所有参数来过滤选择表中包含的帖子的WP_Query

查找损坏链接命令将:

  • 允许使用内置WP CLI帖子列表命令可用的所有参数来过滤选择表中包含的帖子的WP_Query
  • 使用自定义WP_Query获取输出中包含的帖子,具有以下默认参数:
    • post_type是page或post
    • posts_per_page是-1
  • 查找the_content或任何ACF自定义字段中的所有链接,用于自定义查询返回的每个帖子
  • 使用内置wp_http_get函数验证所有链接是否有效且不返回错误
  • 认为任何非200响应都是损坏的,即使是301和302
  • 当找到一个或多个损坏链接时,将出现错误消息,提及找到的损坏链接数量,并且还有WP CLI表格格式,包含以下列:
    • 链接位置(内容或ACF字段名称)
    • url
    • http响应
  • 脚本运行时提供的错误不会停止或结束脚本,它们只会输出,脚本将继续处理下一个帖子
  • 当未找到损坏链接时,输出成功测试的链接总数
  • 在脚本运行时逐个输出结果

完成后,测试并验证整个类以确认没有错误并且该类是生产就绪的 向类添加PHP文档块,包含:

  • 标题:自定义WP CLI命令
  • 描述:添加自定义CLI功能,用于快速发布markdown内容、快速SEO分析以及测试内容和自定义字段中的损坏链接

向类中的每个方法添加php文档块注释,每个都有标题和简短、简洁的描述说明其作用 在所有方法中谨慎使用内联注释 包括在Kevinlearynet命名空间内工作所需的use语句”

容易的代价

毫无疑问,AI代码生成使编程更快,并且对更多人可访问。这在许多方面是一件非常好的事情。如果更多人理解编程和代码如何工作,将更容易合作和说同一种语言。至少在理论上如此。

但我怀疑现实可能不同。ChatGPT和其他LLM使人们能够编写做事的代码,而无需真正理解其工作原理。

在许多方面这是危险的,它让我想起多年来继承的许多架构糟糕、像弗兰肯斯坦一样的WordPress"应用程序”。我见过无数站点以"让它工作"的方式拼凑在一起,从长远来看会崩溃。

这是一个经典案例:前期省钱,长期付出沉重代价。这个教训可能适用于AI代码生成和许多其他领域。我当然可能大错特错,只有时间能证明。

结论

虽然以这种方式记录提示更困难且耗时,但回报是值得的。编写质量提示的能力,产生精确、有效的生成代码,将成为未来几年开发者必须具备的关键技能。

除此之外,流利掌握你正在使用的语言并花时间彻底了解你的代码库仍然非常重要。

AI代码生成将继续彻底改变网站和应用程序的构建方式,我怀疑代码库将因此迅速扩展。了解架构、构建和最终设计良好系统的最佳方式将是一段时间内持续需求的技能。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计