AI Agent 慢、贵、错:先把 trace 和 tool span 打出来
很多 AI Agent 项目从 demo 走向生产时,最先暴露的不是模型能力,而是排障能力。
用户只看到“回答慢、结果错、费用高”。工程团队如果只能看到一行 `tool call failed`,问题基本没法定位。
生产级 Agent 的第一步不是再换一个更强模型,而是先把 trace 和 tool span 打出来。
## 1. 为什么普通日志不够
传统后端服务里,请求路径通常比较固定:
```text
HTTP request -> service -> database -> response
```
Agent 系统的路径更像这样:
```text
user intent
-> prompt assembly
-> model routing
-> tool selection
-> tool input validation
-> external system call
-> model reasoning
-> final response or human handoff
```
如果每一步只写一行自然语言日志,后续很难回答三个关键问题:
1. 慢在哪一层?
2. 贵在哪一次模型或工具调用?
3. 错是模型判断错、上下文错,还是工具返回错?
所以 Agent 可观测性的核心不是“日志更多”,而是把一次任务拆成可以追踪的 span。
## 2. 一个最小 trace 结构
可以先不追求复杂平台,先保证每次任务有统一的 `trace_id`:
```json
{
"trace_id": "tr_20260614_001",
"user_intent": "查询客户最近一次工单并生成摘要",
"route": "support_agent_v2",
"model": "claude-sonnet",
"risk_level": "medium",
"started_at": "2026-06-14T09:30:00+08:00"
}
```
每次工具调用再记录一个 tool span:
```json
{
"trace_id": "tr_20260614_001",
"span_id": "tool_03",
"tool_name": "ticket.search",
"reason": "需要找到客户最近一次工单",
"input_schema_version": "v1",
"input_summary": {
"customer_id": "masked",
"limit": 1
},
"permission_result": "allowed",
"latency_ms": 842,
"status": "success",
"retry_count": 0
}
```
注意这里不一定要把所有原始数据明文写入日志。生产环境更常见的做法是记录摘要、哈希、脱敏字段和对象引用,避免把敏感数据复制到日志系统里。
## 3. tool span 至少要包含什么
我建议从 8 个字段开始:
| 字段 | 作用 |
| --- | --- |
| `trace_id` | 串起一次完整任务 |
| `tool_name` | 知道调用了哪个外部能力 |
| `reason` | 记录模型为什么选择这个工具 |
| `input_summary` | 保留入参摘要,避免明文泄露 |
| `permission_result` | 证明权限判断经过了系统 |
| `latency_ms` | 定位慢调用 |
| `status/error_code` | 区分工具失败和模型失败 |
| `retry_count` | 判断是否存在无效重试 |
这些字段先打出来,很多问题会立刻变清楚。
比如用户反馈“Agent 很慢”,你可以看到是模型推理慢、检索慢,还是某个外部 API 重试了 3 次。
用户反馈“结果错”,你可以看到是检索上下文错、工具入参错,还是模型在工具返回后总结错。
用户反馈“费用高”,你可以看到是不是高风险模型被低价值任务滥用了。
## 4. 权限边界必须进入 trace
Agent 比普通聊天机器人更危险的地方,是它可能调用真实系统。
只要涉及写入、发送、审批、支付、删除、变更配置,就不应该只依赖 prompt 约束。
权限判断应该是系统级逻辑,并且进入 trace:
```json
{
"tool_name": "invoice.send",
"risk_level": "high",
"permission_result": "blocked",
"block_reason": "requires_human_approval",
"approval_policy": "finance_handoff_v2"
}
```
这样出问题后,你能证明系统是否执行过边界判断,而不是事后猜测“模型当时是不是理解错了”。
## 5. 失败处理也要被记录
很多 Agent demo 只处理成功路径。生产系统最该先设计失败路径。
一次失败至少要回答:
- 是否允许重试?
- 重试用了同样参数还是修正参数?
- 是否触发降级模型或备用工具?
- 是否转人工?
- 是否回滚了已经执行的动作?
这些信息如果没有记录,事故复盘就会变成口头回忆。
## 6. 和 OpenTelemetry 怎么结合
如果团队已经在用 OpenTelemetry,可以把 Agent 的一次任务当成 trace,把模型调用、检索、工具调用、权限判断、人工接管都建成 span。
关键是不要只记录 HTTP 层 span。Agent 系统还需要业务语义:
- `agent.route`
- `agent.model`
- `agent.tool.name`
- `agent.tool.reason`
- `agent.risk_level`
- `agent.permission.result`
- `agent.handoff.required`
这些字段会让排障从“看服务状态”升级到“看 Agent 决策链”。
## 7. 最小落地顺序
如果现在系统已经在跑,但排障困难,可以按这个顺序补:
1. 所有请求加 `trace_id`
2. 模型调用记录 token、延迟、模型名
3. 工具调用记录 tool span
4. 高风险工具加入权限判断和人工复核
5. 失败路径记录重试、降级、回滚
6. 每周抽样复盘 5 条失败 trace
不要一开始就追求完整平台。先让每一次关键失败都有证据。
## 结论
Agent 慢、贵、错,通常不是一个单点问题。
它可能是模型路由、上下文、工具入参、外部系统、权限策略、失败处理共同作用的结果。
先把 trace 和 tool span 打出来,团队才有资格讨论优化。否则换模型、调 prompt、加缓存,都只是猜。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)