圖形工程:如何透過單一提示詞同時運行 1,000 個 AI Agent

@0xWast3
英語1 天前 · 2026年7月22日
146K
151
19
13
376

TL;DR

深入探討 AI Agent 的圖形工程技術,示範如何識別真實依賴關係並利用平行執行來擴展工作流程。

2026 年每個正在打造多智能體系統的人,仍然在畫直線。第一步,然後第二步,然後第三步——每一步都等著前一步。這就是為什麼它很慢,以及如何解決這個問題。

wast3 - inline image

沒人檢查的問題

你建立了一個多步驟的 Agent。它能運作,但也慢。

你以為瓶頸是模型。其實不是。

瓶頸是你畫的形狀。一條鏈——步驟 1 等步驟 2,步驟 2 等步驟 3——即使一半的步驟彼此毫無關聯,也強制順序執行。

「摘要這份文件,然後查天氣」是兩個獨立任務,卻穿著一件工作流程大衣。天氣任務不需要摘要。從來不需要。但如果你把它寫成一條鏈,它還是得等。

這種浪費的等待,乘以幾十個步驟,就是你大部分執行時間消失的地方。

第一章——迴圈 vs 圖形

一個迴圈是一個自我改進的單位:

text
1嘗試某件事 → 檢查結果 → 調整 → 再試一次

這就是原子。一個 Agent,一個指標,持續循環直到收斂。

