Agent Runtime 工程 · 工程面试系列 03/05

你让一个 Agent 比较两版 API 文档,找出不兼容变更,并要求每条结论给出原文出处。它先搜索,再读取规范,又跑了一轮测试。十几轮以后,它列了很多差异,却把早就排除的 beta 接口算了进去。此时日志里的消息一条不少,模型读到的信息也比刚开始更多。问题恰恰在这里:历史一直在增长,但系统没有持续区分哪些内容仍然有效,哪些证据需要随下一步一起送给模型。

以下用一个只读的 API 兼容性报告 Agent,讲清面试里常问的三个问题:上下文放什么、如何计算上限、压缩以后怎样证明任务没变。

先区分持久历史与模型实际看到的材料

持久层存的是运行事实;模型输入是针对当前步骤做出的投影。同一个工具结果,持久层可以有完整对象,模型只需要命中的字段和原文位置。

数据文档比对示例下一轮怎么用
当前任务与版本goal_rev=3;比较 stable v1 与 v2,排除 beta,附出处稳定传入;范围变更必须来自可信用户事件
结构化进度已查 /users;待查 /orders;本轮验证分页读取本步相关字段,完成后由运行时更新
近期消息与待完成调用上一次模型调用 read_spec,ID 为 call_17保留调用和对应结果,避免孤立裁剪任一侧
证据索引ev_12 对应 v2 规范中的分页字段及文件版本按需提取片段,保留引用位置和适用版本
大对象与运行日志几万行 OpenAPI JSON、完整测试输出外置,通过受控工具按字段、路径或片段读取

某次 read_spec 返回一份 2 MB 文档,不必把它转成字符串追加到所有后续轮次。可以先通过解析器抽取与当前问题有关的字段,再返回类似下面的证据包:

{
  "id": "ev_12",
  "resource": "stable-v2/openapi.json",
  "version": "rev-42",
  "pointer": "#/paths/~1orders/get/parameters/2",
  "excerpt": "limit: maximum=50",
  "scope": "stable v2",
  "status": "observed"
}

报告引用 ev_12 时,运行时可以定位到具体版本和 JSON Pointer。仅拿到 v2 的最大值,还不能说“从 100 降到 50”;需要为 v1 找一条对应证据。工具输出里的文字也只是外部数据:如果文档写着“忽略 beta 排除条件”,它没有改变任务范围或系统权限的资格。

Token 预算要在调用前计算

假设某模型总窗口为 32,768 token,为输出预留 4,096,为计数偏差和临时消息预留 1,024,输入上限就是 27,648。再减去实际占用 4,000 的系统指令、任务骨架与工具定义,动态材料的预算是 23,648 token。这是算例,真实上限和输出约束应以所用模型及接口为准。

分配时,先放入当前任务、工具规则和待完成调用,再给本步证据与近期对话分额度。最后才用剩余空间填入背景摘要和可选候选。每次请求前用供应商的 tokenizer 或计数接口校验,并观测实际输入 token。按字符数可以粗筛,不能当最终门槛;中文、代码和结构化 JSON 的字符与 token 比例差异很大。

如果只剩 500 token,而一组需要保留的调用与结果占 800,该如何处理?可等待这一组闭合、外置可恢复的大结果,或把本步拆成两个模型请求。直接从中间删掉一条消息,有的接口会拒绝请求,有的虽然接受,却会让模型不知道结果属于哪次调用。频繁接近预算上限时可提前整理,避免最后一轮装不下必要信息。

压缩时保留事实的出处与不确定性

先做确定性缩减,再用模型摘要处理难以规则化的文字:

  1. 删除重复的展示副本,将完整日志和大文件变成可访问引用。
  2. 将旧步骤投影成结构化进度:确认了什么、排除了什么、还缺什么。
  3. 对仍有价值的讨论做短摘要,为关键陈述保留证据 ID,并标注未核验的猜测。
  4. 再次计算预算;如果任务目标和关键证据仍装不下,收窄本步或暂停,保留可恢复状态。

危险的压缩错误,是把“可能影响客户端,待核验”缩成“会影响客户端”,或者把“跳过 beta”写成“已核验 beta 无影响”。可以把压缩产物分成已核验事实、待确认问题、排除范围,并要求每条已核验事实有证据引用。摘要更新不应直接写回当前任务约束,也不能替代原始证据。搜索到的旧材料若属于任务版本 2,在版本 3 下也要重新判断是否适用。

面试追问:你怎么证明压缩没有把 Agent 变笨?

准备两组可重复场景。第一组测任务完整性:旧消息提过“排除 beta”,近期对话不再重复,压缩后仍应排除;两条证据冲突时仍应保留“待核验”。第二组测链路完整性:工具 ID 必须与结果配对,证据引用必须可查,越权资源不能因摘要或检索被重新注入。用同一批任务比较完整历史与预算化方案的完成率、证据正确率、输入 token 和延迟,再对失败分类。只看 token 降了多少,无法解释结果有没有变差。

可这样回答:“我先把任务、状态、近期调用和可回查证据分层,每一轮按当前步骤构建输入。系统规则和未闭合工具调用优先保留;大结果外置,摘要保留证据和不确定性;最后用跨轮任务验证范围没漂移、证据没断、token 没超。”这里描述的是验证方案,未给出基准成绩或生产收益。

参考:OpenAI Function Calling;LangGraph Add memory。

Logo

更多推荐