今天,我想和大家分享关于 AI 提示词工程的文章。提示词(Prompt)是大型语言模型(LLM)生成高质量输出的关键,而在像 MetaGPT 这样的 AI 驱动软件开发框架中,提示词的设计直接决定了代码生成的可靠性和效率。本文基于 MetaGPT 框架中的 write_code.py 文件,详细剖析其提示词模板、设计分析、任务流程以及值得借鉴的经验。如果你对 AI 代理、代码生成或提示词优化感兴趣,这篇文章将为你提供宝贵的洞见。

MetaGPT 框架简介

MetaGPT 是一个创新的 AI 框架,旨在通过多代理协作模拟软件开发过程。其中,WriteCode 是核心动作之一,它负责为单个文件生成代码。这个动作不是简单地“写代码”,而是通过精心设计的提示词来指导 LLM 产生符合谷歌风格的、模块化且易维护的代码。让我们先来看看这个提示词模板(PROMPT_TEMPLATE)的内容。

提示词模板详解

以下是 write_code.py 中定义的 PROMPT_TEMPLATE。它是一套给 LLM 的详细指令,结构清晰、约束严格:

text

注意

角色:你是一名专业的工程师;主要目标是编写谷歌风格、优雅、模块化、易于阅读和维护的代码。

语言:请使用与用户需求相同的语言,但标题和代码仍应为英文。例如,如果用户说中文,你回答的具体文本也应该是中文。

注意:使用 '##' 来分割章节,而不是 '#'。请仔细参考“格式示例”来确定输出格式。

# 上下文

## 设计

{design}

## 任务

{task}

## 已有代码

{code}

## 调试日志

