Routine
Paper · arXiv 2507.14447 · 企业智能体

Routine:把专家写好的流程塞进提示词,小模型也能稳跑多步工具调用

通用大模型在企业里最常犯的错不是不会调工具,而是挑错工具:面对 25 个功能相近的工具和一条有依赖关系的多步任务,它既不懂公司流程,也没人给它一张明确的路线图。 Routine 把任务写成「第几步、做什么、用哪个工具」的结构化脚本,交给一个专职执行的小模型;流程知识还可以被蒸馏进权重。

Guancheng Zeng 等 · Digital China AI Research · arXiv v2 (2025-07-22) arXiv 2507.14447 ↗ 无论文代码链接 博客笔记 ↗
TL;DR · 30 秒抓住核心

企业多步任务的瓶颈是工具选择:无 Routine 时所有基线模型整体准确率都不到 50%,工具选择错误占全部错误的 85% 以上。规划能力不够的模型,塞进一张明确路线图就能补齐大半。

Routine 就是那张路线图:每步给出编号、名称、描述、输入输出和唯一一个工具名,分支写成「Branch X-n Step i」。规划与执行解耦——高能力模型把专家草稿整理成 Routine,轻量执行模型只管「调哪个工具、传什么参数」。

三种增强互相叠加:提示词里的 Routine 补外部流程知识,通用 Routine 跟随微调 练服从格式的肌肉记忆,场景蒸馏 把流程知识烘焙进权重。Qwen3-14B 三步走下来 32.6 → 83.3 → 92.7 → 98.0(Routine w/o Branch),在蒸馏测试集上到 95.5%,逼近 GPT-4o 的 96.3%。

96.3 %
GPT-4o + Routine w/ Branch
无 Routine 时 41.1
83.3 %
Qwen3-14B + Routine w/ Branch
无 Routine 时 32.6
98.0 %
Qwen3-14B 场景蒸馏 + w/o Branch
蒸馏测试集上 95.5
01

企业里的多步任务,卡的往往不是推理,而是工具选择

先分清「不会规划」和「不会选工具」——论文的数据说,后者才是主因。

实验场景是一家员工超过 8,000 人的大企业里真实部署的 HR Agent:员工向它查询人员与部门信息。场景拆成 7 个子场景、7 条人工标注的 Routine,每条 4–7 个工具调用步骤,每步 1–3 个输入参数;参数之间有依赖,所以顺序不能乱。可用工具来自一个 MCP server,共 25 个功能各异的工具,覆盖数据查询、权限校验、模型生成等。

不提供任何计划时,模型必须自己从这 25 个工具里选、自己排顺序、自己填参数。论文 Table 2 的结果是:8 个基线模型(4 个闭源、4 个开源)整体准确率没有一个超过 50%。拆开看错误构成,结构错误很少(GPT-4o 的结构准确率是 100),参数准确率也有 97.3,唯独工具选择只有 42.2。

核心判断

85% 以上的错误出在「选哪个工具」

论文明确写道:工具选择错误占全部错误的 85% 以上。也就是说,模型知道怎么输出合法 JSON、知道参数大概该填什么,但它在 25 个工具里挑不出一条正确的调用链——这恰恰是领域流程知识,不是通用推理。

另一层难点是流程本身:权限校验步骤不能漏、模型生成步骤要走专用工具、分支要看中间结果再决定。通用模型没有这些 SOP,规划自然写得七零八落。

于是问题可以写得很具体:能不能把流程知识从规划这一步剥出来,变成一份执行模型必须照做的结构化脚本? 这正是 Routine 要回答的,也是前面几类做法卡住的地方。

02

前三类方案各差一口气:太自由、太中间、太贵

论文 Related Work 把 2023–2025 年的智能体实践归纳成这样几路,Routine 瞄准的是它们的交汇处。

第一波

完全自主

AutoGPT 的任务列表、BabyAGI 的自动目标生成、AutoGen 的工具调用 DAG。证明了 LLM 能自主拆解与编排,但暴露出上下文管理低效、执行流程碎片化、步骤爆炸和循环调用导致的成本波动。

第二波

plan-then-act

先出高层计划、再逐子任务选工具,例如 Manus 的 Planner / Executor / Verifier 三段式。保留了灵活性也约束了规划,但计划仍以非结构化或半结构化自然语言呈现,难以校验、调试和复用。

替代路

低代码平台

