AI 工程從零開始|Phase 14 Part 1:Agent 迴圈與記憶系統 — 從單次呼叫到自主行動

大多數人把 AI Agent 當成「會呼叫工具的 ChatBot」,
以為加幾個 function call 就完成了;
真正的 Agent 工程需要持久記憶、確定性狀態機、可觀測的思考迴圈
差距不在 LLM,在你能不能讓它在第 20 步還知道自己在做什麼。


面試情境:
你是某電商平台的 AI 基礎設施 Lead。PM 要求將現有的「單次 GPT 呼叫客服」升級為「可自主完成退款、查單、更換地址」的 Agent,日均對話量 80K,P99 回應時間需在 8 秒以內。請問你如何設計 Agent 迴圈、記憶系統與上下文管理策略,並說明在 MVP 和 Scale 兩個階段的架構差異?


一、核心問題:什麼是真正的 AI Agent

單次 LLM 呼叫(stateless call)與真正的 Agent之間有一道本質的鴻溝。

前者每次呼叫都是白紙一張,不知道剛才做了什麼,也不知道任務完成到哪裡;後者具備三個關鍵能力:

  1. 自主決策迴圈:在沒有人類介入的情況下,重複「感知→思考→行動→觀察」直到任務完成或確認無法完成。
  2. 跨步驟記憶:第 15 個步驟還能記得第 1 個步驟收集的用戶資料,不會重複詢問相同問題。
  3. 工具組合能力:可以依情境選擇不同工具,並根據工具回傳結果調整下一步計畫。

為什麼這很難?

LLM 本身是無狀態的(stateless)。每次 API 呼叫都是獨立的 HTTP 請求,沒有跨請求的記憶。Agent 框架必須在應用層解決:

  • 上下文視窗有限:GPT-4o 128K tokens,換算約 96K 中文字。長任務無法全塞。
  • 幻覺累積問題:步驟越多,錯誤累積越嚴重,必須設計檢查點。
  • 成本爆炸:每步驟都傳完整歷史,128K token × $5/1M input = 每步 $0.64,100 步任務 = $64/次。
  • 確定性需求:「取消訂單」這種有副作用的操作不能讓 LLM 隨機決定,必須用狀態機控制。

正確的 Agent 工程不是「把更多東西塞進 prompt」,而是設計一個可靠的資訊流系統,讓 LLM 在每個決策點都能拿到恰好足夠的上下文。


二、三個演進階段(POC → MVP → Scale)

╔══════════════════════════════════════╗

║ Phase 1:POC(< 1K 日均對話) ║

╚══════════════════════════════════════╝

目標:證明 Agent 能完成任務,快速驗證工具整合。

┌─────────────────────────────────────────────────────────────┐
│                     POC Agent 架構                          │
│                                                             │
│  用戶輸入                                                   │
│     │                                                       │
│     ▼                                                       │
│  ┌──────────────────────────────────┐                      │
│  │  Single LLM Call (ReAct prompt)  │                      │
│  │  - 完整歷史直接傳入              │                      │
│  │  - Tool defs 內嵌 system prompt  │                      │
│  └──────────────┬───────────────────┘                      │
│                 │                                           │
│        ┌────────▼────────┐                                  │
│        │  Tool Executor  │  (Python dict dispatch)          │
│        └────────┬────────┘                                  │
│                 │ 結果                                       │
│                 └──────────── 回填 messages list            │
│                                                             │
│  記憶:in-memory list(重啟即失)                           │
│  成本:~$0.02/對話,無限制                                  │
│  缺點:超過 40 步必 OOM 或 exceed context                   │
└─────────────────────────────────────────────────────────────┘

新增元件:LLM API client、基本 tool dispatcher、messages list
可接受的妥協:記憶不持久、無錯誤恢復、無成本控制
適用場景:內部 demo、技術可行性驗證


╔══════════════════════════════════════╗

║ Phase 2:MVP(1K–20K 日均對話) ║

╚══════════════════════════════════════╝

目標:可上線、可監控、成本可預測。

