LLM智能路由实践:通过 Harness 工程节约模型成本的重点在于把前置条件、操作顺序和容易误判的地方分清楚。
很多 Agent 系统把模型选择交给用户:在发起任务前,用户先从模型列表中挑选一个模型。
问题在于,用户通常只能形成关于模型能力的模糊认知,很难准确判断某个任务的复杂度,也很难知道不同模型的能力边界。面对不确定性,最自然、也最常见的选择就是“一股脑选最好的模型”:简单问答如此,大规模重构也如此。这个方案看似稳妥,但它把四个问题混在了一起:
这套方案的设计思路就是增加一个独立的路由层。这个路由层不是孤立的模块,而是整个 Agent Harness 工程的第一环——Harness 的职责是约束 Agent 的执行过程,让模型调用从"自由发挥"变成"受控执行":
这里的设计不是“多了一个模型调用”,而是把模型选择从业务执行中抽离出来——Router 不负责完成用户任务,它只回答一个问题:
这是一种典型的入口分诊,也是 Agent Harness 工程的第一道控制闸门。Harness 工程的核心思想是:模型能力本身不是银弹,真正决定 Agent 执行质量的是"在什么场景下、用多强的模型、以什么策略去生成"这三者的匹配度。智能路由就是负责前两者的 Harness 组件。
Harness 工程的第一步,是把"选模型"这件事从用户手里收回到平台手里。具体做法是建立三档模型能力档位,由路由模型在入口处做分诊。
SessionModelRouter的配置核心结构大致如下:
{"model":{"router":{"base_url":"...","model":"router-model","api_key":"..."},"low":{"model":"small-model"},"mid":{"model":"general-model"},"high":{"model":"strong-model"}}}
router是负责分类的模型,low、mid、high是真正执行任务的业务模型。每个档位都可以使用独立的base_url、api_key和模型名。一个档位还可以配置多个 endpoint,系统会通过 endpoint pool 做轮询选择,形成简单的负载均衡和多来源接入能力。
因此,路由的执行调用路径就变成如下:
路由提示词并不是按照“问题字数”简单分类,而是按照任务是否需要工具、上下文、推理和风险控制来判断。
| 档位 | 主要场景 | 典型例子 | 核心特点 |
|---|---|---|---|
low | 真正简单、独立、单轮的任务 | 简短翻译、基础问答、简单改写、一次性查询 | 不需要工具,不依赖上下文,成本最低 |
mid | 普通 Agent 工作 | 常规编码、调试、文件编辑、多步分析、工具调用、MCP/CLI/知识库查询 | 系统的通用工作档 |
high | 复杂、高风险、需要强推理的任务 | 架构设计、大规模重构、长上下文综合、多文件高风险修改、复杂算法、Skill/Workflow 编排 | 用更强模型换取更高的完成可靠性 |
有两个规则非常关键:
mid。在low和mid之间拿不准时,选择mid,避免因为过度节省而让任务落到能力不足的模型。路由模型的职责是分类,不是创作。因此调用 Router 时固定使用temperature=0,让分诊结果尽可能稳定。
同时,Router 并不会收到完整的 Agent 历史和所有工具消息,会对输入做压缩:
user/assistant纯文本消息;tool_calls的消息;tier,帮助短追问保持路由连续性。这是一项很实际的工程取舍:Router 只需要理解任务,不需要重放整个 Agent 执行现场,它的上下文越小,路由开销和延迟越可控。
Harness 工程的一个关键原则是:执行策略一旦确定,就要在本轮内保持稳定。系统不是每调用一次 LLM 就重新选择一次模型,而是在本轮任务调用一次路由决策,决策包含如下信息:
selected_model:本轮业务模型;selected_provider:本轮业务 provider;tier:low、mid、high;source:路由模型、强制档位、默认回退或错误回退;confidence、reason:路由模型给出的判断信息;temperature:第二阶段加入的本轮采样参数。模型选择被确定后,会沿着这条链路传递:
这条”冻结”语义很重要:假设一个任务第一轮判断为high,后面它连续调用 5 次工具,模型不应该因为某一轮文本突然变短,就在中途悄悄切到low——一次任务的模型能力应该稳定,否则执行轨迹会出现不可解释的抖动。这正是 Harness 工程区别于”简单路由”的地方:Harness 不只决定用哪个模型,还负责保证这个决策在整轮执行中不被破坏。
如果说第一阶段是 Harness 工程在”模型能力”维度上的约束,那第二阶段就是在”生成策略”维度上的补充。
第一阶段解决了“用什么能力的模型”,但它仍然没有回答另一个问题:
例如:
所以第二阶段把路由决策从一个维度扩展成两个正交维度:
模型能力:tierlow / mid / high采样策略:temperature确定性 ───────────── 发散性
路由提示词明确要求:temperature与tier独立判断。
推荐的语义区间是:
| temperature | 输出倾向 | 适合场景 |
|---|---|---|
0.0–0.2 | 精确、稳定、低发散 | 代码修改、调试、工具编排、事实查询、结构化输出 |
0.3–0.5 | 默认平衡 | 普通问答、常规分析、正常执行 |
0.6–0.9 | 发散、开放、多样 | 头脑风暴、创意写作、多方案生成 |
注意,复杂度和发散度不是同一回事:
high档的架构设计任务,可能需要temperature=0.1,因为它要求严谨;low或mid模型,但可以使用temperature=0.8,因为它希望多给一些创意。因此,以下组合是合理的:
| 任务 | tier | temperature |
|---|---|---|
| 把一句话翻译成英文 | low | 0.1–0.3 |
| 修复一个函数的 bug | mid | 0.1–0.2 |
| 设计一个高风险系统架构 | high | 0.1–0.3 |
| 头脑风暴十个产品名 | low/mid | 0.7–0.9 |
当前实现已经把temperature接入了完整的 turn 链路:
子 Agent 不是一个与父任务无关的新会话,它往往是父 Agent 在本轮执行中通过spawn拆出来的子任务。
因此SubagentManager会在 spawn 时冻结三元组:
父任务如果使用temperature=0.15做精确代码修改,子 Agent 也必须保持相同的生成策略。否则就会出现:父 Agent 在严格执行,子 Agent 却以较高随机性生成工具参数或修改建议,最终把不稳定性重新引入 Harness。
这也是”按 turn 冻结”比”按调用动态变化”更适合 Agent 的原因:同一任务的主 Agent、工具 roundtrip 和子 Agent,应该共享一个可解释的执行策略。这背后是 Harness 工程的一致性原则——Harness 不只约束单次调用,而是约束整条执行链路的策略一致性。
如下是 5–6 月 30 天使用的 token 总量:
如下是 6–7 月 30 天使用的 token 总量:
对比结论: token 使用量提升了 3 倍,费用支出减少了 20%。另外从后台数据来看,同一轮对话的质量也同步提升,并未退化。
费用降了,质量会不会跟着掉?这是最自然的问题。我们在 Agent 测试集上做了对比:
claude-opus-4.8low档使用deepseek-v4-pro,mid档使用glm-5.2或claude-sonnet-5,high档使用claude-opus-4.8在开源测试集上,路由方案的准确率相比全量 opus 只下降了 2%–5%,落在了可接受范围以内。考虑到费用节省 20% 的收益,这个精度损失是值得的。换句话说:
这套智能路由经历了一个很自然的演进:
第一阶段的价值是成本和能力匹配:简单任务不要浪费高能力模型,复杂任务不要冒险使用能力不足的模型。
第二阶段的价值是执行策略和任务目标匹配:代码、调试和工具编排需要确定性,创意写作和头脑风暴需要发散性。
最终,一个成熟的 Agent 系统不应该只有一个”最强模型”按钮,而应该具备一套可观察、可降级、可复现的决策机制——这正是 Harness 工程的目标。智能路由是其中负责模型调用的切面,它和工具约束、上下文管理、执行回退等机制共同构成了完整的 Harness:
tier选择合适的模型能力;temperature控制本次输出的确定性;llm_usage和路由 metadata 验证到底省了多少 token、提升了多少成功率。Harness 工程的本质,不是让每个请求都变得更聪明,而是让每个请求都用刚刚好的能力、刚刚好的随机性,在受控的执行框架内完成刚刚好的工作。