流程天然稳定,但严重依赖人工搭建,工作流开发效率低,难以扩展到成百上千的业务流程;而且工具与模型之间的边界是写死的。

还有一路是「模型侧」的努力:IFEval、ComplexBench、IOPO / TRACE、GuideBench 都在压测指令跟随。论文引用 ComplexBench 的发现——GPT-4 在链式结构与深层嵌套选择上准确率明显下降,结构感知和分布外泛化是短板。单纯加大模型或换更强的 prompt 工程,不能解决「它不知道公司第 3 步要调权限工具」这件事。

Routine 这个名字并非凭空而来:它最早出现在 OpenAI Cookbook,用来把指令拆成更小、可管理的任务以降低幻觉。论文在此基础上补齐了组件(输入输出、工具名、分支房号),并把重心放在「执行模型能不能稳定照做」上——它把 Routine 当作 LLM 规划与执行引擎之间的中间表示。

03

六个组件、一套分支编号:让执行模型知道自己「现在在哪一步」

Routine 的全部「方法」就是一份格式约定;它的价值在于把这几个字段位置固定死,让每一步都能被追踪与校验。

Table 1 列出一个完整 Routine 的组件,带 * 的是可选项:

组件含义必填
Step Number该步骤在主流程中的序号是
Step Name步骤目的的精简概括是
Step Description详细指令、执行条件与目标是
Input Description执行本步所需参数说明可选 *
Output Description成功执行后产生的输出参数可选 *
Step Tool本步对应的函数工具,每步只调一个可选 *

Table 1 · Routine 的组件。工具名标成可选,但消融(Table 3)显示去掉它几乎全员掉点:GPT-4o 是唯一例外(96.3 → 96.7)。

分支不是另起一张表,而是编号

相似场景的 Routine 常有重叠步骤,只在某一段分叉。论文的做法是在主流程里开分支步骤,用 Branch X-n Step i 命名——第 X 个主步骤的第 n 条分支里的第 i 步。执行模型据此判断自己在哪条分支、走到第几步;工作流在某步结束后要以「终止」描述出来。修改流程时,开发者可以快速插入、删除或编辑某一步。

Step X. <条件检查>:   Branch X-1 Step 1. <名称> — 若 <条件>,用 <工具> 执行 <描述>
  Branch X-2 Step 1. <名称> — 若 <另一条件>,用 <工具> 执行 <描述>
Step Y. <名称> — <描述>,用 <工具>   Step Z. <名称> — <描述>,用 <工具>,终止工作流
论文 §3.1.1 给出的分支写法;Appendix B.1 是一条 4 步的自然语言 Routine 实例(获取公告 → 下载手册 → 读 PDF → 比对文本)

自然语言 Routine 只是外显形式。Appendix A.1 的生成 prompt 让规划模型先输出 JSON 列表(step / name / description / tool / type,type 取 node、branch、branchnode 或 finish),再转写成人可读的执行步骤。同一条 Routine 有两种形态,前者便于机器校验与入库,后者交给人审和模型阅读。

另一处结构性设计是「谁来收尾」:最后一步不让执行模型自己用自然语言回答,而是调用一个专用的汇总工具,该工具配有场景专属模板。这样汇总 prompt 与工具调用 prompt 互不干扰,执行模型始终只做一件事。

04

两条训练管线叠加:练「照做」,再把流程烘焙进权重

Routine 是外部提示;要让小模型即使没有提示也稳,还需要数据合成与蒸馏。

管线一:通用 Routine 跟随(练格式)

底料是 BUTTON 开源数据集:8,000 条单轮多步工具调用实例,覆盖多种常见任务。用 GPT-4o 按专门模板为每条实例生成结构化 Routine,再按标准执行 prompt 重新拼系统提示,随后做三步过滤:

过滤后留下 4,209 条。这一步只教模型「读懂 Routine 语法并照做」,不教任何 HR 场景知识。

管线二:场景蒸馏(把流程写进权重)

对 10 个无分支子场景各设计 5–6 个用户查询模板,用部门与员工信息填空,每个子场景约 50–60 条;清洗后得到 537 条用户查询,再用 LLM 生成语义等价的改写做数据增强。然后由 GPT-4o + Routine 作教师,对每一条蒸馏出完整的多步调用记录:每条 4–7 步,共 3,108 条标注的工具调用指令。另蒸馏 200 条用户查询(共 1,148 次工具调用)作为测试集。