┌──────────────────────────────────────────────────────────────────┐
│                        MVP Agent 架構                            │
│                                                                  │
│  用戶輸入                                                        │
│     │                                                            │
│     ▼                                                            │
│  ┌────────────────┐    ┌──────────────────────────────────────┐  │
│  │ Session Store  │    │          Agent Orchestrator          │  │
│  │ (Redis TTL 2h) │◀───│  - Context Window Manager            │  │
│  └────────────────┘    │  - Step counter (max 25)             │  │
│                        │  - Cost accumulator                  │  │
│                        └──────────────┬───────────────────────┘  │
│                                       │                          │
│                        ┌─────────────▼──────────────┐           │
│                        │      LLM Gateway            │           │
│                        │  - Sliding window (8K)      │           │
│                        │  - Summary injection        │           │
│                        └─────────────┬──────────────┘           │
│                                      │                           │
│           ┌──────────────────────────▼──────────────────┐        │
│           │              Tool Registry                   │        │
│           │  refund_api │ order_lookup │ address_update  │        │
│           └──────────────────────────┬──────────────────┘        │
│                                      │                           │
│  持久記憶:PostgreSQL(情節記憶)                                │
│  成本:~$0.08/對話,硬上限 $0.50/session                        │
│  監控:LangSmith traces                                          │
└──────────────────────────────────────────────────────────────────┘

新增元件:Redis session store、Context Window Manager、Tool Registry、PostgreSQL 情節記憶、成本上限
解決問題:記憶持久化、成本失控、基本可觀測性
仍有問題:單點 Orchestrator、無水平擴展、記憶壓縮策略簡陋


╔══════════════════════════════════════╗

║ Phase 3:Scale(20K–200K 日均) ║

╚══════════════════════════════════════╝

目標:高可用、水平擴展、記憶系統完整。

┌────────────────────────────────────────────────────────────────────────┐
│                         Scale Agent 架構                               │
│                                                                        │
│  ┌──────────────┐   ┌──────────────────────────────────────────────┐  │
│  │  API Gateway  │──▶│           Agent Router (stateless)           │  │
│  │  + Auth JWT   │   │  - session_id → shard mapping                │  │
│  └──────────────┘   └───────────────┬──────────────────────────────┘  │
│                                     │                                  │
│           ┌─────────────────────────▼──────────────────────────┐       │
│           │              Agent Worker Pool (×N)                 │       │
│           │  Worker 1 │ Worker 2 │ Worker 3 │ ... │ Worker N    │       │
│           └─────────────────────────┬──────────────────────────┘       │
│                                     │                                  │
│     ┌───────────────────────────────▼──────────────────────────────┐   │
│     │                    Memory System                              │   │
│     │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌────────────┐  │   │
│     │  │ Sensory  │  │ Working  │  │ Episodic │  │  Semantic  │  │   │
│     │  │(in-proc) │  │ (Redis)  │  │(Postgres)│  │(pgvector)  │  │   │
│     │  └──────────┘  └──────────┘  └──────────┘  └────────────┘  │   │
│     └──────────────────────────────────────────────────────────────┘   │
│                                     │                                  │
│     ┌───────────────────────────────▼──────────────────────────────┐   │
│     │                  Tool Execution Layer                         │   │
│     │  Sync tools ─── async tools ─── long-running tasks (Celery)  │   │
│     └──────────────────────────────────────────────────────────────┘   │
│                                                                        │
│  可觀測性:OpenTelemetry traces → Jaeger;Prometheus metrics           │
│  成本:~$0.12/對話;P99 回應 < 6s;可用性 99.5%                       │
└────────────────────────────────────────────────────────────────────────┘

新增元件:Agent Router、Worker Pool、完整四層記憶系統、Celery 長任務、OpenTelemetry
解決問題:水平擴展、記憶系統完整性、長任務非同步執行
成本/複雜度:月雲端費用約 $3,000–$8,000;需要 3–5 名工程師維護


三、Agent 迴圈:Perceive → Think → Act → Observe

AI Agent 的核心是一個無限迴圈,每次迭代稱為一個「step」。

