数据截至 (上游 commit 1c4253f6774b)
编排主循环:主 Agent、子 Agent 与工具调用的核心节奏
30 秒导读: MiroThinker 这个名字里的价值,几乎全在这一章。深度研究不是"问一次答一次",而是"让一个 Agent 连着做几百次工具交互——搜一下、读一下、想一下、再搜一下——直到把问题啃透"。这个"连着做"的引擎,就是
Orchestrator里的一个while循环。本章拆开它:一轮 turn 里发生什么、一次工具调用怎么端到端跑完、主循环怎么在遇到agent-工具时递归进子循环,再把子循环的结构化报告回填给主 Agent。
本章聚焦编排的核心节奏。它的上游(配置怎么装配出这些组件)见 01-config-and-assembly;它依赖的容错细节(回滚判定、去重判定、修复模型输出)见 03-robustness-rollback;它收尾时的上下文压缩与答案抽取见 04-context-and-answer;被它调用的**工具本体(MCP 子进程)**见 05-tools-mcp。本章只讲循环本身怎么转。
1. 这是什么(零基础也能懂)
一句话定义: Orchestrator(编排器)是一个"反复让 LLM 出招、执行它要的工具、把结果喂回去"的循环调度器。
它解决什么问题。 单次问答的 LLM 很快就撞墙:它不能上网、不能读文件、记不住几十步之前搜到的东西。深度研究恰恰需要长时间、多步骤地和外部世界交互。Orchestrator 的活儿,就是把"一次对话"拉长成"几百次工具交互"的马拉松,并在这个过程中处理失败、去重、上下文膨胀。
"interactive scaling(交互式扩展)"是它的灵魂。 别的系统靠"把模型调大"或"把 prompt 写长"来提升能力;MiroThinker 靠增加交互次数——同一个模型,允许它多搜几十次、多读几十篇,能力就上去了。这一章讲的循环,就是"交互次数"这个旋钮的底座。
用起来什么样。 上层只调一个入口函数,把任务描述丢进去,拿回三样东西:
# 示意,非源码 —— pipeline 层怎么用 Orchestrator
orchestrator = Orchestrator(main_agent_tool_manager, sub_agent_tool_managers, llm_client, ...)
final_summary, final_boxed_answer, failure_experience = await orchestrator.run_main_agent(
task_description="2024 年图灵奖得主的博士导师是谁?",
task_id="demo",
)
# 内部可能已经跑了几十上百轮 LLM 调用 + 工具执行,你只看到最终结果
真实入口在 core/pipeline.py:35 的 execute_task_pipeline:它建好 TaskLog、llm_client、Orchestrator,然后调 run_main_agent(core/pipeline.py:102-123),最后拿到 (final_summary, final_boxed_answer, failure_experience_summary)。
一句话直觉: 把 Orchestrator 想成一台"打怪循环"——每回合(turn)LLM 说"我要用这个工具",引擎替它按下按钮、把结果递回去,直到 LLM 说"我知道答案了"或回合用尽。