BP1 · AgentLoop 主循环与终止安全#
定位:面试官追问 Agent 主循环与终止机制时的拷问预备。
核心口述(30 秒破冰)#
“主循环是 Think→Act→Observe→Reflect 有状态循环,不写死步数,模型自判够了就调终结性工具收尾。但弱模型不遵守——Flash 做子 Agent 时不停重搜或自行出推荐。所以四层机制兜底:深度闸、超时+迭代、截断、循环检测。后期从固定链路改成意图驱动——planner 输出 tasks,模型按需组合工具子集。“
拷问链#
Q: recursion_limit 为什么是 MAX_ITERATIONS × 2 + 1?#
LangGraph 按 super-step 计数,一轮 Think→Act = 两个 super-step,+1 最终响应。设 30 只能跑 15 轮。
Q: 循环检测为什么是软提示不硬停?#
5 个平台各搜一次 = 5 次同名调用,不是循环。滑动窗口(6,4)区分”正常多平台”和”打转”。软的不行有超时硬的兜底。
Q: 终结纪律的 retry_nudge 为什么必须当轮重发?#
模型没产 tool_call → 框架判定”该结束了”→ 没有下一轮。只能在同一次 awrap_model_call 里追加提示重发。子 Agent 不受约束——子的正常收尾就是吐文字返回。
Q: 哨兵拦截 vs 摘工具,浪费一次 tool_call 值吗?#
摘工具破坏 prompt cache 前缀。cache miss ~11000 token vs 无效 tool_call ~50 token。做过 A/B:摘工具版延迟更低(65s vs 79s)但 cache 命中率不可预测。长对话选保 cache。
Q: 意图驱动后安全闸会不会因为自由度增大失控?#
不会——安全闸和流程正交。放开的是”哪些可选步骤”,没动失控防护。fork 深度闸/预算/超时全不变。“轻推荐”反而更省——少跑工具撞闸概率更低。
Q: planner 本身是 LLM 调用,不增加延迟吗?#
增加约 1-2 秒。但现在做了确定性预置——开局第一轮几乎 100% 调 planner,直接预置省掉一轮 LLM 往返。
Q: 为什么不用 LangGraph StateGraph 做控制?#
StateGraph 适合确定性条件分支。Hook 适合横切关注点(每个工具调用都检查的通用逻辑)。两者正交。
压力题#
Q: 这不就是个 Workflow 披了 Agent 的皮吗?#
早期确实半 Workflow——prompt 和哨兵都隐含固定链。但流程次序没有一行代码强制。真 Workflow 是 r = search(); c = compare(r) 焊死在代码里。这里是 create_agent(FULL_TOOL_SET) + ainvoke(),模型完全可以跳步。改意图驱动后更明显——品类查询只走 2 步。
Q: 四层机制会不会太保守,Agent 还没做完就被掐掉?#
有一个补搜闸场景:item_picker 返回空 → 回到 SEARCHING 补搜。补搜闸加了 must_have 质量信号——有候选却没一个满足约束时才触发,不是无脑回退。