┌─────────────────────────────────────────────────────────────────┐
│                    Agent 主迴圈                                  │
│                                                                 │
│                    ┌─────────────┐                              │
│                    │   START     │                              │
│                    │  task init  │                              │
│                    └──────┬──────┘                              │
│                           │                                     │
│            ┌──────────────▼──────────────┐                     │
│            │     PERCEIVE(感知)          │                     │
│            │  - 讀取用戶輸入              │                     │
│            │  - 載入工作記憶              │                     │
│            │  - 查詢情節/語意記憶         │                     │
│            └──────────────┬──────────────┘                     │
│                           │                                     │
│            ┌──────────────▼──────────────┐                     │
│            │     THINK(思考)            │                     │
│            │  - LLM 呼叫(含工具定義)   │                     │
│            │  - 解析 reasoning chain      │                     │
│            │  - 決定 next action          │                     │
│            └──────────────┬──────────────┘                     │
│                           │                                     │
│            ┌──────────────▼──────────────┐                     │
│            │     ACT(行動)              │                     │
│            │  - 執行 tool call            │                     │
│            │  - 驗證參數(schema check)  │                     │
│            │  - 紀錄 action log           │                     │
│            └──────────────┬──────────────┘                     │
│                           │                                     │
│            ┌──────────────▼──────────────┐                     │
│            │     OBSERVE(觀察)          │                     │
│            │  - 解析工具回傳結果          │                     │
│            │  - 更新工作記憶              │                     │
│            │  - 評估任務是否完成          │                     │
│            └──────────────┬──────────────┘                     │
│                           │                                     │
│              ┌────────────▼────────────┐                       │
│              │  任務完成?/ 超步驟?    │                       │
│              │  / 遇到無法恢復的錯誤?  │                       │
│              └────┬──────────────┬─────┘                       │
│                   │ YES          │ NO                           │
│                   ▼             └──────────────────┐           │
│              ┌─────────┐                           │           │
│              │   END   │              回到 PERCEIVE │           │
│              └─────────┘                           │           │
│                                                    ▼           │
└────────────────────────────────────────────────────────────────┘

關鍵設計決策

步驟上限(max_steps):必須設定,否則單次任務可能無限迴圈消耗資源。POC 設 10,MVP 設 25,Scale 依任務類型設 15–50。

步驟超時(step_timeout):每個 LLM 呼叫設 30s 超時,每個工具呼叫設 10s 超時。P99 超時觸發後應記錄中間狀態,允許用戶繼續。

狀態機整合:ACT 步驟不直接由 LLM 決定「要不要執行退款」,而是 LLM 提出意圖,狀態機驗證當前狀態允許該轉換後才實際執行。詳見第七節。


四、ReAct 框架:交錯推理與行動

ReAct(Reasoning + Acting)是目前最廣泛使用的 Agent 框架。核心思想是讓 LLM 在每個步驟先產出「思考」(Thought),再決定「行動」(Action),收到觀察結果(Observation)後繼續。

