我寫了一個系統,每天上朝批奏折:把 Agent 做成「文武百官」是什麼體驗
當小人被關進天牢的那一刻,就是朕決定掏錢的那一刻。

先說結論:當你用「擬聖旨」的方式給 Agent(代理人)下指令,看著丞相帶著六部尚書在 2D 像素宮殿裡跑來跑去給你辦差——這玩意兒比你想像的更有成就感。
我叫它 Syntropy(太和),一個基於古代朝廷隱喻的可視化多智能代理操作系統。但不是那種換個皮就完事的「國潮包裝」,而是真的把 Agent 的執行過程「具象化」了:
tool_call_pending,而是坐在工位上的像素小人await human_approval(),而是把 Agent 關進天牢,等你御批你可能會問:為什麼要搞這麼複雜?直接寫程式不行嗎?
因為現有的 Multi-Agent 框架(LangChain、AutoGen、CrewAI……)有一個共同的問題:它們是黑盒。你能看見輸入和輸出,但中間的思考、決策、調度、執行,全在一團混沌的日誌裡。你調了半天 prompt,還是不知道 Agent 卡在哪一步。
所以我的思路很簡單:既然 Agent 的執行過程看不見,那就讓它「看得見」。

這篇文章會拆解這套系統的技術架構,但不會堆砌術語。咱們邊「上朝」邊聊:怎麼把狀態機映射成像素動畫、怎麼實現前後端即時同步、怎麼設計「御批」機制,以及——為什麼「當皇帝」這個隱喻,反而讓 Agent 系統更好用了。
在動手之前,我先總結了當前 Multi-Agent 系統的三個「弊政」:
Agent 的 Chain-of-Thought(思維鏈)是一串巢狀的 JSON,工具調用是一條條 log 記錄。你很難從這些資訊裡快速判斷:

現狀:你只能盯著終端滾屏的日誌,祈禱 Agent 別卡死。
Agent 自主調用工具是一件很危險的事。刪除檔案、轉帳、調用外部 API——這些操作一旦失控,後果不可逆。
現有的「人機協同」方案要麼是簡單的 input() 阻塞(體驗極差),要麼需要入侵式地修改整條執行鏈路(開發成本高)。
現狀:你要麼相信 Agent 不會亂來,要麼就得自己寫一套審核機制。
大多數 Agent 框架的記憶系統基於關鍵詞匹配或純向量檢索。關鍵詞匹配漏掉語意相關的信息,純向量檢索又容易在專有名詞上翻車。長對話場景下,Agent 往往會「忘記」幾輪之前說過的關鍵資訊。
現狀:你只能不斷「提示」Agent,把上下文塞給它,直到 Token 爆掉。
Syntropy 的核心思路只有一句話:
所見即所思(What you see is what they think)。
具體拆解為三個「治國方略」:
Agent 的內部狀態機(THINKING、ACTING、WAITING、ERROR)不只在日誌裡列印,而是即時映射為 2D 像素小人的行為動畫:
這套映射讓 Agent 的執行狀態變得一眼可見。你不再需要翻幾百行日誌,只需要看一眼沙盤,就知道哪個 Agent 卡住了、它在幹什麼、它在等誰。
後端 Agent 的生命週期被標準化為一個有限狀態機(FSM):

這個 FSM 是「內核級」的,意味著:
簡單說:Agent 不再是「自由發揮」,而是按「朝堂規矩」辦事。
每個工具調用都有 riskLevel(low / medium / high)。當 Agent 試圖執行高風險操作時:
WAITING_FOR_HUMANapproval_request 事件,彈出「御批」視窗這套機制讓「人審」不再是事後補救,而是執行流程的有機組成部分。
講完架構,聊聊實際用起來是什麼感覺。
在 Syntropy 裡,每一次使用者指令都被封裝為一份「奏折」。奏折閣是系統的任務管理中心,完整記錄了從擬旨 → 受理 → 分發 → 覆命的全過程。
奏折的核心特性:
當丞相收到一道複雜指令(如「查一下上季度的營收,並對比去年同期」),它不會直接給出答案,而是會拆解任務、調度六部、匯總結果。整個過程形成一棵決策樹:

在奏折閣中,這棵決策樹以可視化流程圖的形式呈現。你可以清楚地看到:

這對除錯和優化至關重要。你不再需要猜「Agent 為什麼沒按我的預期做事」,而是可以直接看到它的決策路徑,找出問題所在。
記憶庫展示 Agent 主動儲存的重要資訊(個人偏好、專案決策、關鍵事實),支援:
前端是 Syntropy 最複雜的部分。我們需要同時處理兩類需求:
我們的方案是 React-Phaser Bridge:

