主题
可观测与安全
一句话:可观测回答“实际发生了什么”,安全回答“这一次允许发生什么”。前者产出证据,后者划定边界;两者都不该用“请求成功”或“模型没违规”来结案。
对应原书:第 13 章《Agent 可观测性》、第 14 章《Agent 安全》。
为什么需要
传统服务的可观测性围绕请求:成功率、延迟、错误码。Agent 不适用,因为三件事变了:
- 成功不等于做对:接口返回 200,业务对象可能改错;任务跑完,结果可能没交付。
- 路径不固定:同一个问题,两次执行的步骤、工具、成本都不一样,看单点指标会漏掉绕路与重复。
- 动作有副作用:删文件、发消息、转账、改配置,出了事必须能回答“谁让它做的、依据是什么”。
安全侧同理。给模型加护栏、给沙箱加隔离,只解决了“系统有没有漏洞”;但 Agent 同时握着决策权和执行权,一次合法工具调用的组合也可能是危险的。所以需要两条线:盾管系统漏洞,缰绳管单次调用能不能做。
核心机制
一、Session、Trace、Span 与 Trace Link
- Session 关联多次交互,可以跨多个 Trace、跨很长时间;
- Trace 承载一次外部输入触发的活跃执行;
- Span 是基本执行单元:做了什么、花了多久、结果如何、由谁调用。
跨请求等待超过阈值时,应当结束旧 Trace,恢复时新建 Trace,并用 Trace Link 关联。否则一个等了三天的长任务会被压进一条早已过期的 Trace 里,既查不到,也聚合不了。
二、十二种统一执行语义
ENTRY、AGENT、WORKFLOW、STEP、LLM、RETRIEVAL、MEMORY、TOOL、GUARDRAIL、COMPACTION、HITL、INTERRUPT。
语义层的价值是拉齐不同框架的术语。没有统一语义,跨应用查询只能按字符串匹配,聚合出来的数字不可比。
三、四层采集管道与三种信号
信号的使用顺序固定:指标发现异常 → Trace 定位请求 → 日志还原细节。反过来先翻日志,会在海量文本里迷路。
指标只用低基数标签(业务来源、阶段、模型),禁止把 Trace ID、请求 ID 放进 Metrics——那会让时间序列基数爆炸。Token 要分输入、输出、缓存分别记录,缓存命中率是独立口径。
四、eBPF 的位置与边界
eBPF 把模型调用看成网络请求与响应,把工具调用看成进程、文件、网络事件。它完全无侵入,适合补上“应用没有埋点”的那一段。
但它缺业务语义,回答不了“为什么这么做”。它必须与应用侧埋点、审计记录互证,不能当成唯一手段。同理,采集游标与去重是幂等机制,不是业务 Checkpoint。
五、任务效果与证据链
任务效果分三层看:最终结果、关键步骤、执行轨迹。只评最终结果,会漏掉绕路、重复、越权、错误委派和过度消耗——结果对,过程可能完全不可运营。
审计的最小证据链有四环:
- 主体授权:是谁;
- 意图授权:要做什么、依据哪条策略;
- 执行事实:实际发生了什么;
- 结果证据:产物或副作用在哪里。
缺任何一环,都无法复核。检测要分层:原始事实(追加写)→ 候选信号(规则派生)→ 上下文研判 → 已确认事件。中间态不能当安全结论,检测与拦截也要分开建模——把观测当防护,是最常见的错觉。
六、五类攻击面
| 攻击面 | 典型形态 |
|---|---|
| 不可信外部输入 | 网页、邮件、文档、工具返回里的提示注入 |
| 工具发现与调用 | 恶意工具描述诱导、参数注入命令、越权调用 |
| 动态业务调用与网络 | SSRF 从单一入口扩散到任意出口、中间服务代联网 |
| 结果交付边界 | 污染内容被持久化到数据库、消息、工单 |
| 自主重试与并发 | 重试耗尽余额、并发放大失败(拒绝服务式消耗) |
防护思路对应两句话:外部防操纵(输入净化、内容安全、工具白名单),内部限影响(最小权限、沙箱、限流与重试预算)。
七、盾与缰绳
盾是五层纵深:应用、模型、数据、身份、基础设施。单层不够,因为 Agent 的输入、工具、网络、交付、重试都会形成新的出口。
缰绳是五步:身份鉴权 → 意图识别 → 逐次调用校验 → 高危二次授权 → 数据出域阻断。它管的是“这一次能不能做”,和盾管“系统有没有洞”是两件事。
一个具体例子:出站默认允许,是很多真实事故的根因。Agent 可以通过一个可访问的中间服务代为联网,绕过原本只保护入口的边界。所以出站必须默认拒绝、统一收敛到网关。
八、身份是贯通双轨的关口
四条纪律分别管住凭证的生命周期、权限的收敛方向与出站的独立授权:
- Agent 权限 ≤ 用户权限,按任务临时授权,不长期持有;
- 凭证不落在代码、配置或模型上下文里,由凭证保管库颁发、轮换、回收;
- 入站与出站分别授权,入站鉴权不自动转成出站权限;
- Token Exchange 做权限收敛:换出来的下游凭证比用户更窄;首次代理需要用户明确同意,撤销即失去出站能力。
行级、字段级隔离交给身份系统,不要指望在 Prompt 里写“不要给用户看别人的数据”。
最小上手
yaml
observability:
semantics: [ENTRY, AGENT, WORKFLOW, STEP, LLM, RETRIEVAL, MEMORY, TOOL, GUARDRAIL, COMPACTION, HITL, INTERRUPT]
metrics: {labels: low_cardinality_only, forbid: [trace_id, request_id]}
audit_chain: [subject_authz, intent_authz, execution_fact, result_evidence]
security:
egress: deny_by_default
credential: short_lived_from_vault
agent_permission: intersect(user, workload, delegation, resource)
high_risk: reauthorize_per_action验收看四件事:任一任务能还原“谁、以什么权限、做了什么、结果在哪”;指标能定位到具体 Trace;出站请求全部经过统一关口;Agent 被撤销授权后,运行中的任务也受影响。
生产动作
- 把“请求成功”从完成判据里删掉。端到端 P50/P95/P99 才是用户感知,模型耗时只是其中一段。
- 抽检高分样本。只盯低分会漏掉“评估器给了高分但业务不认”的情况。
- 检测与拦截分开建。先有可信的检测,再谈自动阻断;顺序反了会误杀。
- 重试要有预算。自主重试乘上并发,会把一次下游故障放大成余额耗尽。
边界
- eBPF 看不到意图。它能回答“调了什么”,回答不了“为什么调”。
- 护栏不等于安全。九类护栏覆盖内容与注入,但越权、出站、凭证滥用要靠身份与网络策略。
- 审计日志不是业务证据。日志证明“发生过调用”,业务 Evidence 要由业务系统确认。
- 采样有代价。采多了成本高、采少了漏检,采样策略要显式设计,不能默认全采或默认不采。
- 安全事件统计要带口径。例如“发生过 AI 安全事件的机构中 92% 缺访问控制”,分母是事件机构,不是全部受访机构。
讲清楚
可观测的对象不是请求,而是执行:Session 圈定范围,Trace 圈定一次活跃执行,Span 记录每一步;用十二种统一语义让跨框架的数据可比。采集走四层管道,使用时按“指标 → Trace → 日志”下钻。eBPF 补无埋点的空白,但缺业务语义,必须与应用侧互证。
安全要两条线:盾是应用、模型、数据、身份、基础设施五层纵深,缰绳是鉴权、意图识别、逐次校验、高危二次授权、出域阻断五步。身份贯通两者:Agent 有唯一身份,权限不超过用户,凭证短期且不落模型,入站出站分别授权,换取的令牌只收窄不放大。
可观测产出的是证据,不是结论;安全做的是约束,不是评分。把两者混成“一个评分卡”,既查不了事故,也挡不住越权。
适用:Agent 运行观测、审计与安全边界设计 | 初稿 2026-10