┌──────────────────────────────────────────────────────────────────┐
│                     ReAct 流程圖                                  │
│                                                                  │
│  User: "幫我退訂單 #A123,原因是商品損壞"                        │
│     │                                                            │
│     ▼                                                            │
│  ┌─────────────────────────────────────────────────────────┐    │
│  │  Step 1                                                  │    │
│  │  Thought: 我需要先查訂單 #A123 的狀態,確認是否可退款    │    │
│  │  Action: order_lookup(order_id="A123")                   │    │
│  │  Observation: {status: "delivered", amount: 299, ...}    │    │
│  └─────────────────────────────────────────────────────────┘    │
│     │                                                            │
│     ▼                                                            │
│  ┌─────────────────────────────────────────────────────────┐    │
│  │  Step 2                                                  │    │
│  │  Thought: 訂單已送達,符合退款條件(14天內)。            │    │
│  │          需確認用戶退款帳戶                               │    │
│  │  Action: get_user_payment_info(user_id="U456")           │    │
│  │  Observation: {method: "credit_card", last4: "1234"}     │    │
│  └─────────────────────────────────────────────────────────┘    │
│     │                                                            │
│     ▼                                                            │
│  ┌─────────────────────────────────────────────────────────┐    │
│  │  Step 3                                                  │    │
│  │  Thought: 資料齊全,執行退款。金額 $299 退回信用卡末4碼  │    │
│  │          1234。需要用戶確認。                             │    │
│  │  Action: request_user_confirmation(                      │    │
│  │    message="確認退款 $299 至信用卡 ****1234?")           │    │
│  │  Observation: {confirmed: true}                          │    │
│  └─────────────────────────────────────────────────────────┘    │
│     │                                                            │
│     ▼                                                            │
│  ┌─────────────────────────────────────────────────────────┐    │
│  │  Step 4                                                  │    │
│  │  Thought: 用戶確認。執行退款 API。                        │    │
│  │  Action: process_refund(order_id="A123", amount=299,     │    │
│  │                         reason="damaged_goods")          │    │
│  │  Observation: {refund_id: "R789", eta: "3-5 days"}       │    │
│  └─────────────────────────────────────────────────────────┘    │
│     │                                                            │
│     ▼                                                            │
│  Final Answer: 退款已成功申請(單號 R789),3-5 個工作天內      │
│               退回您的信用卡 ****1234。                          │
└──────────────────────────────────────────────────────────────────┘

Reflexion 擴展

Reflexion 在 ReAct 基礎上增加「反思」步驟:任務失敗後,Agent 生成一段自我批評(self-reflection),存入情節記憶,下次執行相似任務時注入 context,避免重複同樣錯誤。

實測數據:在 HotpotQA 任務上,ReAct 成功率約 58%,加入 Reflexion 後提升至 71%(+13pp),代價是每次失敗多消耗約 800 tokens 的反思生成。


五、記憶四層架構:感官 / 工作 / 情節 / 語意

人類記憶的分層模型被直接應用於 Agent 設計。

┌──────────────────────────────────────────────────────────────────────┐
│                       四層記憶架構                                    │
│                                                                      │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │  Layer 1:感官記憶(Sensory Memory)                         │    │
│  │  壽命 < 1s | 容量:當前 token buffer | 存儲:in-process  │    │
│  │  內容:原始輸入(用戶訊息、工具 raw output)                │    │
│  │  用途:尚未處理的即時資料                                   │    │
│  └──────────────────────────┬──────────────────────────────────┘    │
│                             │ 重要資訊提取                           │
│                             ▼                                        │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │  Layer 2:工作記憶(Working Memory)                         │    │
│  │  壽命:session 期間 | 容量:~8K tokens | 存儲:Redis      │    │
│  │  內容:當前任務狀態、最近 N 步歷史、活躍工具結果            │    │
│  │  用途:每次 LLM 呼叫都注入這層                              │    │
│  │  TTL:2 小時(用戶閒置超過 2h 清除)                        │    │
│  └──────────────────────────┬──────────────────────────────────┘    │
│                             │ 完成的任務/重要事件                    │
│                             ▼                                        │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │  Layer 3:情節記憶(Episodic Memory)                        │    │
│  │  壽命:永久 | 容量:無限 | 存儲:PostgreSQL               │    │
│  │  內容:過去對話摘要、任務結果、錯誤反思                     │    │
│  │  用途:跨 session 連續性;「上次你說…」                    │    │
│  │  查詢:by user_id + timestamp range                         │    │
│  └──────────────────────────┬──────────────────────────────────┘    │
│                             │ 知識蒸餾                               │
│                             ▼                                        │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │  Layer 4:語意記憶(Semantic Memory)                        │    │
│  │  壽命:永久 | 容量:無限 | 存儲:pgvector / Pinecone      │    │
│  │  內容:用戶偏好、領域知識、FAQ 嵌入向量                     │    │
│  │  用途:RAG 檢索;相似情境參考                               │    │
│  │  查詢:cosine similarity top-K(K=5 實測最佳)              │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                                                                      │
│  每次 LLM 呼叫的上下文組成:                                        │
│  [System Prompt] + [語意記憶 top-3] + [情節摘要] + [工作記憶]      │
│  約 2K    +         1.5K           +    500      +   8K = 12K total │
└──────────────────────────────────────────────────────────────────────┘