update() 迴圈中讀取 Store,同步小人動畫這套架構的好處是:UI 和渲染完全解耦。React 不用關心像素座標,Phaser 不用關心業務邏輯,兩者透過 Zustand 的狀態橋接。
// store/agentStore.ts
export const useAgentStore = createAgentStore((set) => ({
agents: {},
updateAgent: (id, updates) =>
set((state) => ({
agents: {
...state.agents,
[id]: { ...state.agents[id], ...updates },
},
})),
}));
// game/MainScene.ts
export class MainScene extends Phaser.Scene {
update() {
const agents = useAgentStore.getState().agents;
Object.values(agents).forEach((agent) => {
const sprite = this.sprites[agent.id];
if (sprite) {
sprite.updateState(agent.status, agent.targetPosition);
}
});
}
}
Syntropy 的後端完全自研,不依賴任何現有的 Agent 框架(LangChain、AutoGen 等)。原因很簡單:現有框架的狀態機模型和我們需要的不完全匹配。
後端整體架構:

後端核心模組:
// server/core/Agent.ts
class Agent {
private state: AgentState = 'IDLE';
async processMessage(message: string) {
this.setState('THINKING');
const response = await this.llm.chat(message);
if (response.toolCalls) {
for (const toolCall of response.toolCalls) {
const risk = this.assessRisk(toolCall);
if (risk === 'high') {
this.setState('WAITING_FOR_HUMAN');
await this.waitForApproval(toolCall);
}
await this.executeTool(toolCall);
}
}
this.setState('IDLE');
return response.content;
}
}
Syntropy 的記憶系統不是純向量檢索,而是三位一體的混合架構:
檢索時,我們使用 Reciprocal Rank Fusion (RRF) 演算法合併 FTS 和 Vector 的結果:
RRF_score = Σ (1 / (k + rank_i))
其中 k 是平滑常數(通常取 60),rank_i 是某條記憶在第 i 個檢索引擎中的排名。
RRF 讓兩者互補,召回率顯著提升。
當 Agent 進入 SLEEPING 狀態時,系統會自動呼叫 LLM 對當日未處理的對話進行摘要,生成 daily_summary 並持久化。這解決了長對話場景下的 Token 溢出問題。
// server/runtime/MemoryManager.ts
async compressMemories(agentId: string, conversations: Conversation[]) {
const summary = await this.llm.chat(`
請對以下對話進行摘要,提取關鍵決策和待辦事項:
${conversations.map(c => c.content).join('\n')}
`);
await this.db.insert('memories', {
agentId,
type: 'daily_summary',
content: summary,
timestamp: Date.now(),
});
}
每個使用者指令產生唯一的 traceId,貫穿 Agent 調度、工具調用、LLM 推理全流程。Tracer 記錄 8 種診斷事件:
agent.turn:Agent 開始處理一輪對話tool.call:工具調用model.usage:LLM 調用及 Token 消耗dispatch:任務分發approval.wait:等待御批approval.done:御批完成agent.stuck:Agent 卡死檢測(3 分鐘無回應自動告警)memory.save:記憶保存所有事件自動脫敏(截斷 API Key 等敏感資訊),便於效能分析和故障排查。
Phaser 是一個專業的 2D 遊戲引擎,提供了完整的場景管理、精靈動畫、碰撞檢測、尋路演算法。如果用 Canvas 手寫,這些都要從零實作;如果用 SVG,大量 DOM 元素會導致效能問題。
Phaser 的 WebGL 渲染讓我們可以輕鬆實現:
LangChain 和 AutoGen 的狀態機模型是「扁平」的:Agent 順序執行 Thought → Action → Observation。但我們需要的是內核級的狀態機,能夠:
現有的框架很難在不破壞封裝的前提下實現這些需求。
「古代朝廷」這套視覺系統是一把雙刃劍:
優點:
缺點:
我們的判斷是:可視化的核心價值在於降低認知負擔,視覺隱喻只是手段。如果換一套視覺系統(如太空站、工廠流水線),只要核心架構不變,價值依然存在。
Syntropy 目前處於 Beta 階段,程式碼已開源:GitHub - zabr1314/Syntropy
未來規劃:
Syntropy 本質上是一次將 AI 黑盒具象化的嘗試。我們相信:
當 Agent 的執行過程變得可見、可互動、可干預,多智能代理系統才能真正從實驗室走向生產環境。
但除此之外,它還有一個不那麼「技術」的價值:它讓管理 Agent 變成了一件有趣的事。
每天早上打開系統,看到丞相已經在廷議上等你,六部尚書各就各位。你擬定一道聖旨,看著小人們在宮殿裡跑來跑去辦差。有時候他們會卡住,有時候他們會犯錯,有時候他們會把奏折遞到你面前等你御批——這一刻,你不是在 debug,你是在當皇帝。
如果你對這套架構感興趣,或者有自己的看法,歡迎在 GitHub 上交流。
相關資源:
.env.example 配置 API Key,node server/index.js + npm run dev 即可「上朝」