~/blog/google-antigravity-multi-agent-wordpress-development-workflow-guide.md
AI 自動化與智慧應用 · 2025 / 12 / 17

Google Antigravity 不是科幻片!『組建 AI 開發團隊』,用多代理人工作流重塑 WordPress 開發

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
Google Antigravity 不是科幻片!『組建 AI 開發團隊』,用多代理人工作流重塑 WordPress 開發
目錄 table-of-contents.md

這篇文章要回答一個問題:如何把 Google「Project Antigravity」洩漏文件所揭示的「多模型並行」概念,落地成一套你今天就能用的多代理人(Multi-Agent)開發工作流

結論先講:你不需要 Google 內部的系統,也能用現成的 AI Agent 框架(如 LangGraph、Autogen)把開發拆成「PM、開發者、QA、文件撰寫」四個專職代理人,由你扮演技術總監負責設定目標與審核產出。本文用一個 WordPress 短代碼(Shortcode)需求,從規格、實作、測試到文件,完整走一遍這套流程,並誠實談它目前的限制。

什麼是 Google Antigravity?跟多代理人有什麼關係?

先把概念講清楚。所謂「Google Antigravity」,並不是一個你可以下載安裝的軟體。根據洩漏的資訊,它是 Google 內部一個 AI 系統構想,核心精神在於「多模型並行(Multi-model Parallelism)」。

白話講就是:不要再把 AI 當成一把萬能瑞士刀,而要把它看成一個工具箱,裡面有各式各樣專精的工具。

這個概念延伸到開發流程,就誕生了「多代理人系統(Multi-Agent System)」。你不再是對著一個聊天視窗下一個籠統指令、然後期待它給你完美答案;取而代之的是,你建立一個由多個「AI 代理人」組成的團隊,每個代理人都有自己的角色與專長。

一個多代理人團隊裡有哪些角色?

  • 專案經理 Agent:負責解析你的初步需求,拆解成具體的技術規格與執行步驟。
  • 資深開發者 Agent:專注於根據規格撰寫高品質、有效率的核心程式碼。
  • QA 測試工程師 Agent:為程式碼產生單元測試(Unit Test),確保穩定性與正確性。
  • 技術文件撰寫員 Agent:產生清晰的註解與 README 文件,讓未來的自己或同事能快速上手。

你,身為人類開發者,扮演的是「技術總監」或「指揮官」:設定目標、分配任務、審核每個 Agent 的產出,並在關鍵時刻做出決策。

它跟單一聊天視窗有什麼根本差異?

差別在於「分工」與「交接」。單一視窗裡,一個模型要同時兼顧需求理解、寫程式、寫測試、寫文件,注意力被稀釋,容易顧此失彼。多代理人則把任務切成數個邊界清楚的子任務,每個 Agent 只專注一件事,上一棒的產出(規格、程式碼)成為下一棒的輸入。這讓每個步驟的輸入更聚焦、輸出更可審核,也讓你能在任何一棒「攔截」並修正,而不是等到最後才發現整體走偏。

實戰:組建一支 WordPress 短代碼 AI 開發團隊

理論講完,來點實際的。假設客戶有一個簡單需求:「我希望在文章中插入一個短代碼(Shortcode),可以自動顯示目前的年份。」

傳統作法是我們自己打開編輯器從頭刻到尾。今天我們改用多代理人工作流。雖然我們沒有 Google 的 Antigravity 系統,但可以用現在常見的 AI 框架(如 LangChain 的 LangGraph 或 Microsoft 的 Autogen)來模擬這個流程。為了方便理解,以下用文字描述與範例來呈現整個工作流。

第一步:對「專案經理 Agent」下達指令

身為指揮官,第一個任務是下達一個清晰的指令給 PM Agent。

你的指令(Prompt):

請為一個 WordPress 專案規劃一個新的功能。需求如下:
1. 功能:建立一個名為 [current_year] 的短代碼。
2. 作用:當文章或頁面中出現這個短代碼時,它會被替換成目前的西元年份(例如:2024)。
3. 產出:請提供一個清晰的技術規格,包含建議的檔案名稱、函數名稱、以及核心的 WordPress Hook。

PM Agent 的回覆(模擬產出):

好的,收到需求。以下是技術規格:

  • 專案類型:WordPress 輕量級外掛。
  • 檔案名稱:roamer-current-year-shortcode.php
  • 核心函數:
    • 函數名稱:roamer_tech_current_year_shortcode_handler
    • 功能:回傳當前的四位數年份。
  • WordPress Hook:使用 add_shortcode() 函數來註冊 current_year 這個短代碼,並將其綁定到核心函數上。
  • 執行流程:
    1. 建立外掛主檔案。
    2. 在外掛檔案中定義處理函數。
    3. 使用 add_action('init', ...)init 階段呼叫 add_shortcode() 進行註冊。

一個清晰的開發藍圖就出來了,我們不必再自己傷腦筋想這些命名與結構。

為什麼把註冊掛在 init 而不是直接寫在檔案頂層?