各層實作要點

工作記憶(Redis)

  • Key 格式:agent:session:{session_id}:working_memory
  • Value:JSON 序列化的 messages list + task_state
  • TTL:7200 秒
  • 超出 8K tokens 時觸發「滑動視窗」策略(詳見第六節)

情節記憶(PostgreSQL)

 1CREATE TABLE episode_memory (
 2  id          BIGSERIAL PRIMARY KEY,
 3  user_id     TEXT NOT NULL,
 4  session_id  TEXT NOT NULL,
 5  summary     TEXT,          -- LLM 生成的對話摘要
 6  outcome     TEXT,          -- success / failure / partial
 7  key_facts   JSONB,         -- 結構化提取的重要資訊
 8  created_at  TIMESTAMPTZ DEFAULT NOW(),
 9  INDEX (user_id, created_at DESC)
10);

語意記憶(pgvector)

  • 使用 text-embedding-3-small(1536 dims)嵌入
  • 每個知識片段 < 512 tokens
  • 查詢時用 <=> cosine distance,閾值 < 0.3 才注入

六、上下文視窗管理:摘要 / 壓縮 / 選擇性遺忘

上下文視窗是 Agent 最稀缺的資源。以 GPT-4o 128K token 為例,input 費用 $5/1M tokens,若每步驟都傳滿,25 步任務的 input 成本 = 25 × 128K × $5/1M = $16/次,完全不可行。

三種壓縮策略

策略一:滑動視窗(Sliding Window)
保留最近 N 條訊息,丟棄更早的。簡單有效,但會遺失早期重要資訊。
適用:任務步驟少(< 10)、早期資訊不重要的場景。
N = 6(3 組 thought/action/observation)是實測甜蜜點。

策略二:遞進摘要(Progressive Summarization)
每隔 K 步,呼叫 LLM 將「最舊的 K 步」壓縮為一段摘要,摘要替換原始訊息。
壓縮比:8K tokens → 500 tokens(約 16:1)。
代價:每次摘要多消耗一次 LLM 呼叫(約 $0.002/次)。
適用:長任務(10–30 步)、需要保留歷史摘要。

策略三:選擇性保留(Selective Retention)
由 LLM 標記每條訊息的「重要度分數」(0–1.0),低於 0.4 的訊息在視窗壓縮時優先丟棄。
高重要度標記的訊息類型:用戶明確說出的需求、工具回傳的關鍵 ID(訂單號/退款單號)、用戶確認的決策。
代價:需要額外標記步驟,或在 Observation 處理時即時評分。

實際上下文預算配置(MVP 設定)

區塊Token 預算來源
System prompt + tools2,000靜態
語意記憶 RAG1,500動態檢索
情節摘要500上次對話壓縮
工作記憶(滑動視窗)6,000最近 6 步
輸出預留2,000max_tokens
總計12,000

在 GPT-4o 的 128K 視窗內,這個配置有 10 倍的安全餘量,且成本每步僅 $0.06,25 步任務 = $1.50/次,可接受。


七、Agent 狀態機:確定性控制 vs LLM 決策的邊界

最常見的 Agent 設計錯誤:把所有決策都交給 LLM,包括「現在應不應該執行退款」這種有不可逆副作用的操作。

正確做法是用確定性狀態機控制業務流程,LLM 只負責「資訊蒐集」和「意圖提取」,狀態轉換由狀態機驗證。