教师执行时,Routine 在系统提示的 <routines> 标签里;工具返回的长结果不进上下文,只留一个键,由 <variables> 记账(见 05 节的变量内存)。学生模型因此看到的每条轨迹都是「专家流程 + 强模型执行」的干净样本。

微调配置:LoRA,四张 A10

项设置出处
训练框架LLaMA-Factory + DeepSpeed ZeRO-3 + Flash Attention-2§4.3.2
硬件4 × NVIDIA A10(各 24GB)§4.3.2
LoRA rank8§4.3.2
batch / 梯度累积每卡 1 条 × 4 步 = 有效 batch 16§4.3.2
学习率 / warm-up1.0e-4 / 0.1§4.3.2
采样 checkpoint按验证集选 epoch 3§4.3.2
特殊 token<routines>、<variables> 等注册进词表§4.3.1

Qwen3 系列训练时没有开启推理模式:目标是跟随 Routine,不需要用 thinking 去推工具调用,省下推理 token。序列长度被调到超过实际输入长度,避免预处理时截断多步调用链。

评测:BFCL 的 AST 三级判定

所有模型用 Berkeley Function-Calling Leaderboard(BFCL)的 FC 模式,按 AST 层级判定错误,再把 1,148 条样本拆成逐步的独立测试样本(每条带截至当前步的历史与当时的最新系统提示),并打乱工具列表顺序以排除位置偏置。三种配置对应 Routine 的有无与是否带分支:

No Routine

只给用户查询,模型自己规划。基线。

Routine w/o Branch

给一条线性自然语言 Routine,考验指令跟随。

Routine w/ Branch

同一 Routine 但含条件分支,考验按中间结果选路。

评测用的 Routine 只含编号、名称、描述、工具四件,不含输入输出描述;组件影响见 06 节 Table 3。整体准确率 = 所有步骤结构、工具、参数全部正确的样本比例,是最严的口径。

05

四个模块围着一个 Routine 转:规划写、记忆取、执行调、工具答

论文 Figure 2 的系统架构中,只有执行模块直接接触用户任务;另外两个「取巧」的地方是程序内存与变量内存。

离线 · Routine 生产 在线 · 每次用户任务 规划模块 · 大模型 专家草稿 + 生成模板 拆子步骤 → 映射工具 → 结构化 Routine 程序内存 Routine 库(长期) 按「Routine 描述 ↔ 查询」 相似度检索 HR 用户查询 + 系统参数(如 user ID) 召回 1 条 执行模块 · 小模型 只做:调哪个工具、传什么参数 系统提示四块: role · <routines> · <variables> · tools 一次只输出一个 tool_call 变量内存 长参数 → 存库,上下文只留键 非持久,仅服务当前任务 工具模块 · MCP Server 25 个工具:数据查询 / 权限校验 / 模型生成 / 汇总 tool_call observation 长结果 → 变量键 汇总工具 场景专属模板 → 最终回答给用户 最后一步
图 1:Routine 智能体系统的数据流(按论文 Figure 2 重绘)。青灰 = 外部工具,紫 = 两类内存,陶土红 = 系统核心的执行模块;虚线由用户直连汇总工具,因为执行模型本身不生成自然语言回答。
展开说明 ▸
  • 为什么规划离线、执行在线? Routine 的生成与优化是低频、重推理的工作,由领域专家给草稿、大模型整理;部署前 Routine 就写好并入库。运行时执行模块只需在固定路线上逐步选工具,高频但轻量。
  • 程序内存解决的是「选哪条 Routine」。 文库里有多个子场景的 Routine,全部塞进系统提示会推高推理成本并引入无关信息;系统按 Routine 描述与用户任务做相似度计算,只取出匹配的一条。论文没有公布相似度计算的细节与召回率。
  • 变量内存解决的是「参数太长」。 工具返回长文本时系统自动存库,模型在参数里只写对应的键,Memory Module 在真正调用前把键还原成值。它让上下文变短、token 变少,也减少了小模型在括号、引号、转义字符上的语法错误。
  • 为什么不让执行模型自己回答? 执行模型的 prompt 被工具调用指令占据;如果它还要生成总结,两套模板会互相干扰。交给专用汇总工具后,输出质量由汇总模板单独控制。
  • MCP 的作用是把「怎么调」标准化。 工具的名称、参数类型、调用约束由协议统一描述,执行模块不必管理实现细节,新增工具或接入新系统不会改变执行逻辑,这让系统可扩展,也让执行模型只回答两个问题:调哪个、传什么。