短代碼的註冊本身在外掛載入時就能完成,但把 add_shortcode() 包進掛載到 init 的函數裡,是一個比較穩健的習慣:此時 WordPress 核心已大致初始化完成,行為更可預期,也方便日後在同一個註冊函數內擴充更多短代碼,集中管理。這正是一份好規格該幫你想到的細節。

第二步:把規格交給「資深開發者 Agent」

現在拿著這份規格,交給 Coder Agent。

你的指令(Prompt):

根據以下技術規格,請撰寫完整的 WordPress 外掛 PHP 程式碼。

[貼上 PM Agent 產出的技術規格]

Coder Agent 的回覆(模擬產出):

這段程式碼可以直接存成 roamer-current-year-shortcode.php,放到 wp-content/plugins/ 目錄下啟用即可。

<?php
/**
 * Plugin Name:       Roamer Tech Current Year Shortcode
 * Plugin URI:        https://roamer-tech.com/
 * Description:       Adds a [current_year] shortcode to display the current year.
 * Version:           1.0.0
 * Author:            Eric from Roamer Tech
 * Author URI:        https://roamer-tech.com/
 * License:           GPL v2 or later
 * License URI:       https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:       roamer-tech-cy
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly.
}

/**
 * Handles the [current_year] shortcode.
 *
 * Returns the current 4-digit year.
 *
 * @return string The current year.
 */
function roamer_tech_current_year_shortcode_handler() {
    // 確保我們回傳的是字串,這是短代碼的最佳實踐
    return date( 'Y' );
}

/**
 * Registers the shortcode.
 */
function roamer_tech_register_shortcodes() {
    add_shortcode( 'current_year', 'roamer_tech_current_year_shortcode_handler' );
}

// 在 WordPress 初始化時註冊我們的短代碼
add_action( 'init', 'roamer_tech_register_shortcodes' );

?>

這段程式碼藏了哪些「資深」細節?

身為審核者,你應該看得懂它好在哪、又該注意什麼:

  • if ( ! defined( 'ABSPATH' ) ) exit;防止外掛檔案被直接以網址存取,是 WordPress 外掛的基本安全慣例。
  • 短代碼回傳值(return)而非直接輸出(echo):短代碼處理函數應該「回傳」字串,讓 WordPress 把它插回內容的正確位置;若直接 echo,輸出會跑到頁面最上方,這是新手最常見的坑。註解裡那句「確保回傳字串」正是在強調這點。

這也凸顯了一個重點:Agent 產出的程式碼仍需要你用專業眼光把關。它幫你省下打字與查文件的時間,但「這樣寫對不對」的最終責任在你身上。

第三步:呼叫「QA 測試工程師 Agent」進行驗證

程式碼寫好了,但身為資深工程師,我們都知道「在我電腦上可以跑」是多麼不靠譜的一句話。這時 QA Agent 就要上場,負責確保程式碼在各種情況下都能正常運作。

你的指令(Prompt):

針對以下 PHP 函數 roamer_tech_current_year_shortcode_handler,
請使用 PHPUnit 框架撰寫一個基本的單元測試,驗證它是否正確回傳當前年份。

[貼上 Coder Agent 產出的 PHP 函數程式碼]

QA Agent 的回覆(模擬產出):

好的,這是一個基本的 PHPUnit 測試案例:

<?php
use PHPUnit\Framework\TestCase;

// 假設外掛主檔案已經被引入
require_once 'path/to/roamer-current-year-shortcode.php';

class CurrentYearShortcodeTest extends TestCase {

    public function test_shortcode_handler_returns_correct_year() {
        // 獲取預期的年份
        $expected_year = date('Y');

        // 執行函數
        $actual_year = roamer_tech_current_year_shortcode_handler();

        // 斷言函數的回傳值是否與預期相符
        $this->assertEquals(
            $expected_year,
            $actual_year,
            'The shortcode handler should return the current 4-digit year.'
        );
    }
}
?>

有了這個測試案例,就可以把它納入 CI/CD 流程,確保未來任何修改都不會意外搞壞這個功能。

提醒:這個範例測試直接比對 date('Y'),因為被測函數本身也用同一個函數取年份,本質上是驗證「行為一致、不拋錯」。要做更嚴謹的測試,通常會把時間來源抽離(注入一個固定時間),讓斷言不依賴執行當下的系統時間——這也是你在審核 QA Agent 產出時,可以追問它「能不能讓測試更穩定」的好問題。

第四步:讓「技術文件撰寫員 Agent」完成最後一哩路

程式碼與測試都完成了,最後一步是撰寫文件。這通常是工程師最不愛的環節,但交給 AI Agent 就輕鬆許多。

你的指令(Prompt):

根據已完成的外掛程式碼,請撰寫一份簡潔的 README.md 文件,
說明這個外掛的功能、如何安裝及如何使用。

Documenter Agent 的回覆(模擬產出):

# Roamer Tech Current Year Shortcode

**Contributors:** roamer-tech
**Tags:** shortcode, year, date
**Requires at least:** 5.0
**Tested up to:** 6.5
**Stable tag:** 1.0.0
**License:** GPLv2 or later
**License URI:** https://www.gnu.org/licenses/gpl-2.0.html