┌─────────────────────────────────────────────────────────────────────┐
│                  退款 Agent 狀態機                                   │
│                                                                     │
│  INITIAL ──[用戶提出退款請求]──▶ GATHERING_INFO                    │
│                                       │                             │
│                               [所有必要資訊齊全]                    │
│                                       │                             │
│                                       ▼                             │
│                               VALIDATING                            │
│                               │         │                           │
│                    [驗證通過]  │         │  [驗證失敗]               │
│                               ▼         ▼                           │
│                        AWAITING_     REJECTED                       │
│                        CONFIRM        (final)                       │
│                             │                                       │
│                   [用戶確認] │     [用戶取消]                       │
│                             ▼         ▼                             │
│                        PROCESSING  CANCELLED                        │
│                             │       (final)                         │
│                    [API 成功] │  [API 失敗]                         │
│                             ▼      ▼                                │
│                        COMPLETED  FAILED                            │
│                         (final)   (final)                           │
│                                                                     │
│  LLM 可執行的轉換:INITIAL→GATHERING、GATHERING→GATHERING(資訊收集)│
│  LLM 不可直接觸發的轉換:VALIDATING→PROCESSING(必須由系統驗證)    │
│                          AWAITING→PROCESSING(必須有明確用戶確認)  │
└─────────────────────────────────────────────────────────────────────┘

邊界原則

決策類型由誰決定理由
下一步要問什麼問題LLM語言理解任務
如何組織回答LLM生成任務
是否滿足退款條件規則引擎確定性邏輯
是否執行退款 API狀態機 + 用戶確認不可逆副作用
工具呼叫的參數值LLM語意提取任務
工具呼叫是否允許權限系統安全邊界

八、為什麼選 X 不選 Y

決策 1:工作記憶存儲

選擇              選 Redis 的理由                   不選的理由
─────────────────────────────────────────────────────────────
Redis             < 1ms 讀寫;原生 TTL;             Memcached:無持久化,
vs                Cluster 模式;支援 HASH/LIST       資料結構少
PostgreSQL        structure                          Postgres:連接開銷 5ms+,
vs                                                   session 數萬時連接池壓力大
In-memory         TTL 自動清理;多 Worker 共享        In-memory:Worker 重啟失憶,
dict              同一 session 狀態                   無法水平擴展

Flip condition:若日均 session < 100,in-memory dict 足夠;Redis 的必要性從 1K sessions/day 開始顯現。


決策 2:語意記憶向量資料庫

選擇              選 pgvector 的理由                  不選的理由
──────────────────────────────────────────────────────────────
pgvector          與 PostgreSQL 同一資料庫;            Pinecone:額外 $70/月起,
vs                SQL + 向量混合查詢;                  需要同步兩個資料庫
Pinecone          開源,無額外費用                      Weaviate:運維複雜,
vs                                                     自建需要 4GB RAM
Weaviate          延遲 5–15ms(100K vectors 以內);    FAISS:純 library,
vs                HNSW 索引                            無 server,無法水平擴展
FAISS

Flip condition:向量數 > 10M 或需要 < 5ms P99 查詢延遲時,考慮 Pinecone 或 Qdrant。


決策 3:Agent 框架

選擇              選自建輕量框架的理由                不選的理由
──────────────────────────────────────────────────────────────
自建              完整控制;無黑箱;                  LangChain:抽象層太厚,
vs                易於 debug;記憶系統可自訂           debug 困難,版本升級常 breaking
LangChain         核心代碼 < 500 行                    LlamaIndex:偏向 RAG,
vs                                                     Agent loop 不完整
LlamaIndex        適合生產環境的自定義需求              AutoGen:multi-agent 場景才
vs                                                     有優勢,單 agent 過重
AutoGen

Flip condition:需要快速 POC(< 1 週)且不在乎 debug 成本時,LangChain 可接受。多 Agent 協作場景考慮 AutoGen 或 CrewAI。


決策 4:ReAct vs Plan-and-Execute

選擇              選 ReAct 的理由                     不選的理由
──────────────────────────────────────────────────────────────
ReAct             動態調整;每步根據觀察重新決策;      Plan-and-Execute:
vs                適合不確定性高的任務;               預設計畫在中途失效時
Plan-and-         延遲低(不需先生成完整計畫)          難以動態調整;需要
Execute                                               額外的 re-planning 機制

                  實測:5 步以內任務 ReAct vs P&E      P&E 在 > 10 步、結構
                  完成率相同(~82%),延遲 ReAct 低     明確的任務上完成率更高
                  30–40%                               (84% vs 79%)

