成本与延迟预算检查 | 从零理解如何构建 AI Agent
帮助你快速判断本章定位、前置要求与学习目标。
这篇解决什么
这篇不是性能优化手册,也不是模型价格对比。它只解决一个生产准入问题:
这个 Agent 在最坏情况下会花多少钱、等多久,超过边界时怎么停下来?如果这个问题答不上来,方案还不能进入生产。
三类预算
| 预算 | 控制什么 | 常见失控点 |
|---|---|---|
| Token 预算 | prompt、上下文、工具结果、最终输出 | 长历史、无效 chunk、工具返回全文 |
| Action 预算 | 搜索次数、网页读取数、工具调用数、重试次数 | 多 query、循环 tool call、盲目 retry |
| Time 预算 | 单步超时、总耗时、排队时间 | 串行网页读取、慢工具、强模型推理 |
只设 token 预算不够。研究型 Agent 往往贵在搜索和读取,工具型 Agent 往往慢在外部系统。
任务预算卡
不同任务必须有不同预算,不要让所有请求共用一套上限。
| 任务 | Token | Action | Time | 超预算处理 |
|---|---|---|---|---|
| 简单问答 | 低 | 0 | 秒级 | 截短输出或要求补充 |
| 知识库问答 | 中 | 1 次检索链路 | 秒级到十秒级 | 降低 TopK 或明确资料不足 |
| 联网研究 | 中到高 | 限制搜索和读取页数 | 可异步或展示进度 | 使用缓存、标注无法确认最新信息 |
| 工具执行 | 中 | 限制工具和重试次数 | 受工具 SLA 约束 | 停止、查状态或转人工 |
| 代码修复 | 高 | 限制文件读取和测试次数 | 可异步 | 展示部分结果并请求继续 |
预算不应该只存在文档里。运行时要能读取预算,并在超过时降级、停止或请求用户确认。
成本路径检查
评审时先画一次调用路径,不要只统计最终模型调用。
router
-> retrieval / search / tool
-> rerank / reader
-> main model
-> retry / fallback| 层 | 检查问题 |
|---|---|
| 模型 | 是否所有任务都用了强模型 |
| 上下文 | 是否塞入无关历史、无效 chunk 或工具全文 |
| RAG | TopK、rerank、filter 是否有上限 |
| Search | 搜索次数、读取页数、缓存策略是否明确 |
| Tool | 单步超时、重试次数、副作用状态是否明确 |
| Loop | 是否有最大轮数和停止条件 |
如果估算不出数量级,说明架构边界还没清楚。
延迟策略
同样是 30 秒,用户感受不同。选型时要决定哪些任务同步返回,哪些任务异步执行。
| 场景 | 处理 |
|---|---|
| 普通问答 | 快速返回,超时直接降级 |
| 联网研究 | 展示进度、来源和读取状态 |
| 工具执行 | 展示状态、确认点和结果通知 |
| 代码修复 | 异步执行,展示 diff 和测试结果 |
复杂 Agent 如果强行同步阻塞,会让用户以为系统卡死。
成本估算方法
上线前必须能算出数量级,不需要精确到分,但必须知道是"几分钱"还是"几块钱"。
Token 成本公式
单次请求 token 成本 =
input_tokens × input_price_per_1k / 1000
+ output_tokens × output_price_per_1k / 1000
+ embedding_tokens × embedding_price_per_1k / 1000
+ rerank_tokens × rerank_price_per_1k / 1000典型组件成本量级(以 GPT-4o 和主流 embedding 为基准,仅供数量级参考):
| 组件 | 每千次请求成本量级 | 常见失控点 |
|---|---|---|
| LLM 主模型 | $1–$10 | 上下文过长、强模型用于分类 |
| Embedding | $0.01–$0.1 | 重复 embedding、未缓存 |
| Reranker | $0.1–$1 | TopK 过大、每次都 rerank |
| Search API | $0.5–$5 | 无限制搜索次数、每步都搜索 |
| 工具调用 | 取决于工具 | 重试风暴、循环 tool call |
会话累计成本
多轮会话不能只看单次:
会话成本 =
Σ 每轮 token 成本
+ Σ 工具调用成本
+ 历史压缩产生的额外 token如果历史全量注入而不是摘要,会话越长 token 越贵。长对话必须有历史截断或摘要策略。
各层延迟组成
把延迟视为各层时间之和,才能找到真正的瓶颈。
同步链路典型延迟
| 层 | p50 量级 | p95 量级 | 常见瓶颈 |
|---|---|---|---|
| 路由判断 | 10–50 ms | 100–300 ms | 规则路由快,模型路由慢 |
| Embedding | 50–200 ms | 300–500 ms | 模型部署位置、批量化 |
| 向量检索 | 10–100 ms | 200–500 ms | 索引规模、filter 复杂度 |
| Rerank | 100–500 ms | 500–2000 ms | 候选数量、模型规模 |
| LLM 主模型 | 1–5 s | 5–15 s | 上下文长度、模型规模 |
| 工具调用(外部) | 200 ms–5 s | 2–20 s | 外部系统 SLA |
| Search API + Reader | 1–5 s | 5–30 s | 串行读取页数 |
找瓶颈的方法
总延迟 = Σ 各层 p50 延迟
如果总延迟已超用户可接受值,先看最慢的一层:
-> 能并行的变并行(多路检索、多个 tool 并行)
-> 能缓存的加缓存
-> 能异步的改异步
-> 不需要的层删掉不要盲目优化模型延迟,先确认真正的瓶颈在哪里。串行读取五个网页往往比一次 LLM 推理更慢。
缓存策略
缓存是降低成本和延迟最直接的手段,但必须按层设计。
缓存类型
| 类型 | 命中条件 | 适合 | 注意 |
|---|---|---|---|
| 完全匹配缓存 | 查询字符串相同 | FAQ、重复查询 | 不处理同义表达 |
| 语义缓存 | 向量相似度 > 阈值 | 近似问题 | 阈值要保守,别用错缓存 |
| 检索结果缓存 | 同查询+同权限 | 知识相对稳定的场景 | 权限变化后必须失效 |
| 工具结果缓存 | 同参数+TTL 内 | 只读查询、实时性不高 | 写操作禁止缓存 |
| Embedding 缓存 | 同文本 | 固定文档集 | 模型版本变化后失效 |
缓存成本建模
实际成本 = 计算成本 × (1 - 缓存命中率)
例:embedding 成本 $0.05/千次请求
缓存命中率 60% → 实际成本 $0.02/千次请求
缓存命中率 90% → 实际成本 $0.005/千次请求缓存对 Embedding 和 Search API 成本影响最显著,对 LLM 主模型影响次之(实时答案很难缓存)。
缓存的局限
- 实时性要求高的场景不适合缓存;
- 权限相关查询必须按用户权限分桶缓存,不能跨权限共享;
- 语义缓存相似度阈值设太低会返回错误答案;
- 写操作和副作用操作不能缓存。
同步与异步的成本边界
并不是所有任务都适合同步等待结果。
| 任务类型 | 建议模式 | 原因 |
|---|---|---|
| 简单问答 | 同步 | 延迟 < 5s,用户可等 |
| 联网研究(>3 页) | 异步 + 进度 | 可能 30s+,强制同步体验差 |
| 代码修复 | 异步 + Diff 展示 | 耗时不可预测 |
| 批量处理 | 后台任务 | 不适合交互等待 |
| 工具审批流程 | 等待确认 | 需要人工介入 |
异步任务成本更可控:可以降低超时配置、减少并发占用、批量化工具调用。但异步需要额外的状态持久化和通知机制。
监控与告警阈值
生产 Agent 至少要有这些指标和告警:
| 指标 | 告警阈值建议 | 超标意味着 |
|---|---|---|
| 单次请求 token 用量 | > 预算 80% | 上下文膨胀或路由错误 |
| 单次请求成本 | > P95 的 2 倍 | 异常输入或工具循环 |
| 会话累计成本 | > 设定上限 | 长对话失控或重试风暴 |
| 搜索 / 工具调用次数 | > 预设上限 | 工具调用循环 |
| P95 端到端延迟 | > SLA 的 1.5 倍 | 外部服务慢或链路过长 |
| Fallback 率 | > 5% | 降级策略频繁触发,需查原因 |
| Cache 命中率 | < 预期值 30% 以上 | 缓存策略失效或查询多样化 |
这些指标应该分 task_type 统计,不要把所有任务合并成一个数字。分类任务和代码修复任务的成本基线完全不同。
准入检查
进入生产前至少回答:
- 单次请求最多花多少 token、动作和时间;
- 多轮会话累计预算怎么限制;
- 哪些搜索、读取、schema 和工具结果可以缓存;
- 什么任务可以降级模型;
- 超预算后是停止、降级、转人工,还是请求用户确认;
- trace 里是否能看到每层 token、耗时、工具次数和 fallback 次数;
- 是否有成本和延迟告警,阈值是多少;
- 异步任务是否有状态持久化和超时处理。
没有预算的 Agent 方案,本质上还没有进入生产设计。
最终判断
Token 超限:裁剪上下文
Action 超限:停止工具链路
Time 超限:降级或异步
Search 超限:缓存或说明无法确认
Tool 超限:查状态,不盲目重试
成本不明:不能上线
缓存未设计:延迟和成本会超预期
告警未配置:问题发现太晚成本与延迟不需要单独复杂化,但必须成为生产准入检查项。