迴圈有一個已知的失敗模式:它們只優化你測量的東西,其他一概不管。一個為了快速關閉工單而調校的支援機器人,確實會快速關閉工單——同時滿意度悄悄崩盤。迴圈看不到自己指標以外的東西。這就是古德哈特定律(Goodhart's Law)在你的 Agent 架構中顯現。

圖形透過設計解決了這個問題。與其用一個迴圈追逐一個數字,你建立一個由迴圈組成的網路,讓它們互相監視和校正。節點 A 的輸出餵給節點 B。節點 C 獨立執行,並檢查兩者。沒有單一指標驅動整個系統——結構本身來驅動。

wast3 - inline image

對於 Agent 系統而言,這意味著一個具體的轉變:不要再寫一個從頭到尾包辦一切的 Agent。先設計工作的形狀——什麼必須在什麼之前發生,什麼可以同時執行,什麼實際上需要等待。

第二章——節點、邊,以及分辨它們的測試

一個圖形只有兩個組成部分:

節點(Node)——一個工作單位。一個 Agent、一個任務、一個輸入、一個輸出。

邊(Edge)——一個真正的依賴關係。節點 B 的輸入需要節點 A 的輸出。

幾乎每個人都會犯的錯誤:預設把「然後」當作一條邊。

text
1「閱讀這段程式碼,然後撰寫變更日誌」
2「抓取定價頁面,然後摘要競爭對手功能」

針對工作流程中的每一個「然後」,問一個問題:

下一步驟真的會讀取上一步驟的輸出嗎?

如果是 → 真正的邊。保留順序執行。 如果否 → 沒有邊。等待是浪費的。讓它們平行執行。

如果兩個任務之間沒有資料跨越邊界,它們就是獨立的——而你順序執行的每一對獨立任務,都是你白白丟掉的執行時間。

以下是套用在程式碼中的測試:

python
1from dataclasses import dataclass
2
3@dataclass
4class TaskNode:
5 id: str
6 prompt: str
7 depends_on: list[str] # 此節點實際需要的節點 ID
8
9def has_real_edge(node_a: TaskNode, node_b: TaskNode) -> bool:
10 """
11 核心圖形工程測試:
12 node_b 的提示是否真的需要 node_a 的輸出?
13 """
14 return node_a.id in node_b.depends_on
15
16# 範例:大多數「鏈」會收縮成 2-3 個真正的依賴群組
17nodes = [
18 TaskNode("audit_routes", "列出所有 API 路由檔案", []),
19 TaskNode("check_auth", "檢查認證中介層覆蓋率", []),
20 TaskNode("fetch_weather", "取得今天的天氣", []),
21 TaskNode("summarize", "摘要路由 + 認證發現",
22 depends_on=["audit_routes", "check_auth"]),
23]
24
25# audit_routes、check_auth、fetch_weather 之間沒有邊
26# 它們平行執行。只有「summarize」有真正的邊——它需要等待。

你目前「先做 A,再做 B,然後做 C」的 Agent,技術上已經是一個圖形了。只是它是最糟的那種——一條單鏈,如果 C 卡住,下游就永遠無法執行。

第三章——建立你的第一個圖形

wast3 - inline image

需求:

  • Claude Code(支援 Dynamic Workflows 的最新版本)
  • Max、Team 或 Enterprise 方案——工作流程預設開啟。Pro 方案需手動啟用。

打開一個真實的儲存庫。不是玩具範例——效益只在真實規模中顯現。

啟動你第一個圖形的提示:

text
1建立一個工作流程,用來稽核這個程式碼庫中的每個路由檔案。
2
3針對每個路由檔案,獨立檢查:
4- 是否有認證中介層
5- 所有參數是否有輸入驗證
6- 是否已設定速率限制
7- 錯誤處理不會洩漏堆疊追蹤
8
9在所有路由檔案中平行執行這些檢查——
10它們彼此之間沒有依賴關係。
11
12所有檔案檢查完畢後,產生一份整合報告,依嚴重程度分組:重大、警告、資訊。
13
14彙整步驟應等待所有檢查完成。
15在此之前的所有步驟則不應等待。

注意提示本身嵌入的結構:明確指出平行工作,明確命名唯一真正的依賴關係(彙整等待所有檢查完成)。你不是在期望 Agent 推斷出圖形——你是在描述它。

底層發生的事情——編排的簡化版本:

python
1import asyncio
2from anthropic import Anthropic
3
4client = Anthropic()
5
6async def audit_route_file(filepath: str) -> dict:
7 """一個節點。獨立於其他所有路由檔案執行。"""
8 response = await client.messages.create(
9 model="claude-sonnet-5",
10 max_tokens=1000,
11 messages=[{
12 "role": "user",
13 "content": f"""稽核此路由檔案,檢查:
14 - 認證中介層、輸入驗證、
15 速率限制、錯誤處理
16
17 檔案:{filepath}
18
19 回傳 JSON:{{"file": "", "issues": [], "severity": ""}}"""
20 }]
21 )
22 return {"file": filepath, "result": response.content[0].text}
23
24async def consolidate(results: list[dict]) -> str:
25 """唯一真正的邊——等待每個稽核節點完成。"""
26 response = await client.messages.create(
27 model="claude-opus-4-8",
28 max_tokens=2000,
29 messages=[{
30 "role": "user",
31 "content": f"""將這 {len(results)} 個路由稽核結果
32 整合成一份依嚴重程度分組的報告:
33
34 {results}"""
35 }]
36 )
37 return response.content[0].text
38
39async def run_graph(route_files: list[str]):
40 # 扇出——所有獨立節點同時執行
41 audit_tasks = [audit_route_file(f) for f in route_files]
42 results = await asyncio.gather(*audit_tasks)
43
44 # 扇入——唯一具有真正依賴的節點
45 report = await consolidate(results)
46 return report
47
48# 40 個路由檔案,一個提示,一次平行掃描
49results = asyncio.run(run_graph([
50 f"routes/{f}.py" for f in ["auth", "users", "billing", "orders"]
51 # ... 還有 36 個

40 次順序 API 呼叫,每次約 8 秒,總共超過 5 分鐘。同樣 40 次呼叫扇出平行執行:不到 15 秒,時間由最慢的單一檔案決定,而非所有檔案的總和。

第四章——圖形實際上在哪裡失敗

圖形工程在三個可預測的地方會失敗。在遇到之前先了解它們。

上下文崩潰。 扇出 1,000 個節點,然後試圖將全部 1,000 個輸出餵進一個彙整步驟,在合成開始之前就會超出任何上下文視窗。 修復: 分層扇入。將節點分組為 20-50 個一批,摘要每一批,然後彙整這些摘要——而不是原始輸出。

python
1async def layered_consolidate(results: list[dict], batch_size: int = 30):
2 """分層扇入——永遠不要在規模下合成原始輸出。"""
3 batches = [results[i:i+batch_size]
4 for i in range(0, len(results), batch_size)]
5
6 batch_summaries = await asyncio.gather(*[
7 summarize_batch(batch) for batch in batches
8 ])
9
10 # 最終彙整針對摘要進行,而非 1,000 個原始結果
11 return await consolidate(batch_summaries)

虛假獨立性。 你會假設兩個節點是獨立的,因為它們的提示沒有互相參考——但它們都寫入同一個檔案,或命中同一個有速率限制的 API。那是隱藏的邊。修復: 審查共享資源,而不只是共享資料。兩個有寫入衝突的節點,即使沒有資料依賴,也需要一條邊。

靜默節點失敗。 在鏈中,一個失敗會停止一切——惱人但明顯。在圖形中,200 個節點中有一個失敗,可能會消失在看似完整的報告中。修復: 每個扇入步驟在合成前,將節點數量與預期數量進行比對,並明確標記缺口,而不是靜默地使用部分資料。

python
1async def safe_consolidate(results: list[dict], expected_count: int):
2 if len(results) < expected_count:
3 missing = expected_count - len(results)
4 print(f"警告:{missing} 個節點靜默失敗。"
5 f"報告將不完整。")
6 return await consolidate(results)

第五章——擴展到真正的規模

wast3 - inline image

一旦模式在 40 個節點上運作,擴展到幾百個就只是設定變更,而非重新設計——前提是你從第二章開始就正確建立了圖形。

完整的生產形狀:

text
1 編排器
2 |
3 +--------+-------+-------+--------+
4 v v v v v
5 節點 1 節點 2 節點 3 ... 節點 N
6 (平行,它們之間沒有任何邊)
7 | | | |
8 +--------+-------+-------+-------+
9 v
10 批次摘要 <- 分層扇入
11 (每組 30 個)
12 v
13 最終報告 <- 唯一真正的邊

編排器唯一的任務:將任務分解為節點,識別真正的邊,並分派。它本身不做任何工作——它負責畫圖形。

python
1async def orchestrate(task: str, resources: list[str]):
2 """
3 編排器節點——負責分解,不負責執行。
4 """
5 plan = await client.messages.create(
6 model="claude-opus-4-8",
7 max_tokens=2000,
8 messages=[{
9 "role": "user",
10 "content": f"""任務:{task}
11 可用資源:{resources}
12
13 分解成一個圖形:
14 - 列出每個獨立節點(無共享邊)
15 - 列出節點之間的任何真正依賴
16 - 如果節點數超過 50,將節點分組為扇入批次
17
18 回傳 JSON,包含:nodes, edges, batch_groups"""
19 }]
20 )
21
22 graph = parse_plan(plan.content[0].text)
23
24 # 平行執行獨立節點
25 node_results = await asyncio.gather(*[
26 execute_node(n) for n in graph["nodes"] if not n["depends_on"]
27 ])
28
29 # 然後執行依賴節點,僅尊重真正的邊
30 final = await execute_dependent_chain(graph["edges"], node_results)
31
32 return final

這就是圖形工程所代表的實際轉變:你不再是一步步撰寫所有步驟的人,而是成為設計依賴結構的人。Agent 填滿節點。你掌管邊。

當你以圖形而非線條思考時,會發生什麼改變

一個有 40 個步驟的線性 Agent,有 40 個順序失敗點,且延遲是其最慢單一步驟的 40 倍。

一個包含相同 40 個工作單位的圖形,其平行失敗點數量等同於你真正的依賴關係數量——大多數工作流程中通常是 3 到 5 個——且延遲由你最慢的層決定,而非步驟總數。

這不是邊際加速。在執行完全相同底層工作的情況下,這是工作流程花 5 分鐘與花 15 秒的差別。

模型從來不是瓶頸。你畫的那條線才是。

這是截至 2026 年 7 月的多智能體編排模式的技術解析。程式碼範例僅供說明——在部署到生產環境之前,請根據你的環境調整錯誤處理、速率限制和重試邏輯。

感謝閱讀。

二次創作

使用 YouMind 創作爆款文章

收集素材、拆解爆點、生成視覺資產、撰寫內容,並在一個 AI 工作空間裡完成分發。

了解 YouMind
寫給創作者

把你的 Markdown 變成乾淨的 𝕏 文章

圖片上傳、表格、程式碼區塊,往 𝕏 上手動重排太痛苦。YouMind 把整篇 Markdown 一鍵轉成乾淨、可直接發佈的 𝕏 文章草稿。

試試 Markdown 轉 𝕏

更多可拆解樣本

近期爆款文章

探索更多爆款文章