前面 20 天,我們已經把一個 Agent 從最小 Loop 一路擴展到:
系統越來越像 Production Agent。
但也會開始出現一個很現實的問題:
Agent 昨天失敗了,你知道它「為什麼」失敗嗎?
很多系統會回答:
有 Log 啊
但「有 Log」和「可觀察」是兩件不同的事。
如果你只能看到:
Agent failed.
或者:
Tool error.
你仍然無法回答:
這就是 Observability 要解決的問題。
今天的核心觀念是:
Logging 記錄事件,Observability 讓你從事件重建系統行為。
傳統 Log 常常是程式碼作者想到什麼就印什麼:
starting task
calling model
calling tool
done
它可以幫助 Debug 小程式。
但 Agent 的問題更複雜。
一次 Task 可能包含:
User
↓
Model Call
↓
Tool A
↓
Tool Error
↓
Retry
↓
Model Call
↓
Subagent
↓
Tool B
↓
Approval
↓
Resume
↓
Verification
↓
Completed
如果每一段 Log 沒有:
那你最後只有很多字串,卻沒有一條可以重建的 Trajectory。
所以第一個設計原則是:
Agent Observability 要以「一次執行軌跡」為中心,而不是以單一 Log Line 為中心。
最基本的單位可以是 Event。
例如:
task_started
model_called
tool_requested
tool_completed
permission_denied
subagent_started
approval_required
task_completed
每個 Event 至少要帶上共同欄位:
event_name
timestamp
task_id
turn_id
parent_task_id
duration
status
再依事件類型加入不同資料。
例如 model_called 可以記:
model
input_tokens
output_tokens
cost
stop_reason
tool_completed 可以記:
tool_name
duration
success
error_type
output_size
這樣才能回答:
哪個 Tool 最常失敗?
而不是到幾萬行 Log 裡用 grep 猜。
Event 是點。
Trace 是整條路。
例如:
Task 123
├── Turn 1
│ ├── Model Call
│ └── Tool: search
├── Turn 2
│ ├── Model Call
│ └── Tool: read_file
├── Turn 3
│ ├── Model Call
│ ├── Tool: run_tests
│ └── Error
└── Turn 4
├── Model Call
└── Completed
有了 Trace,我們才能問:
這些問題都不是單一 Log 能回答的。
這裡有一個很大的陷阱。
Agent Debug 很需要 Context。
所以很多團隊會直接把:
全部送進 Observability Backend。
這非常方便。
也非常危險。
因為裡面可能包含:
所以 Observability 的第二個重要原則是:
可觀察不等於可以無限制記錄。
在 Telemetry 送出去之前,要先處理 Sensitive Data。
最簡單的策略不是建立一張超長 Blocklist。
而是反過來:
只允許已知安全欄位離開 Runtime。
例如:
允許:
task_id
event_name
model
token_count
duration
tool_name
status
error_type
cost
而:
prompt
source_code
file_content
secret
raw_tool_output
預設不送。
如果真的需要 Debug,可以把完整 Artifact 留在權限更嚴格的 Storage,而不是一般 Metrics Backend。
Production Agent 每一輪都產生大量 Event。
如果 100% 全部送到 Backend,成本可能很高。
例如:
100K Tasks / day
× 20 Events
=
2M Events / day
所以可以 Sampling。
但不是所有 Event 都適合相同 Sampling Rate。
例如:
model_call
10%
successful_tool
5%
permission_denied
100%
task_failed
100%
security_event
100%
成功案例可以抽樣。
Failure 與 Safety Event 通常應該完整保留。
這是 Observability 很容易犯的架構錯誤。
假設每次 Tool Call 後都同步:
POST /telemetry
如果 Telemetry Backend Timeout,Agent Loop 也跟著卡住。
結果變成:
監控系統故障,讓被監控的系統一起故障。
所以 Telemetry 最好採用:
Agent Loop
↓
emit event
↓
Queue / Buffer
↓
Telemetry Worker
↓
Sink
也就是 Fire-and-forget。
核心原則:
Telemetry 是 Side Observer,不應該成為 Agent 的必要執行步驟。
同一個 Event 可能送到:
如果其中一個 Sink 壞掉,不應該影響其他 Sink。
可以把架構想成:
Event
↓
Scrub
↓
Sample
↓
Fan-out
├── File
├── Metrics
└── Trace Backend
每個 Sink 都有自己的 Error Boundary。
Agent 啟動時,Telemetry Backend 可能還沒準備好。
如果 emit() 必須等 Sink Ready,Loop 就會被 Infrastructure 綁住。
所以可以先把 Event 放入本地 Queue。
等 Sink Attach 後再 Drain。
這個小設計可以讓:
Agent Runtime
和:
Observability Infrastructure
真正解耦。
Agent 和一般 Backend 很不一樣的一點是:
每一次 Model Call 都直接花錢。
所以 Token 和 Cost 不是 Nice-to-have Metric。
它們應該是一級指標。
例如每個 Model Call 都記:
model
input_tokens
output_tokens
cache_tokens
cost_usd
再 Roll Up:
Turn Cost
Task Cost
User Cost
Model Cost
Feature Cost
這樣才能回答:
假設平均 Task Cost:
$0.08
看起來很好。
但 P99 可能是:
$4.20
原因是少數 Task:
所以至少要看:
最後一個尤其重要。
因為「很便宜但一直失敗」沒有意義。
Observability 很容易只記系統行為:
但還缺一個重要問題:
這次 Task 最後到底怎樣?
至少應該記:
completed
failed
cancelled
human_handoff
verification_passed
verification_failed
這樣我們才能把 Process Metric 和 Outcome 連起來。
例如:
Tool Calls ↑
Success Rate 不變
表示 Agent 可能只是在做更多工作,沒有更好。
這是今天最重要的邊界。
Production 中發生了什麼?
例如:
這個 Agent 好不好?
例如:
Observability 提供 Evidence。
Evaluation 提供 Judgment。
兩者不能互相取代。
這兩套系統真正有價值的地方是可以形成 Loop。
例如 Production Trace 發現:
大量 Task 都在「缺少 order number」時失敗
那可以把這種 Failure Pattern 做成 Eval Case:
使用者一開始不提供 order number
Agent 必須先問
再測下一版 Agent 是否改善。
流程變成:
Production Failure
↓
Trace
↓
Scrub
↓
Convert to Eval Case
↓
Fix
↓
Run Evaluation
↓
Deploy
↓
Observe Again
這才是完整 Improvement Loop。
一個實用方式是分:
系統是否健康?
例如:
Agent 怎麼執行?
例如:
任務結果如何?
例如:
如果只看 System Metrics,你只知道服務沒掛。
但不知道 Agent 是否做對。
第一版不需要把所有東西都塞進 Trace。
可以從這些開始:
task_id
turn
model
stop_reason
input_tokens
output_tokens
cost
tool_name
tool_success
error_type
latency
permission_result
verification_result
final_status
這些已經足以回答大量 Production 問題。
真的需要完整 Prompt / Tool Output 時,再從受控 Artifact Store 查。
Logging Backend 一慢,Agent 也跟著慢。
造成 Code、PII、Secret 外洩。
真正需要 Debug 時資料反而不完整。
換 Model 後很難比較。
Agent 做了很多事,但不知道是否完成。
無法重建 Trajectory。
少數失控 Task 被平均值藏掉。
看到「發生什麼」就以為知道「好不好」。
第一版可以先做到五件事。
所有 Event 都有:
task_id
turn_id
event_name
timestamp
status
Log Failure 不影響 Agent Loop。
敏感資料預設不送。
每輪、每 Task 都能算成本。
可以從 Event 還原:
Task → Turns → Model → Tools → Errors → Outcome
這已經比「到處 print()」前進很多。
Day 20 我們已經能連接大量外部 Capability。
今天加入:
從今天開始,我們不只是讓 Agent 執行。
我們開始可以回答:
它剛剛到底做了什麼?
Observability 的核心不是多收集資料。
而是:
在不影響 Agent 執行與安全的前提下,保留足夠資訊重建一次 Task 的行為與成本。
最重要的原則是:
看得到發生什麼,才有資格討論要改什麼。
但 Observability 仍然不能回答:
這個結果到底好不好?
這就是下一篇 Evaluation 要處理的問題。
下一篇:
Agent Evaluation 為什麼不能只準備一份 Prompt Dataset,再算 Pass Rate?
完整系列與程式碼範例收錄於 https://github.com/hardness1020/awesome-agent-architecture