A simple plugin that provides a shortcode `[current_year]` to display the current year on your WordPress site.

## Description

This plugin is perfect for footers, copyright notices, or anywhere you need to dynamically display the current year without manually updating it every January.

## Installation

1.  Upload the `roamer-current-year-shortcode` folder to the `/wp-content/plugins/` directory.
2.  Activate the plugin through the 'Plugins' menu in WordPress.

## Usage

Simply place the `[current_year]` shortcode in any post, page, or widget where you want the current year to appear. It will be automatically replaced with the 4-digit current year (e.g., 2024).

至此,一個規格完整、程式碼健壯、有測試覆蓋、文件清晰的 WordPress 小外掛,就在我們「指揮」之下完成了。整個過程,我們專注在最高層次的決策與審核,而不是陷在繁瑣細節裡。

這套工作流的真實挑戰是什麼?

看起來很美好,對吧?但身為務實的工程師,還是得囉嗦幾句。多代理人工作流目前並不完美,會面臨幾個現實挑戰:

  • 狀態與上下文管理:如何讓多個 Agent 共享同一個專案的上下文(Context)與狀態,是目前最大的技術難點。前一棒的決策、命名、檔案結構,必須被後續 Agent 精準接收,否則就會出現「QA 測的函數名稱跟 Coder 寫的對不上」這類錯位。
  • 溝通成本:Agent 之間的任務交接需要精密設計,否則會像一個效率低落的團隊一樣,不斷來回溝通、空轉。
  • 成本考量:每個 Agent 的運作都在消耗 API Token,對於複雜專案,這可能是一筆不小的開銷。
  • 可控性與幻覺:AI 仍然會有「幻覺」(Hallucination),產出不符預期的程式碼。最終的審核與把關,還是得靠人類開發者的專業經驗。

那我該怎麼開始,又該如何控制風險?

務實的起手式,是從一個邊界清楚、容易驗證的小需求開始(就像本文的短代碼),先把「四個角色、四個提示、四份產出」的節奏跑順,再逐步擴大到較複雜的功能。三個降低風險的原則:

  1. 每一棒都人工審核:把 Agent 當成資淺隊員的草稿,而不是最終答案。
  2. 把規格與測試當成護欄:清楚的規格約束開發者 Agent,自動化測試攔截行為退化,兩者一起壓低幻覺造成的損害。
  3. 從小範圍試成本:先在低風險任務上估算 Token 消耗與品質,再決定要不要放大規模。

儘管挑戰不少,我仍相信這代表了軟體開發的方向。我們的角色正在從「實作者」轉變為「架構師」與「系統設計者」:要學的不再只是新語言或新框架,更是如何設計、管理與優化這些 AI 工作流,讓 AI 團隊發揮最大潛力。與其擔心被 AI 取代,不如開始學習如何駕馭它——從今天起,試著為你的下一個專案,組建一支專屬於你的 AI 開發團隊。

延伸閱讀

// FAQ

常見問題

Google Antigravity 是什麼?
根據洩漏資訊,Google Antigravity 並不是一個可下載安裝的軟體,而是 Google 內部一個 AI 系統構想,核心精神是多模型並行(Multi-model Parallelism)——不把 AI 當成萬能瑞士刀,而是看成裝有各式專精工具的工具箱。這個概念延伸到開發流程,就形成了多代理人系統。
多代理人(Multi-Agent)開發工作流有哪些角色?
一個多代理人團隊通常包含四個專職角色:專案經理 Agent 負責解析需求並拆解成技術規格與步驟、資深開發者 Agent 專注撰寫核心程式碼、QA 測試工程師 Agent 為程式碼產生單元測試、技術文件撰寫員 Agent 產生註解與 README。人類開發者則扮演技術總監,負責設定目標、分配任務、審核每個 Agent 的產出並做關鍵決策。
多代理人工作流和單一聊天視窗有什麼根本差異?
差別在分工與交接。單一視窗裡一個模型要同時兼顧需求理解、寫程式、寫測試、寫文件,注意力被稀釋容易顧此失彼。多代理人把任務切成邊界清楚的子任務,每個 Agent 只專注一件事,上一棒的產出成為下一棒的輸入,使每步輸入更聚焦、輸出更可審核,也讓你能在任何一棒攔截並修正,而不是等到最後才發現走偏。
WordPress 短代碼處理函數為什麼要 return 而不是 echo?
短代碼處理函數應該回傳(return)字串,讓 WordPress 把它插回內容的正確位置;如果直接 echo 輸出,內容會跑到頁面最上方,這是新手最常見的坑。此外也建議把 add_shortcode() 包進掛載到 init 的函數裡註冊,因為此時核心已大致初始化完成,行為更可預期,也方便日後集中擴充更多短代碼。
用 AI Agent 產生的程式碼可以直接上線嗎?
不行,Agent 產出的程式碼仍需由人用專業眼光把關。它能省下打字與查文件的時間,但這樣寫對不對的最終責任在開發者身上。例如 WordPress 外掛應有 if ( ! defined( 'ABSPATH' ) ) exit; 防止被直接以網址存取,這類安全慣例與正確性都需審核者親自確認。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?