自己动手:一条 5 步 Routine,看「丢工具名」和「长参数收进变量内存」分别伤在哪

下面是论文 Appendix B 的示例思路改写成的 5 步 Routine(获取公告 → 下载手册 → 读 PDF → 比对文本 → 汇总),4 个工具 + 1 个汇总工具。系统提示里的块数按下面开关变化;点任一步,看执行模型在该步的系统提示里还剩下什么。

执行模型在本步看到的系统提示(Routine 只列已走到与当前步)
这一帧的上下文账单
当前选中

点击下方步骤卡切换当前步;切换上方模式会保留选中的步骤,便于对比同一步在三种配置下的账单。

这个模拟简化了什么?点开看与真实实验的差异

示例流程取自论文 Appendix B 的 4 步自然语言 Routine(获取公告、下载手册、读 PDF、比对文本),页面多加了一个「生成公告摘要」步骤来演示变量内存的键。真实场景每条 Routine 4–7 步。

「上下文账单」是估算,不是论文数字:基线 3,000 token(角色规则 + 25 个工具描述 + 输出模板),Routine 每步约 9 token,变量键约 8 token,PDF 全文按 20k token、模型自写汇总按 1.2k token 计。论文明说减少 token 消耗,但没有报告这条流程的具体数字,所以页面只比较同一帧下三种模式的相对差值,并随当前步变化。

「丢掉工具名」几乎不省长度,但 Table 3 里它是单点掉分最大的改动(GPT-3.5 52.7 → 42.8,Qwen3-14B 83.3 → 71.9):去掉的是信息,不是 token。GPT-4o 是唯一不受影响的模型(96.3 → 96.7)。

真实系统里变量内存由 Memory Module 在工具调用前后自动读写,执行模型只看到 memory_xxx 这样的键;模拟里把这一步显式画出来,方便看懂「长文本从哪里离开上下文」。

图里还有一条容易被忽略的线:Procedure Memory 的检索精度是整条链路的前提。论文 Table 5 显示,哪怕只多放 1 条干扰 Routine,GPT-4o 的准确率就从 96.3 掉到 76.6,Qwen3-14B 从 83.3 掉到 63.2——这一点放到 07 节展开。

06

同一张路线图,四种模型的提升方向完全不同

Table 2 最重要的不是「都涨了」,而是谁涨、涨在哪、什么时候反而没涨。

No Routine Routine w/ Branch Routine w/o Branch

四个观察,分别对应四类模型:

完整 Table 2:8 个模型 × 3 种配置 × 4 个指标加训练变体共 16 行
模型训练数据 No Routine Routine w/ Branch Routine w/o Branch
结构工具参数整体 结构工具参数整体 结构工具参数整体
GPT-3.5-Turbo—99.826.095.322.199.853.898.252.799.959.798.158.5
GPT-4-Turbo—10044.697.543.510099.199.899.010098.799.698.3
GPT-4o—10042.297.341.110096.399.996.310097.099.997.0
Claude-3.7-Sonnet—97.746.596.643.910099.799.799.399.299.699.398.0
Qwen2.5-7B—99.715.695.514.998.651.498.149.798.557.998.656.3
Qwen2.5-14B—99.320.396.519.497.883.496.979.198.482.797.279.2
Qwen3-8B—99.237.395.335.399.283.997.681.399.084.896.881.3
Qwen3-14B—94.136.594.932.696.088.398.383.397.087.898.283.6
Qwen2.5-7BCommon93.625.195.222.497.689.098.685.796.990.798.786.8
Qwen2.5-14BCommon91.134.698.130.997.290.098.486.197.694.398.890.9
Qwen3-8BCommon95.326.393.423.496.388.397.282.897.494.497.289.3
Qwen3-14BCommon97.335.197.233.298.292.097.788.299.094.898.892.7
Qwen2.5-7BScenario99.788.899.187.899.794.199.793.599.795.299.594.4
Qwen2.5-14BScenario99.888.199.487.510097.999.697.599.898.499.898.1
Qwen3-8BScenario10089.499.488.999.894.499.393.699.996.999.396.2
Qwen3-14BScenario99.790.999.490.299.795.999.995.599.798.399.998.0

Table 2 原表逐格录入。Common = 4,209 条通用 Routine 跟随数据微调;Scenario = 537 条场景蒸馏数据微调。「整体」要求结构、工具、参数三步全部正确;工具准确率只在结构正确的子集上算,参数准确率只在结构 + 工具都正确的子集上算,所以三者不能相乘回整体。

