本文目录29 个章节
第 8 章:生产部署、性能、成本与安全
一个 Agent Demo 只需成功一次;生产系统必须在并发、限流、依赖故障、恶意输入和版本变化下持续工作。招聘中出现的高可用、低延迟、Token 成本、沙箱、权限和可观测性,最终都汇聚到这一章。
1. 参考架构
Client
-> API Gateway / Auth / Rate Limit
-> Agent API
-> Run Store / Checkpoint DB
-> Queue -> Agent Workers
-> Model Gateway
-> Retrieval Service -> Vector DB / Search
-> Tool Gateway -> Business APIs
-> Approval Service
-> Trace / Metrics / Audit关键分离:
- HTTP 接入与长任务 Worker 分离;
- 模型供应商通过 Gateway 适配;
- Tool Gateway 统一权限、超时和审计;
- Trace 与业务审计分开存储;
- Checkpoint 使用持久化数据库;
- 高风险代码执行放在独立沙箱。
2. 先做延迟预算
假设产品要求 P95 在 8 秒内:
鉴权与路由 0.2s
查询改写 0.8s
并行检索 0.7s
Rerank 0.6s
模型决策 1.2s
工具调用 1.0s
最终生成 2.5s
网络/排队余量 1.0s
合计 8.0s没有预算就无法判断该优化哪里。总延迟不是简单平均值,串行链路相加、并行链路取最大值,还要考虑排队和长尾。
🔥 P0 高频必会:如何降低 Agent 延迟?
先用 Trace 分解延迟;减少串行模型调用;并行独立检索/工具;缩短上下文;缓存 Embedding、检索和安全结果;用小模型做路由;流式输出;设置超时和降级;控制队列与并发。不能只说“换更快模型”。
3. 并发、背压与队列
如果入口每秒 100 个请求,而模型下游只能稳定处理 30 个,系统必须做背压:
- 入口限流;
- 队列长度上限;
- 每租户配额;
- Worker 并发上限;
- 超过等待时间后拒绝或降级;
- 优先级队列用于关键任务;
- 批处理 Embedding 或推理请求。
无限队列只是把故障推迟,并会使延迟无限增长。需要显式拒绝策略和可观察的队列等待时间。
4. 模型网关
Model Gateway 统一处理:
- 供应商和模型路由;
- 认证密钥;
- 超时、重试、限流;
- Token/成本统计;
- Prompt/参数标准化;
- 内容安全;
- 缓存;
- 降级和熔断;
- 供应商故障切换。
模型切换并非透明。不同模型的 Tool Schema、上下文、结构化输出和安全行为可能不同,必须通过同一评测集验证后切流。
5. 缓存设计
| 缓存 | Key | 失效条件 | 风险 |
|---|---|---|---|
| Embedding | 文本哈希 + 模型版本 | 模型升级/文本变化 | 新旧向量混用 |
| 检索结果 | 查询 + Filter + 索引版本 | 文档更新/权限变化 | 过期或越权数据 |
| Prompt 结果 | 完整规范输入 + 配置版本 | Prompt/模型/数据变化 | 非确定输出被错误复用 |
| Tool 只读结果 | 用户/租户 + 参数 | 业务 TTL | 跨租户泄露 |
| 权限决策 | 主体 + 资源 + 动作 + 策略版本 | 权限变更 | 撤权后仍命中 |
缓存 Key 必须包含租户、权限和版本。对写操作不能用普通响应缓存替代幂等存储。
6. 成本模型
单任务成本可近似为:
模型成本 = Σ(输入 Token × 输入单价 + 输出 Token × 输出单价)
工具成本 = 外部 API / 数据库 / 搜索调用成本
基础设施 = CPU/GPU、存储、网络、Trace
人工成本 = 审批与异常处理
成功任务成本 = 总成本 / 成功完成任务数“每请求成本下降”不一定是好事,如果任务成功率也下降。优化应同时看质量。
成本手段:
- 小模型做路由和抽取;
- 大模型只处理复杂决策;
- 减少重复工具 Schema;
- 上下文去重和压缩;
- Prompt/上下文缓存;
- 并行而不是重复串行尝试;
- 限制最大步骤;
- 对低价值请求使用确定性逻辑。
🔥 P0 高频必会:如何在不明显降质的情况下降成本?
先建立固定 Eval;按任务难度路由模型;减少无关上下文和重复调用;缓存稳定前缀/检索;小模型处理分类;设置步骤预算;每项优化都比较成功任务成本,而不是只看 Token。
7. 超时、熔断和降级
from dataclasses import dataclass
from time import monotonic
@dataclass
class CircuitBreaker:
failure_threshold: int = 5
reset_after_seconds: float = 30
failures: int = 0
opened_at: float | None = None
def allow(self) -> bool:
if self.opened_at is None:
return True
if monotonic() - self.opened_at >= self.reset_after_seconds:
self.failures = 0
self.opened_at = None
return True
return False
def record_failure(self) -> None:
self.failures += 1
if self.failures >= self.failure_threshold:
self.opened_at = monotonic()
def record_success(self) -> None:
self.failures = 0
self.opened_at = None真实熔断器还需要并发安全、半开状态和指标。降级策略示例:
- Reranker 故障:回退到 Hybrid 排序;
- 主模型故障:切换经评测的备用模型;
- 写工具故障:保存草稿,不假装成功;
- 向量库故障:提示知识检索暂不可用,不凭模型记忆编答案;
- Trace 后端故障:核心业务可继续,但本地缓冲且安全审计不可丢。
8. 部署与健康检查
最小 Dockerfile:
FROM python:3.12-slim
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN pip install --no-cache-dir uv && uv sync --frozen --no-dev
COPY app ./app
USER 10001
CMD ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]生产还要:
- 非 root 用户;
- 固定依赖锁;
- 镜像扫描;
- Secret 不进镜像;
- Readiness 与 Liveness 分开;
- 优雅停机,停止接单后完成/保存进行中 Run;
- 数据库迁移可回滚;
- 资源 Requests/Limits;
- Checkpoint 和队列外置。
健康检查不要真的调用昂贵模型。Liveness 只证明进程活着;Readiness 检查关键本地依赖和是否能接收任务。
9. 灰度与版本管理
一次 Agent 发布可能同时变更:
- Prompt;
- 模型;
- Tool 描述或 Schema;
- 图结构;
- 检索/Embedding/Rerank;
- 安全策略。
尽量一次只改变一个主要变量。每个 Run 记录配置快照。发布流程:离线回归 → 影子流量 → 小比例灰度 → 指标比较 → 扩大 → 可快速回滚。
旧 Checkpoint 可能不能兼容新图结构,需要版本路由或迁移,不要让正在等待审批的 Run 被新版本破坏。
10. Agent 威胁模型
OWASP 2026 Agentic Top 10 包括目标劫持、工具滥用、身份与权限滥用、供应链、意外代码执行、记忆污染、不安全 Agent 通信、级联失败、人机信任利用和 Rogue Agents。参见 OWASP Top 10 for Agentic Applications 2026。
10.1 Prompt Injection
直接注入来自用户;间接注入来自网页、文档、邮件、工具结果。防护是组合措施:
- 外部内容标记为不可信数据;
- 指令与数据分离;
- Tool 最小权限;
- 高风险动作审批;
- 输出/参数验证;
- 只允许必要网络和资源;
- 注入测试集;
- 不让模型读取密钥。
🔥 P0 高频必会:Prompt Injection 能靠 Prompt 完全解决吗?
不能。Prompt 是软约束。核心防线是最小权限、工具允许列表、数据/指令隔离、Schema 校验、沙箱、审批、网络限制和监控。
10.2 Excessive Agency
OWASP 将过度代理描述为模型拥有过多功能、权限或自治,可能因幻觉或注入执行破坏性动作。缓解:
- 减少可用工具和功能;
- 使用最小权限凭据;
- 把高风险决策留给代码/人;
- 限制步骤、金额、对象和速率;
- 写工具先草稿后提交;
- 独立审计所有副作用。
10.3 数据泄露
- 检索前 ACL;
- 多租户隔离;
- 日志脱敏;
- 不把敏感上下文发送给不合规模型;
- 输出 DLP;
- 短期 Token 和 Secret Manager;
- 用户数据的保留与删除策略。
10.4 代码执行
绝不能在主服务进程中直接 eval 模型代码。沙箱应具备:
- 独立容器/微虚机;
- 无默认网络;
- 只读基础文件系统;
- 临时工作目录;
- CPU、内存、进程数、文件大小和时间限制;
- 禁止宿主 Socket、凭据和云元数据;
- 依赖允许列表;
- 执行审计与销毁。
🔥 P0 高频必会:Docker 是否等于安全沙箱?
不等于。容器共享宿主内核,错误的特权、挂载、Socket 或 Capability 会突破边界。高风险不可信代码应考虑更强隔离,并关闭网络、最小权限、资源限制、Seccomp/AppArmor 与临时环境。
11. 身份与权限
三类身份必须区分:
- 真实用户;
- Agent/服务身份;
- 下游系统凭据。
Agent 不应拥有超过用户的业务权限。采用:
- 用户委托或 on-behalf-of;
- 每 Tool Scope;
- 资源级 ACL;
- 短期凭据;
- Token Audience 校验;
- 权限决策由服务端完成;
- 审计“谁通过哪个 Agent 对什么资源做了什么”。
12. 审计与隐私
安全审计需要不可抵赖的关键事件:
- 用户/服务身份;
- 动作、资源、参数摘要;
- 决策策略版本;
- 审批人和时间;
- 工具结果状态;
- 幂等键;
- Trace ID。
但审计不等于保存全部敏感内容。使用字段级脱敏、哈希引用和受控原文存储,规定保留期。
13. 故障演练
至少演练:
- 模型供应商 429/5xx;
- 向量库超时;
- Tool 成功但响应丢失;
- Checkpoint 数据库重启;
- 队列积压;
- 恶意文档间接注入;
- 备用模型格式不兼容;
- Trace 后端不可用;
- 用户在审批前取消。
每个演练记录:预期行为、实际行为、数据是否重复/丢失、恢复时间和改进项。
14. 本章练习
练习 A:延迟与成本预算
给综合项目制定 P95 目标和每阶段预算。用 Trace 验证,优化前后同时报告成功率、延迟和成本。
练习 B:安全 Tool Gateway
实现每 Tool Scope、风险等级、租户过滤、审批、幂等、速率限制和审计。构造越权与重复请求测试。
练习 C:故障注入
随机让模型、检索和 Tool 出现超时/5xx。系统必须有限重试、正确降级、没有重复副作用,并输出故障报告。
15. 面试高频问答
🔥 P0:如何设计高可用 Agent 系统?
无状态 API 与持久化 Checkpoint;队列和 Worker;下游超时、有限重试、熔断、降级;幂等 Tool;模型网关和经评测备用模型;可观测、灰度、回滚和故障演练。
🔥 P0:如何保证多租户数据隔离?
身份在入口验证;tenant_id 从可信上下文注入;数据库行级/Schema 隔离;检索前 Metadata ACL;缓存 Key 带租户和权限版本;Tool 再鉴权;日志脱敏;跨租户测试。
🔥 P0:Agent 写操作超时后怎么办?
不能直接换新幂等键重试。用原幂等键查询执行状态;若下游支持幂等则安全重试;状态不明时进入人工/补偿流程;保存审计。要区分“请求失败”和“业务动作失败”。
⭐ P1:模型降级为什么需要重新评测?
模型在结构化输出、工具选择、上下文长度、语言、安全和采样行为上不同。备用模型必须对同一黄金集和安全集通过门禁,且 Tool/Prompt 适配版本明确。
⭐ P1:怎样安全地记录 Prompt 和输出?
分类数据敏感度;默认脱敏;密钥绝不记录;正文可存受控对象存储并在 Trace 留引用;限制访问和保留期;支持用户删除;审计访问日志;生产采样而非全部永久保存。
16. 本章完成标准
- 能画出生产架构并说明每层故障策略;
- 有延迟预算、成功任务成本和容量限制;
- 缓存包含租户、权限和版本;
- 写工具具备幂等、审批和审计;
- 能说明 OWASP Agentic 主要风险及防线;
- 有灰度、回滚和故障注入记录;
- 不把 Prompt 或 Docker 当作唯一安全边界。
REFERENCES
参考链接
所属系列
AI Agent 开发学习与面试指南