BP2 · 同质 fork 与并发控制#
定位:面试官追问多 Agent 并行与并发控制时的拷问预备。
核心口述(30 秒)#
“跨平台并行检索不是简单 asyncio.gather(5 × item_search)——每个子任务自己是完整 Agent 循环。fork 出同质子 Agent:共享完整工具集和 prompt,但 depth_gate 硬拦聚合/终结工具。三层并发控制:fork 预算、Semaphore 并发度、树级检索预算。“
拷问链#
Q: 为什么不直接 asyncio.gather(5 × item_search)?#
子 Agent 可能换关键词重搜、查品类常识校准——它自己也是完整 Agent 循环。
Q: 同质但子能调 shopping_summary,怎么办?#
depth_gate 在 depth≥1 硬拦。调了返回 sentinel 消息”你不能用这个,把候选返回”。
Q: 检索预算为什么不用 ContextVar?#
asyncio.create_task 拷贝 context,子 set 父读不到。改 module dict + session_dir 做 key。
Q: ForkBudget 用 ContextVar 为什么能共享?#
ContextVar 拷贝的是引用不是值。父子拿的是同一个 ForkBudget 对象。只有主 loop charge,不存在竞态。
Q: 讨论过确定性并发为什么保留 fork?#
教学架构展示可组合性 + 子遇意外能灵活应对 + fork 安全四层是核心展示点。
Q: _ensure_platform_coverage 为什么需要?#
弱模型(关 reasoning)不听”覆盖全部 5 平台”。机制自动补齐。
Q: 子 Agent 异常拖垮主 loop?#
不会。所有异常 catch 转字符串。gather(return_exceptions=True) 一个炸不连累其余。
压力题#
Q: 同质 fork 是不是过度设计?#
子任务”简单”是事后观察。作为 Agent 它可以在需要时多做几步(换关键词、查品类),Worker 没有这个灵活性。且只维护一份代码。