10 · 性能与推理服务面试题¶
对应学习章:10 · 性能、预算与推理服务。本页收录 Q084–Q086,围绕完整任务的耗时、缓存与共享资源展开。
首字很快、报告很慢,两位 Worker 还各说自己没有超预算。前者要画依赖图,后者要共用一本账;本组题检查优化省掉了哪段工作,以及费用究竟记在谁名下。
Q084 怎样定位 Agent 的延迟瓶颈,为什么加 Worker 未必更快?¶
优先级:P0
30–60 秒回答:
我先画模型与工具的数据依赖图,再记录入队、模型开始、首 token、工具起止和任务终态。只有独立节点才能并行,完整延迟由关键路径和资源限制共同决定。规划 200ms、两路读取 300/500ms、综合 400ms,理想并行下界是 1100ms,串行是 1400ms;真实服务还含排队、限流和重试。应同时看质量、端到端延迟、吞吐与费用,首字快不等于任务完成快。
展开详细答案、追问与案例
详细答案:
先确定计时对象。用户等完整报告,模型服务可能只报首 token,工具平台可能只报单次读取;把这些数直接混在一起会误判。为同一运行记录入队、开始处理、模型调用、首 token、工具起止和最终交付,失败与重试同样保留。统计 p95 时说明是请求、模型调用还是任务,以及未完成任务怎样处理,才有可比较的口径。
再画真实依赖。规划完成后两路读取可独立运行,综合必须等它们都结束,耗时下界为 200+max(300,500)+400=1100ms,串行为 200+300+500+400=1400ms。这个计算假设固定耗时、无限可用 Worker 和无调度开销。若 B 必须使用 A 返回的对象 ID,就不能套用并行图;多雇一个 Worker 也拿不到尚未产生的输入。
找瓶颈时看资源竞争。增加并发可能挤满数据库连接、搜索配额、模型 token 限额或 KV 容量,引入排队与重试。工具平均耗时降低也可能伴随尾部延迟变差。应分别测在途请求、队列等待、限流和失败,把可并行程度与下游承受能力一起评估;汇总方处理不过来时,用背压暂停新增工作。
优化从一个主要因素开始。可以先并行独立读取,再压缩冗余工具返回或减少不必要模型调用,每次保留相同任务、版本和质量门槛。托管服务要处理配额、429 与退避;自部署还需模型装载、KV 管理与调度。吞吐、首 token、生成速度和任务完成延迟存在取舍,最终选择应符合实际交付目标,而不是只优化最好看的看板。
常见追问:
- 为什么线上 p95 大于关键路径? 下界忽略排队、资源竞争、网络与重试,线上还存在任务差异;应测各阶段分布再定位。
- 流式输出算不算优化? 可改善可感知响应时间,但未必缩短完整任务,需分别报告首字与终态时间。
- 下游限流时继续加并发呢? 可能增加失败和退避,应限制在途量、按期限排队,必要时减少非关键探索。
实战案例:
教学案例把两路政策读取改成并行后,数据库连接耗尽,报告反而更慢。处理时保留独立读取,限制共享连接并记录排队时间,综合仍等待必要证据。验收先复算 1100ms 理想下界,再用阶段日志解释实际延迟;比较表包含限流、重试和质量,不把脚本计算的下界写成真实并发测量。
常见误区:
把独立节点数量当成可无限并发;拿首 token 代表完整延迟;只统计成功请求;把理想 DAG 下界当作线上性能承诺。
微练习:
运行 python3 examples/advanced/runtime_lab.py --scenario budget,再给读取 B 加上依赖 A。验收算出两种依赖下的关键路径,标明资源假设,并设计至少五个真实服务计时点。
学习章与参考: 学习章 10 · 本地预算与关键路径实验 · PagedAttention 论文
Q085 KV / 前缀缓存与检索、工具、答案缓存有什么区别?¶
优先级:P1
30–60 秒回答:
它们缓存不同层次。KV / 前缀缓存复用模型已处理前缀的中间表示,检索缓存保存候选或排序,工具缓存保存读取结果,答案缓存直接复用交付内容。前缀缓存主要减少共享前缀的 prefill,新的 decode 仍要计算;不能说命中后整次任务免费。每层要按模型、参数、索引版本、时效和用户权限设计键与失效,尤其防止跨租户复用敏感结果。
展开详细答案、追问与案例
详细答案:
先问复用的是计算还是业务结果。模型 KV 保存 token 的中间表示,跨请求前缀缓存利用相同前缀省去部分重复处理;检索缓存则复用某查询的候选与排序。工具结果缓存可能返回某对象状态,最终答案缓存直接交付旧答案。前者通常仍要继续推理,后者可能省掉整条路径,正确性和失效条件因此明显不同。
以自动前缀缓存为例,主要收益在共享前缀的 prefill,新生成 token 的 decode 仍需计算。长输出、前缀重复少或缓存频繁逐出时,整体收益可能有限。稳定公共前缀有助复用,却不能为了命中率把不必要或敏感内容放进所有请求。PagedAttention 解决动态 KV 内存组织与碎片等问题,也不是保存上次完整答案,需避免把内存管理和业务响应缓存混成一件事。
再为业务缓存定义合同。检索键要考虑索引、过滤、有效日期和用户可见域;工具读取要考虑参数、对象版本和新鲜度;答案还依赖问题等价性、证据和业务规则。写入结果不能随意当作可重放的读取缓存。权限在读取原始结果和复用缓存时都要成立,文本相同并不证明两位用户有相同访问范围。
验证同时看命中收益与错误复用。固定任务后比较延迟、缓存命中、证据版本和质量,注入政策更新、权限撤销与租户切换。自部署缓存配置还要考虑占用、逐出和并发;托管计费需按相应合同理解,不能由计算复用直接推导免费。缓存是减少重复工作的机制,不是绕过新鲜度与授权检查的捷径。
常见追问:
- 查询字符串相同就能复用检索结果吗? 不够,还需匹配索引、时间、过滤与可见域,或在复用前重新验证访问范围。
- 前缀命中会提升 decode 吗? 它主要省共享前缀处理,新 token 生成仍需计算;端到端收益取决于各阶段占比。
- 缓存 key 带租户 ID 就完成隔离了吗? 还要控制底层访问、更新与权限变化,检查键构造和所有复用入口,不能只靠一个字段名称。
实战案例:
教学案例两位用户问相同政策,检索缓存只按问题文本命中,第二位读到第一位专属附件。处理时按可见域、版本与日期设计缓存合同,在复用时落实对象权限。验收进行租户切换与撤权测试,敏感片段不能进入后续上下文;另测公共前缀复用时,把 prefill 和生成耗时分别记录,避免混淆收益来源。
常见误区:
把 KV 当作完整答案缓存;认为命中就没有生成成本;只设置 TTL 不处理权限变化;把相似问题等同于可共享答案。
微练习:
为四层缓存分别写键、失效事件和一个错误复用样例。验收至少覆盖模型切换、索引更新、对象变化、租户切换,并说明每层命中后还需执行哪些检查。
学习章与参考: 学习章 10 · vLLM Automatic Prefix Caching · PagedAttention
Q086 多分支 Agent 怎样控制共享预算,并设计模型升级与降级?¶
优先级:P0
30–60 秒回答:
主任务需要共享账本,包含调用量、预估与实际 token、费用和总期限。分支派发前原子预留,结束后结算,重试同样消耗预算,取消后未确认用量不能直接释放。总额 1000,A 预留 600,B 要 500 就应拒绝或重规划。模型升级依据缺字段、证据冲突、校验失败等可验证信号;降级只能减少合同允许的探索,不能悄悄牺牲必要证据或授权检查。
展开详细答案、追问与案例
详细答案:
先把预算定义为整个任务的资源合同。除费用,还要限制模型和工具调用、token、总期限与在途请求。每个分支不能维护自己的余额副本;多服务实例需一致性存储或原子预留,保证同时申请时不会超分。稳定预留 ID 可识别重放,同 ID 改额度应进入冲突处理,不能重复扣账或静默改变原意。
额度流程包含预留、实际计量、结算和释放。A 预留 600 后总额 1000 只剩 400,B 要 500 应拒绝、缩小或等待。失败和重试也会产生成本;取消只代表控制意图,已提交调用可能继续运行,因此保留待结算用量并与提供方计量对账。局部工具超时重试必须服从主任务剩余期限,不能每次重新领取完整时间。
模型路由先用能验证的触发条件。有限类别分类和字段提取可以尝试轻量路径,跨文档冲突、缺关键字段或证据校验失败可升级。模型自称有信心不是通用可靠依据;升级后还要核算两次调用、上下文传递和误路由成本。更强模型无法读取尚未入库的条文,数据缺口应补资料而非无限升级。
高负载时用有界队列和背压,在昂贵执行前挡住超量请求。可减少非关键候选或探索,产品允许时交付明确的部分结果;若完整证据是硬要求,就转为未完成或请求补充。评测同时展示质量门槛、成功成本、排队与退步样本。预算控制的目标是让系统遵守合同,不是为了省一次调用就把不确定结论交给用户。
常见追问:
- 本地字典能做共享预算吗? 可演示顺序机制,不能支撑多进程原子预留;真实多实例需要共享且一致的控制点。
- 取消分支为什么不马上释放? 远端可能尚未停下,立即释放会让新调用与旧费用同时发生,应待确认或按明确规则结算。
- 小模型输出格式合法就不用升级吗? 格式只是一个条件;证据冲突、覆盖不足和业务规则失败仍需处理,不能用 schema 通过代替正确。
实战案例:
教学案例两位 Worker 都读到余额 1000,各申请 600。处理时改为主任务原子预留,第二笔拒绝后重规划为 400,并给两路传递同一截止时间。验收账本总预留不超过 1000、重放同 ID 不重复扣额、取消中调用保留待结算状态;简单路径缺证据时应停止交付或升级,不能仅给出自信回答。
常见误区:
每个 Worker 单独限额却认为总额受控;失败调用不计费;取消等于退款;用模型自评分作为唯一升级条件。
微练习:
运行预算实验,写出 600+500 被拒、600+400 被接受的账本,再模拟取消但远端未结束。验收区分预留、已用和待结算,并设计一条升级条件及一条产品允许的降级路径。
学习章与参考: 学习章 10 · 本地预算实验及其并发边界 · Anthropic 上下文工程