深入剖析 MetaGPT 中的提示詞工程:WriteCode 動作的提示詞設計

今天,我想和大家分享關于 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