Flip condition:任務步驟 > 10 且流程高度結構化(如:固定的 SOP)時,Plan-and-Execute 更可預測。


決策 5:記憶壓縮策略

選擇              選遞進摘要的理由                     不選的理由
──────────────────────────────────────────────────────────────
遞進摘要          保留語意資訊;                       滑動視窗:丟失早期
vs                壓縮比高(16:1);                   重要資訊;< 10 步
滑動視窗          長任務(> 10 步)適用                 任務可用
vs                                                    選擇性保留:需要額外
選擇性保留        每次壓縮只多花 $0.002;               LLM 呼叫打分,延遲
                  延遲影響 < 500ms                     增加 800ms+

Flip condition:任務 < 8 步時,滑動視窗(保留最近 6 步)成本最低,無需摘要。


決策 6:用戶確認機制

選擇              選「明確確認 + 狀態機鎖定」的理由    不選的理由
──────────────────────────────────────────────────────────────
明確確認          不可逆操作(退款/刪除/下單)          隱式確認(LLM 判斷):
+ 狀態機          必須有用戶明確輸入;                  幻覺風險;用戶說
vs                狀態機確保同一 session 不可            "好的隨便" 被誤判為
隱式確認          重複觸發同一退款                      確認;無稽核日誌

Flip condition:對於可逆操作(查詢、摘要、推薦),不需要確認步驟,加確認反而降低 UX 流暢度。


九、系統效應:無記憶 vs 完整記憶系統

以電商客服 Agent 為基準,日均 80K 對話,每對話平均 4.2 步。

指標無記憶(單次呼叫)完整記憶系統(四層架構)改善幅度
任務完成率43%79%+36pp
需要人工接管率57%21%-36pp
平均對話輪次7.8 輪(重複問題多)4.2 輪-46%
用戶重複提供資訊次數2.3 次/對話0.1 次/對話-96%
P99 回應延遲3.2s5.8s(多了記憶查詢)-2.6s
P50 回應延遲1.8s2.4s-0.6s
每次對話成本$0.03$0.12+$0.09
月基礎設施成本$200$3,200+$3,000
用戶滿意度(CSAT)3.1 / 54.2 / 5+35%
退款錯誤率2.1%0.08%-96%

成本效益分析

月額外基礎設施成本:$3,000
每避免一次人工接管節省:~$2.5(人工客服成本)
月減少人工接管次數:80K × 0.36 = 28,800 次
月節省人工成本:28,800 × $2.5 = $72,000

ROI = ($72,000 - $3,000) / $3,000 = 2,300%

即使把 LLM API 成本算進去(月 $0.09 × 80K × 30 = $216,000),整體客服成本相比純人工方案(80K × 30 × $2.5 = $6M)仍降低 64%


十、面試答題要點

「設計退款 Agent 的核心挑戰不是讓 LLM 更聰明,而是建立三個基礎:一個有狀態的記憶系統、一個確定性的狀態機、以及一個可觀測的思考迴圈。MVP 階段我會用 Redis 存工作記憶(TTL 2h,8K tokens 滑動視窗)、PostgreSQL 存情節記憶,讓 Agent 跨 session 記住用戶身份;狀態機確保退款操作只在 VALIDATING→AWAITING_CONFIRM→PROCESSING 的路徑上執行,LLM 幻覺無法繞過確認步驟。到 Scale 階段(20K+ 日均),再加入 pgvector 語意記憶、Worker Pool 水平擴展、OpenTelemetry traces,把 P99 控制在 6s 內。整體而言,有記憶的 Agent 比無記憶版本任務完成率從 43% 提升至 79%,退款錯誤率從 2.1% 降至 0.08%,ROI 超過 2,000%。」


十一、系列導航

本文是 AI 工程從零開始 系列 Phase 14 Part 1。

Phase 13 Part 2:RAG 進階優化與生產部署

Phase 14 Part 2:Multi-Agent 協作與 Tool Use 進階設計


系列索引:AI 工程從零開始 — 完整系列

Yen

Yen

Yen