Skip to content

成本与延迟预算检查 | 从零理解如何构建 AI Agent

帮助你快速判断本章定位、前置要求与学习目标。

这篇解决什么 ​

这篇不是性能优化手册,也不是模型价格对比。它只解决一个生产准入问题:

text
这个 Agent 在最坏情况下会花多少钱、等多久,超过边界时怎么停下来?

如果这个问题答不上来,方案还不能进入生产。

三类预算 ​

预算控制什么常见失控点
Token 预算prompt、上下文、工具结果、最终输出长历史、无效 chunk、工具返回全文
Action 预算搜索次数、网页读取数、工具调用数、重试次数多 query、循环 tool call、盲目 retry
Time 预算单步超时、总耗时、排队时间串行网页读取、慢工具、强模型推理

只设 token 预算不够。研究型 Agent 往往贵在搜索和读取,工具型 Agent 往往慢在外部系统。

任务预算卡 ​

不同任务必须有不同预算,不要让所有请求共用一套上限。

任务TokenActionTime超预算处理
简单问答低0秒级截短输出或要求补充
知识库问答中1 次检索链路秒级到十秒级降低 TopK 或明确资料不足
联网研究中到高限制搜索和读取页数可异步或展示进度使用缓存、标注无法确认最新信息
工具执行中限制工具和重试次数受工具 SLA 约束停止、查状态或转人工
代码修复高限制文件读取和测试次数可异步展示部分结果并请求继续

预算不应该只存在文档里。运行时要能读取预算,并在超过时降级、停止或请求用户确认。

成本路径检查 ​

评审时先画一次调用路径,不要只统计最终模型调用。

text
router
  -> retrieval / search / tool
  -> rerank / reader
  -> main model
  -> retry / fallback
层检查问题
模型是否所有任务都用了强模型
上下文是否塞入无关历史、无效 chunk 或工具全文
RAGTopK、rerank、filter 是否有上限
Search搜索次数、读取页数、缓存策略是否明确
Tool单步超时、重试次数、副作用状态是否明确
Loop是否有最大轮数和停止条件

如果估算不出数量级,说明架构边界还没清楚。

延迟策略 ​

同样是 30 秒,用户感受不同。选型时要决定哪些任务同步返回,哪些任务异步执行。

场景处理
普通问答快速返回,超时直接降级
联网研究展示进度、来源和读取状态
工具执行展示状态、确认点和结果通知
代码修复异步执行,展示 diff 和测试结果

复杂 Agent 如果强行同步阻塞,会让用户以为系统卡死。

成本估算方法 ​

上线前必须能算出数量级,不需要精确到分,但必须知道是"几分钱"还是"几块钱"。

Token 成本公式 ​

text
单次请求 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–$1TopK 过大、每次都 rerank
Search API$0.5–$5无限制搜索次数、每步都搜索
工具调用取决于工具重试风暴、循环 tool call

会话累计成本 ​

多轮会话不能只看单次:

text
会话成本 =
  Σ 每轮 token 成本
  + Σ 工具调用成本
  + 历史压缩产生的额外 token

如果历史全量注入而不是摘要,会话越长 token 越贵。长对话必须有历史截断或摘要策略。

各层延迟组成 ​

把延迟视为各层时间之和,才能找到真正的瓶颈。

同步链路典型延迟 ​

层p50 量级p95 量级常见瓶颈
路由判断10–50 ms100–300 ms规则路由快,模型路由慢
Embedding50–200 ms300–500 ms模型部署位置、批量化
向量检索10–100 ms200–500 ms索引规模、filter 复杂度
Rerank100–500 ms500–2000 ms候选数量、模型规模
LLM 主模型1–5 s5–15 s上下文长度、模型规模
工具调用(外部)200 ms–5 s2–20 s外部系统 SLA
Search API + Reader1–5 s5–30 s串行读取页数

找瓶颈的方法 ​

text
总延迟 = Σ 各层 p50 延迟

如果总延迟已超用户可接受值,先看最慢的一层:
  -> 能并行的变并行(多路检索、多个 tool 并行)
  -> 能缓存的加缓存
  -> 能异步的改异步
  -> 不需要的层删掉

不要盲目优化模型延迟,先确认真正的瓶颈在哪里。串行读取五个网页往往比一次 LLM 推理更慢。

缓存策略 ​

缓存是降低成本和延迟最直接的手段,但必须按层设计。

缓存类型 ​

类型命中条件适合注意
完全匹配缓存查询字符串相同FAQ、重复查询不处理同义表达
语义缓存向量相似度 > 阈值近似问题阈值要保守,别用错缓存
检索结果缓存同查询+同权限知识相对稳定的场景权限变化后必须失效
工具结果缓存同参数+TTL 内只读查询、实时性不高写操作禁止缓存
Embedding 缓存同文本固定文档集模型版本变化后失效

缓存成本建模 ​

text
实际成本 = 计算成本 × (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 方案,本质上还没有进入生产设计。

最终判断 ​

text
Token 超限:裁剪上下文
Action 超限:停止工具链路
Time 超限:降级或异步
Search 超限:缓存或说明无法确认
Tool 超限:查状态,不盲目重试
成本不明:不能上线
缓存未设计:延迟和成本会超预期
告警未配置:问题发现太晚

成本与延迟不需要单独复杂化,但必须成为生产准入检查项。