```text

{logs}

{summary_log}

Bug反馈日志

{feedback}

格式示例

代码: {demo_filename}.py

Python

## {demo_filename}.py

...

代码: {demo_filename}.js

JavaScript

// {demo_filename}.js

...

指令:根据上下文,遵循“格式示例”编写代码。

代码:{filename}。请根据以下注意事项和上下文,使用三引号编写代码。

1. 仅限单个文件:尽你所能,只实现这一个文件。

2. 完整的代码:你的代码将成为整个项目的一部分,因此请实现完整、可靠、可复用的代码片段。

3. 设置默认值:如果存在任何设置项,务必设置一个默认值,始终使用强类型和显式变量。避免循环导入。

4. 遵循设计:你必须遵循“数据结构和接口”部分的设计。不要更改任何设计。不要使用设计中不存在的公共成员函数。

5. 仔细检查:确保你没有遗漏此文件中任何必要的类/函数。

6. 先导入再使用:在使用外部变量/模块之前,请确保你已经导入了它。

7. 写出所有细节:写出每一个代码细节,不要留下任何 TODO(待办事项)。

这个模板以角色扮演开头,注入结构化的上下文(如设计、任务、已有代码和日志),并提供格式示例和严格指令。它的设计确保 LLM 输出的是可解析的、高质量代码。

提示词设计分析

这个提示词是针对代码生成这类复杂任务进行高级提示词工程的绝佳范例。让我们逐一拆解其亮点:

  1. 明确的角色扮演 (Clear Role-Playing)
    • 好处:提示词以“角色:你是一名专业的工程师”开场,这立即为模型设定了场景。它指示 LLM 采纳专家的角色,从而影响其输出的语气、风格以及对最佳实践(如编写“谷歌风格、优雅、模块化”代码)的遵循程度。
  2. 结构化的上下文注入 (Structured Context Injection)
    • 好处:提示词定义了清晰的章节(## 设计、## 任务、## 已有代码、## 调试日志),用于动态插入特定信息。这比将所有信息堆在一个大块里要有效得多。LLM 可以轻松地区分高层设计、具体任务、现有代码和错误日志,从而产出更具上下文感知能力、更准确的代码。
  3. 格式示例驱动 (Format Example Driven)
    • 好处:“# 格式示例”部分提供了一个具体、可视化的期望输出模板。这是一种“少样本”或“单样本”学习的形式,极大地约束了 LLM 的输出格式。它强制模型生成一个干净、可预测且机器可解析的 Markdown 代码块,这对后续的 CodeParser 可靠工作至关重要。
  4. 极其具体的指令和约束 (Hyper-Specific Instructions and Constraints)
    • 好处:最后的“# 指令”部分列出了七条非常具体的规则。这些规则解决了 LLM 在代码生成任务中常见的失败模式:
      • 仅限单个文件”:防止模型一次性尝试创建多个文件。
      • 完整的代码”、“不要留下任何 TODO”:阻止模型生成占位符或不完整的代码。
      • 遵循设计”、“不要更改任何设计”:强制模型严格遵守提供的软件设计,防止其偏离轨道或“幻觉出”新的功能。
    • 这些精确的约束极大地提高了生成代码的可靠性和实用性。

通过这些元素,这个提示词不仅仅是“告诉” LLM 做什么,还“指导”它如何做,确保输出的一致性和高质量。

整体代码任务与借鉴之处

任务讲解 (Task Explanation)

WriteCode Python 类是 MetaGPT 框架中的一个AI 动作(AI Action)。它唯一的工作就是为单个文件编写代码

为了完成这个任务,它的 run 方法扮演了一个上下文聚合器的角色:

  1. 加载上下文:它从项目仓库(ProjectRepo)中读取大量文档,包括高层需求、当前文件的特定软件设计(design_doc)、任务描述(task_doc)、其他文件中的现有代码(Legacy Code),以及先前失败运行的日志(Debug logs、Bug Feedback logs)。
  2. 收集相关代码:它使用 get_codes 静态方法来获取项目中其他相关源文件的内容。这至关重要,能让 LLM 知道它可能需要与之交互的其他类和函数。
  3. 构建提示词:它将所有聚合来的上下文,一丝不苟地填充到 PROMPT_TEMPLATE 中。
  4. 执行并解析:它用构建好的完整提示词调用 LLM(并使用重试机制以保证健壮性)。然后,它使用一个 CodeParser 从 LLM 的响应中仅提取代码部分,丢弃任何对话性文本。
  5. 返回结构化输出:最后,它将干净的代码放入一个 CodingContext 对象中,准备好被保存到文件或被代理工作流中的下一个动作(如 RunCode 或 DebugError 动作)使用。

这个流程展示了如何将提示词与实际代码执行无缝结合,形成一个高效的 AI 驱动开发管道。

值得借鉴之处 (What to Learn From It)

这段代码是构建健壮、面向任务的 AI 代理的绝佳蓝图。以下是几点关键经验:

  1. 上下文为王 (Context is King):最重要的经验是系统化地聚合丰富的上下文。不要只是简单地要求 LLM “写一个用户登录文件”,而是要为它提供 API 设计、数据结构、相关代码和错误历史。这会极大地提升产出质量。
  2. 自动化弹性 (Automated Resiliency):在 write_code 方法上使用 @retry 装饰器是一个简单但强大的技术。对 LLM API 的网络调用可能不稳定;通过指数退避策略进行自动重试,能让整个系统变得更加稳定。
  3. 模块化的动作 (Modularity with Actions):将逻辑封装到不同的 Action 类中(WriteCode 就是其中之一)是优秀的软件设计。它使系统更易于理解、维护和扩展。每个动作都有单一、清晰的职责。
  4. 解析,而非假设 (Parse, Don't Assume):永远不要完全相信 LLM 的输出格式。务必有一个解析器(如 CodeParser)来净化输出,并精确提取你需要的部分。这将“生成”步骤与“处理”步骤解耦。
  5. 配置驱动逻辑 (Configuration-Driven Logic):代码通过检查 self.config.inc 来判断是处于初始创建模式还是“增量”(修改)模式。这使得同一个 Action 可以在软件开发生命周期的不同阶段被复用,使其具有高度的灵活性。

作者自言自语:

分享了那么多提示词的技巧给大家,在分享的同时自己也在思考提示词的意义是什么。我想在AI快速发展的今天,大模型会成为我们必不可少的助手,但是如何和这个助手产生更深的连接🔗,如何让助手最大限度的发挥自己的作用,让我们能从反复的工作抽离出来,去探究事情的本质,去感受生活的奥秘,我觉得是当前我们学习提示词,学习如何和大模型说话的意义。

结语

在 AI 时代,提示词工程不再是可选项,而是构建可靠系统的核心。通过 MetaGPT 的 WriteCode 示例,我们看到一个精心设计的提示词如何驱动复杂的代码生成任务。如果你正在开发自己的 AI 代理或优化 LLM 应用,不妨借鉴这些技巧:角色扮演、结构化上下文、格式示例和严格约束。欢迎在评论区分享你的经验,或者告诉我你对下一个 MetaGPT 组件的分析感兴趣!

如果这篇文章对你有帮助,请点赞和分享。谢谢阅读! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90557.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90557.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/90557.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于 ESXi 中 “ExcelnstalledOnly 已禁用“ 的解决方案

第一步:使用ssh登录esxi esxcli system settings advanced list -o /User/execInstalledOnly可能会得到以下内容 esxcli system settings advanced list -o /User/execInstalledOnlyPath: /User/ExecInstalledOnlyType: integerInt Value: 0Default Int Value: 1Min…

HTML5 Canvas 绘制圆弧效果

HTML5 Canvas 绘制圆弧效果 以下是一个使用HTML5 Canvas绘制圆弧的完整示例&#xff0c;你可以直接在浏览器中运行看到效果&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"view…

智能Agent场景实战指南 Day 18:Agent决策树与规划能力

【智能Agent场景实战指南 Day 18】Agent决策树与规划能力 开篇 欢迎来到"智能Agent场景实战指南"系列的第18天&#xff01;今天我们将深入探讨智能Agent的核心能力之一&#xff1a;决策树与规划能力。在现代业务场景中&#xff0c;Agent需要具备类似人类的决策能力…

AI 编程工具 Trae 重要的升级。。。

大家好&#xff0c;我是樱木。 今天打开 Trae &#xff0c;已经看到它进行图标升级&#xff0c;之前的图标&#xff0c;国际和国内版本长得非常像&#xff0c;现在做了很明显的区分&#xff0c;这点给 Trae 团队点个赞。 自从 Claude 使出了压力以来&#xff0c;Cursor 锁区&…

排序算法,咕咕咕

1.选择排序void selectsort(vector<int>& v) { for(int i0;i<v.size()-1;i) {int minii;for(int ji1;j<v.size();j){if(v[i]>v[j]){minij;}}if(mini!i)swap(v[i],v[mini]); } }2.堆排序void adjustdown(vector<int>& v,int root,int size) { int …

数据库查询系统——pyqt+python实现Excel内查课

一、引言 数据库查询系统处处存在&#xff0c;在教育信息化背景下&#xff0c;数据库查询技术更已深度融入教务管理场景。本系统采用轻量化架构&#xff0c;结合Excel课表&#xff0c;通过PythonPyQt5实现跨平台桌面应用&#xff0c;以实现简单查课效果。 二、GUI界面设计 使用…

base64魔改算法 | jsvmp日志分析并还原

前言 上一篇我们讲了标准 base64 算法还原&#xff0c;为了进一步学习 base64 算法特点&#xff0c;本文将结合 jsvmp 日志&#xff0c;实战还原出 base64 魔改算法。 为了方便大家学习&#xff0c;我将入参和上篇文章一样&#xff0c;入参为 Hello, World!。 插桩 在js代码中&…

vue3笔记(2)自用

目录 一、作用域插槽 二、pinia的使用 一、Pinia 基本概念与用法 1. 安装与初始化 2. 创建 Store 3. 在组件中使用 Store 4. 高级用法 5、storeToRefs 二、Pinia 与 Vuex 的主要区别 三、为什么选择 Pinia&#xff1f; 三、定义全局指令 1.封装通用 DOM 操作&#…

大模型面试回答,介绍项目

1. 模型准备与转换&#xff08;PC端/服务器&#xff09;你先在PC上下载或训练好大语言模型&#xff08;如HuggingFace格式&#xff09;。用RKLLM-Toolkit把模型转换成瑞芯微NPU能用的专用格式&#xff08;.rkllm&#xff09;&#xff0c;并可选择量化优化。把转换好的模型文件拷…

Oracle 19.20未知BUG导致oraagent进程内存泄漏

故障现象查询操作系统进程的使用排序&#xff0c;这里看到oraagent的物理内存达到16G&#xff0c;远远超过正常环境&#xff08;正常环境在19.20大概就是100M多一点&#xff09;[rootorastd tmp]# ./hmem|more PID NAME VIRT(kB) SHARED(kB) R…

尝试几道算法题,提升python编程思维

一、跳跃游戏题目描述&#xff1a; 给定一个非负整数数组 nums&#xff0c;你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例&#xff1a;输入&#xff1a;nums [2,3,1,1,4] → 输出&#xff1a;True输入…

【菜狗处理脏数据】对很多个不同时间序列数据的文件聚类—20250722

目录 具体做法 可视化方法1&#xff1a;PCA降维 可视化方法2、TSNE降维可视化&#xff08;非线性降维&#xff0c;更适合聚类&#xff09; 可视化方法3、轮廓系数评判好坏 每个文件有很多行列的信息&#xff0c;每列是一个驾驶相关的数据&#xff0c;需要对这些文件进行聚类…

Qwen-MT:翻得快,译得巧

我们再向大家介绍一位新朋友&#xff1a;机器翻译模型Qwen-MT。开发者朋友们可通过Qwen API&#xff08;qwen-mt-turbo&#xff09;&#xff0c;来直接体验它又快又准的翻译技能。 本次更新基于强大的 Qwen3 模型&#xff0c;进一步使用超大规模多语言和翻译数据对模型进行训练…

在 OceanBase 中,使用 TO_CHAR 函数 直接转换日期格式,简洁高效的解决方案

SQL语句SELECT TO_CHAR(TO_DATE(your_column, DD-MON-YY), YYYY-MM-DD) AS formatted_date FROM your_table;关键说明&#xff1a;核心函数&#xff1a;TO_DATE(30-三月-15, DD-MON-YY) → 将字符串转为日期类型TO_CHAR(..., YYYY-MM-DD) → 格式化为 2015-03-30处理中文月份&a…

pnpm运行electronic项目报错,npm运行正常。electronic项目打包为exe报错

pnpm运行electronic项目报错 使用 pnpm 运行 electronic 项目报错&#xff0c;npm 运行正常&#xff0c;报错内容如下 error during start dev server and electron app: Error: Electron uninstallat getElectronPath (file:///E:/project/xxx-vue/node_modules/.pnpm/elect…

8️⃣ 高级特性—— 列表生成式

文章目录&#x1f9e0; 总结1. 基本语法2. 加筛选条件&#x1f501; 双层循环&#xff08;全排列&#xff09;&#x1f4c2; 遍历目录&#x1f511; 遍历字典&#x1f521; 转小写3. if 和 if...else 的区别4. 练习题&#x1f9e0; 总结 特性用法示例基础语法[x for x in iter…

DocC的简单使用

DocC的简单使用 在写3GShare中&#xff0c;由于刚开始使用MVC模式来写东西&#xff0c;对很多东西都不是很熟&#xff0c;经常写着写着就忘了自己在写什么&#xff0c;所以学了一下DocC来加快开发进度 什么是DocC 简单来说&#xff0c;DocC就是更高级的注释&#xff0c;虽然…

深入理解C语言快速排序与自省排序(Introsort)

排序算法是计算机科学中最基础也是最重要的知识之一。快速排序&#xff08;Quicksort&#xff09;因其平均时间复杂度为 O(n log n) 而广受欢迎&#xff0c;但在最坏情况下会退化到 O(n)。为了克服这一缺点&#xff0c;自省排序&#xff08;Introsort&#xff09; 应运而生&…

C#编程基础:运算符与结构详解

目录 一.关系运算符 常见关系运算符 二.逻辑运算符 常见逻辑运算符 1. 逻辑与&#xff08;&& 或 and&#xff09; 2. 逻辑或&#xff08;|| 或 or&#xff09; 3. 逻辑非&#xff08;! 或 not&#xff09; 运算符优先级 三.if语句 1.c#程序的三大结构 1.顺序…

嵌入式学习-土堆目标检测(3)-day27

再学一个labelme在labelstudio环境中再pip install labelme安装好后直接输入 labelme之后点击保存&#xff0c;选择保存文件地址还有一个就是将labelme的格式转化为yolo格式还是在labelstudio这个环境里面安装pip install labelme2yolo