消融一:工具名是 Routine 里最硬的字段

在带分支 Routine 上逐个拆组件(Table 3),去掉工具名对多数模型是 5–15 个百分点的打击;加输入输出描述则对中等模型帮助最大。

模型Baseline Routine+ I/O 参数描述去掉工具名
GPT-3.5-Turbo52.761.142.8
GPT-4o96.397.596.7
Qwen2.5-7B49.760.643.7
Qwen2.5-14B79.184.269.5
Qwen3-8B81.381.376.7
Qwen3-14B83.381.571.9

Table 3 原表。GPT-4o 去掉工具名反而高 0.4 分,论文视为语义理解能力的个例;Qwen3 系列对 I/O 描述几乎不敏感,Qwen3-14B 甚至下降 1.8 分,论文猜测多余的描述会干扰模型。

消融二:AI 优化的 Routine 已经够用,但强模型仍吃人工细节

模型User DraftAI OptimizationHuman Annotation
GPT-3.5-Turbo42.652.952.7
GPT-4o71.290.996.3
Qwen2.5-7B46.650.449.7
Qwen2.5-14B61.782.379.1
Qwen3-8B70.473.881.3
Qwen3-14B70.976.783.3

Table 4 原表。用户草稿虽粗糙仍优于自主规划(GPT-4o 41.1 → 71.2);AI 优化把 Qwen2.5-14B、GPT-3.5 拉到略高于人工标注。论文建议线上仍保留专家终审。

消融三:多给一条干扰 Routine,强模型掉得最多

模型1 条(基线)2 条3 条5 条
GPT-3.5-Turbo52.753.654.760.0
GPT-4o96.376.680.188.6
Qwen2.5-7B49.745.145.054.4
Qwen2.5-14B79.155.860.771.3
Qwen3-8B81.366.066.972.2
Qwen3-14B83.363.267.279.9

Table 5 原表。只有一条适用、其余为干扰,顺序随机打乱。论文的解释:2–3 条冲突 Routine 时模型会试图把它们拼在一起;条数再多,模型才转向「选一条」的机制,所以准确率回升。

07

Routine 买的是确定性,账单写在「谁写流程」和「流程会变」上

适用边界几乎全部由论文自己的消融和局限节给出,不靠推演。

边界一

流程仍要靠人起草,新工具一上就泛化不了

论文 §6 明确承认:目前的规划模型主要依赖领域专家提供的草稿生成 Routine,执行模型主要靠指令微调与蒸馏适配。企业一旦引入新工具或流程变更,系统对新情况的泛化能力受限,自主性与适应性仍有提升空间。蒸馏带来的「无 Routine 也行」只对训过的场景成立。

边界二

程序内存的检索精度决定上限

Table 5 里,穷模型加一条干扰几乎不掉,强模型却从 96.3 掉到 76.6。原因是强模型本来能利用单一 Routine 的每一处细节,一旦上下文中出现另一条相似流程,它会被带偏。这对 Procedure Memory 提出了很高的精度要求,而论文并没有公开相似度检索的实现细节与召回表现。

边界三

分支不是白送的

对 GPT-4o、Claude-3.7、GPT-4-Turbo 这类强模型,带分支普遍低于线性(96.3 vs 97.0,99.3 vs 98.0,99.0 vs 98.3)。论文的结论是:分支逻辑应该建立在模型已有稳定工具调用能力的基础上,否则「先判断、再选路」会额外引入误差。7 条 Routine 中有 3 条带分支,拆开后可表示成 10 条无分支流程。

边界四

一个场景、一种语言、一个教师

全部实验都在一个企业 HR 场景、中文、GPT-4o 作教师。535 条蒸馏样本覆盖 10 个无分支子场景,训练只用 4 张 A10(24GB),LoRA 选择 epoch 3 按验证集定。换成流程更开放、工具接口更不规整的领域,或者换教师模型,论文没有给出可以直接外推的数字。

什么时候别用 Routine

论文自己给出的下一步是两条:把 RL 框架接进工作流(含数据蒸馏与奖励建模),让规划模型学会生成 Routine、执行模型学会调工具,用指令微调冷启动再 RL 提升泛化;以及以 Routine 为中心的多智能体框架,由上层智能体协调多个专职智能体,用结构化 Routine 流与集中式交互协议降低每条计划的复杂度。一句话:Routine 解决的是「已知流程的稳定执行」,不是「未知流程的自动发现」。