随着 Agent 能力迭代,单一 ReAct、Plan-and-Execute 范式已经无法满足复杂生产需求。当系统内沉淀数十上百种工具、技能、业务流程后,会出现技能冲突、意图误判、Token 浪费、调度混乱 等致命问题。而 Router-Skill(路由-技能)架构 就是工业界解决"多技能治理、精准任务分发、专人专事"的终极落地范式,也是所有商业化 AI 垂直产品、企业智能体平台的底层标配。 概念界定 :Router-Skill 是企业级Agent规模化架构模式 ,而**双阶段路由(检索粗筛+LLM精筛)**是 Router 层的核心工业级实现算法,二者为「架构范式-核心算法」的从属关系。
什么是 Router-Skill 架构?
Router-Skill 是一套分层调度、能力解耦、专人专事 的 Agent 架构。核心逻辑一句话:Router 负责思考"谁来做",Skill 负责"具体做"。
整套架构分为两层核心角色:
Router(全局路由器):中枢调度层。不执行具体业务,只负责意图识别、任务分类、匹配最优技能、分发任务、兜底容错。
Skill(专项技能单元):能力执行层。每个 Skill 是独立、内聚、单一职责的业务模块,如天气查询、数据分析、文案改写、工单处理、代码审计、调研报告。
通俗类比:
Router 如同公司的项目总监 ,不写代码、不做报表,只看需求、判断工种、分配任务; Skill 如同专项工程师,每个人只深耕自己的领域,专一、高效、专业,互不干扰。
相比于通用 Agent 一把梭,Router-Skill 实现了:能力原子化、调度中心化、业务隔离化、迭代独立化。
为什么复杂 Agent 必须用 Router-Skill?
很多团队初期只用单一通用 Agent,看似简单,一旦技能数量上涨,会出现四大不可解的工程痛点:
1. 意图混淆,命中率暴跌
当几十种工具、流程全部塞进同一个 Agent 上下文,大模型极易混淆相似技能。例如"文档总结"和"文档润色"、"数据查询"和"数据统计"经常被错误调用,业务稳定性极差。
2. 上下文臃肿,推理退化严重
通用 Agent 需要加载全部技能描述,Prompt 极其臃肿,大量无效技能信息占用上下文,导致有效推理能力下降、Token 成本飙升、响应延迟增高。
3. 能力耦合,迭代无法规模化
所有业务逻辑耦合在一个 Agent 中,新增技能、修改流程、下线工具都需要改动主逻辑,极易引发线上回归问题,无法支持多人并行迭代。
4. 资源浪费,高低负载无法隔离
简单问答、复杂推理、耗时任务混在一起执行,无法做模型分层、资源隔离、并发限流,生产环境极易出现雪崩、排队阻塞。
Router-Skill 核心价值
把「万能 Agent」拆解为「多个专精技能」,彻底解决技能泛滥误判问题
路由层轻量化调度,执行层专一落地,降本、提速、稳准
技能可插拔、可独立迭代、可灰度上线,支撑企业级规模化落地
Router-Skill 五层工业级架构拆解
成熟的生产级 Router-Skill 架构包含五层结构,从用户请求到结果输出完整闭环,绝非简单的"if-else 分发"。
1. 接入层:用户请求入口
统一接收用户自然语言需求、指令、API 请求,完成请求清洗、去重、参数解析、超时配置。
2. Router 调度层(核心中枢)
整套架构的大脑,不执行业务、只做决策 。工业级 Router 采用双阶段路由架构,兼顾速度与精度:
粗筛阶段(检索路由):通过 BM25 关键词检索 + Embedding 向量召回,从海量技能池中快速筛选 Top10 候选技能,规避 LLM 全量遍历的高成本、高延迟问题。
精筛阶段(LLM 路由):大模型基于候选列表、用户意图、技能描述、历史上下文,精准匹配最优 Skill,输出可解释的路由决策。
同时 Router 自带三大核心能力:意图兜底、多技能组合调度、超时重试、路由日志复盘。
3. Skill 技能执行层(能力底座)
每一个 Skill 都是单一职责、高内聚、低耦合的独立模块,标准化规范:
每个 Skill 只负责一类任务(问答、检索、创作、数据分析、流程审批)
自带独立的 Prompt、工具集、执行逻辑、结果校验器
支持独立配置模型、温度、最大生成长度、超时策略
可单独上线、下线、灰度、迭代,不影响全局系统
复杂场景支持技能流水线编排:例如 PlanSkill → ExecuteSkill → ReviewSkill 串行联动,完成复杂长链路任务。
4. 结果校验层
每个 Skill 执行完成后,统一进入校验闭环:校验结果合法性、完整性、是否匹配用户子目标,无报错但结果无效时自动重试或触发二次路由。
5. 结果汇总与复盘层
统一聚合技能执行结果,标准化输出答案;同时记录路由决策日志,持续迭代路由规则与技能描述,形成自优化闭环。
Router-Skill 精准适用场景
该架构不是万能的,工程上需要精准取舍,避免过度设计:
适合使用 Router-Skill 的场景
技能数量多:系统内超过 10+ 工具/业务技能,存在意图混淆风险
任务类型杂:同时包含问答、检索、创作、计算、流程处理等异构任务
需要规模化迭代:团队多人并行开发、持续新增业务能力
对稳定性可控性要求高:需要可审计、可追溯、可复盘的生产系统
存在组合任务:需要多技能串行/并行配合完成复杂需求
不适合使用的场景
极简单功能 Agent(仅查天气、仅问答)
一次性 Demo、轻量化临时脚本
超高响应极致延迟场景(路由会增加极小调度开销)
生产级 Java 伪代码(Router-Skill 完整调度逻辑)
以下代码还原工业级 双阶段路由 + 技能分发 + 结果校验 + 兜底容错 完整流程,贴合 Java 后端工程落地规范,可直接作为架构设计蓝本。
java
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
// ====================== 1. 强类型输入输出契约(标准化Skill调用规范) ======================
/**
* 技能统一入参
*/
class SkillInput {
// 用户原始指令
public String userQuery;
// 当前任务唯一链路ID(可观测性核心)
public String traceId;
// 按需加载的精简上下文(非全量原始上下文)
public Map<String, Object> leanContext;
}
/**
* 技能统一出参
*/
class SkillOutput {
// 执行是否成功
public boolean success;
// 业务结果数据
public Object data;
// 执行日志、异常信息
public String message;
// 耗时
public long latencyMs;
}
// ====================== 2. 路由可观测性实体(生产级溯源能力) ======================
/**
* 路由决策结果(增强可观测、可溯源)
*/
class RouteDecision {
// 链路追踪ID
public String traceId;
// 最终匹配技能ID
public String targetSkillId;
// 路由决策理由(可解释)
public String intentReason;
// 候选技能得分(精筛阶段打分)
public Map<String, Double> candidateScores;
// 路由总耗时
public long routeLatencyMs;
// 是否为降级兜底结果
public boolean isFallback;
}
// ====================== 3. 核心基础组件 ======================
/**
* 技能基础实体(单一职责、标准化注册)
*/
class Skill {
// 技能唯一标识
public String skillId;
// 技能名称与差异化能力描述(无语义重叠)
public String name;
public String description;
// 技能执行优先级
public int priority;
// 是否为兜底默认技能
public boolean isDefaultFallback;
/**
* 强类型执行方法,统一输入输出契约
*/
public SkillOutput execute(SkillInput input);
}
/**
* 上下文压缩器:解决上下文爆炸、Token溢出问题
* 工业级Context Window保护核心机制
*/
class ContextCompactor {
private static final int MAX_CONTEXT_TOKEN = 2000;
/**
* 按需精简上下文:仅保留当前技能所需核心数据,超长自动摘要
*/
public static Map<String, Object> compact(String skillId, Map<String, Object> rawContext) {
// 伪代码:1. 过滤无关冗余数据 2. 超阈值调用轻量模型摘要 3. 返回精简上下文
return rawContext;
}
}
/**
* 结果校验器:基于Schema严格校验,不止判空
*/
class SkillVerifier {
/**
* 基于业务Schema校验结果合法性、完整性、合规性
*/
public static boolean verify(SkillOutput output) {
if (output == null || !output.success || output.data == null) {
return false;
}
// 伪代码:JSON Schema格式校验、业务合规校验、结果有效性校验
return !output.data.toString().isEmpty();
}
}
/**
* 外部检索服务接口(解耦内存遍历,适配ES/Milvus工业级检索引擎)
*/
interface VectorSearchService {
// 向量+关键词混合检索,返回TopK候选技能
List<Skill> search(String query, int topK);
}
// ====================== 4. 技能流水线(多技能组合调度) ======================
/**
* 技能流水线:支持DAG/责任链编排,实现多技能串行联动
* 典型场景:检索技能 -> 分析技能 -> 总结技能
*/
class SkillPipeline {
private final List<Skill> skillChain;
public SkillPipeline(List<Skill> skillChain) {
this.skillChain = skillChain;
}
/**
* 串行流水线执行,上下文逐级透传、持续精简
*/
public SkillOutput executePipeline(SkillInput input) {
SkillOutput lastOutput = null;
Map<String, Object> currentContext = input.leanContext;
for (Skill skill : skillChain) {
SkillInput stepInput = new SkillInput();
stepInput.userQuery = input.userQuery;
stepInput.traceId = input.traceId;
// 每一步执行前压缩上下文,防止累积膨胀
stepInput.leanContext = ContextCompactor.compact(skill.skillId, currentContext);
lastOutput = skill.execute(stepInput);
if (!SkillVerifier.verify(lastOutput)) {
lastOutput.success = false;
lastOutput.message = "流水线子技能执行失败:" + skill.name;
return lastOutput;
}
// 聚合有效结果至上下文
currentContext.put(skill.skillId, lastOutput.data);
}
return lastOutput;
}
}
// ====================== 5. 工业级 Router-Skill 核心调度器 ======================
/**
* 优化点全覆盖:
* 1. 外部检索替代内存遍历 2. 上下文压缩保护 3. 指数退避重试
* 4. 路由降级兜底 5. 完整可观测性 6. 强类型契约 7. 多技能流水线
*/
public class SkillRouterAgent {
// 外部检索服务(解耦业务与检索)
private final VectorSearchService vectorSearchService;
// 技能池
private final List<Skill> skillPool;
// 单技能最大重试次数
private static final int MAX_RETRY = 2;
public SkillRouterAgent(VectorSearchService vectorSearchService, List<Skill> skillPool) {
this.vectorSearchService = vectorSearchService;
this.skillPool = skillPool;
}
public String routeAndExecute(String userQuery) {
long startTime = System.currentTimeMillis();
String traceId = UUID.randomUUID().toString();
// 1. 粗筛:调用外部检索引擎(ES/Milvus),彻底规避内存全量遍历性能问题
List<Skill> candidateSkills = vectorSearchService.search(userQuery, 10);
if (candidateSkills.isEmpty()) {
// 无候选技能,兜底默认技能
Skill fallbackSkill = getDefaultFallbackSkill();
return executeSingleSkill(fallbackSkill, userQuery, traceId, new HashMap<>()).data.toString();
}
// 2. 精筛:LLM精准路由,带降级策略
RouteDecision decision;
try {
decision = llmFineRoute(userQuery, candidateSkills, traceId);
} catch (Exception e) {
// LLM路由超时/异常:优雅降级,取粗筛Top1候选
decision = new RouteDecision();
decision.traceId = traceId;
decision.targetSkillId = candidateSkills.get(0).skillId;
decision.isFallback = true;
decision.intentReason = "LLM精筛失败,降级使用检索Top1结果";
}
// 记录路由日志,实现可观测、可复盘
observabilityLog(decision);
// 3. 匹配目标技能
Skill targetSkill = getSkillById(decision.targetSkillId, candidateSkills);
if (targetSkill == null) {
targetSkill = getDefaultFallbackSkill();
}
// 4. 区分单技能执行 / 流水线组合执行(按需适配)
SkillOutput finalOutput;
// 伪代码:可根据路由决策判定是否需要多技能组合编排
boolean needPipeline = false;
if (needPipeline) {
// 多技能流水线执行
List<Skill> pipelineSkills = getPipelineSkills(decision);
SkillPipeline pipeline = new SkillPipeline(pipelineSkills);
SkillInput input = buildSkillInput(userQuery, traceId, new HashMap<>());
finalOutput = pipeline.executePipeline(input);
} else {
// 单技能执行(带指数退避重试)
finalOutput = executeSingleSkill(targetSkill, userQuery, traceId, new HashMap<>());
}
// 5. 标准化结果返回
return synthesizeResult(userQuery, finalOutput);
}
/**
* 单技能执行 + 指数退避重试机制(解决限流/抖动重试雪崩问题)
*/
private SkillOutput executeSingleSkill(Skill skill, String query, String traceId, Map<String, Object> rawContext) {
int retryCnt = 0;
SkillOutput result = null;
while (retryCnt <= MAX_RETRY) {
try {
// 上下文压缩:执行前裁剪、摘要,保护Context Window
Map<String, Object> leanContext = ContextCompactor.compact(skill.skillId, rawContext);
SkillInput input = buildSkillInput(query, traceId, leanContext);
result = skill.execute(input);
if (SkillVerifier.verify(result)) {
return result;
}
} catch (Exception e) {
// 捕获限流、网络异常,执行指数退避
long backoffMs = (long) (1000 * Math.pow(2, retryCnt));
TimeUnit.MILLISECONDS.sleep(backoffMs);
}
retryCnt++;
}
// 重试耗尽,返回失败结果
result = new SkillOutput();
result.success = false;
result.message = "技能多次重试执行失败";
return result;
}
/**
* 构建标准化技能入参
*/
private SkillInput buildSkillInput(String query, String traceId, Map<String, Object> leanContext) {
SkillInput input = new SkillInput();
input.userQuery = query;
input.traceId = traceId;
input.leanContext = leanContext;
return input;
}
/**
* 第二阶段:LLM精细路由
*/
private RouteDecision llmFineRoute(String query, List<Skill> candidates, String traceId) {
// 伪代码:LLM基于用户意图+技能差异化描述,输出带评分、理由的路由决策
RouteDecision decision = new RouteDecision();
decision.traceId = traceId;
decision.isFallback = false;
return decision;
}
/**
* 路由可观测性日志上报
*/
private void observabilityLog(RouteDecision decision) {
// 伪代码:上报链路ID、决策结果、候选得分、耗时、降级状态至监控平台
}
private Skill getSkillById(String skillId, List<Skill> candidates) {
return candidates.stream()
.filter(s -> s.skillId.equals(skillId))
.findFirst()
.orElse(null);
}
/**
* 获取兜底默认技能(系统永不无输出)
*/
private Skill getDefaultFallbackSkill() {
return skillPool.stream()
.filter(s -> s.isDefaultFallback)
.findFirst()
.orElse(null);
}
/**
* 获取流水线组合技能列表
*/
private List<Skill> getPipelineSkills(RouteDecision decision) {
// 伪代码:根据路由决策匹配预设技能编排链路
return new ArrayList<>();
}
private String synthesizeResult(String query, SkillOutput result) {
return result.success ? String.valueOf(result.data) : result.message;
}
}
Router-Skill 工程落地六大避坑指南
搭建 Router-Skill 架构后依然命中率低、频繁报错,核心是忽略了以下生产级细节:
1. 禁止纯 LLM 全量路由(性能灾难)
技能池超过 10 个后,绝对不能让 LLM 一次性读取全部技能描述。必须采用召回+精筛双阶段,先检索缩小范围,再 LLM 精准决策,否则 Token 和延迟会指数级爆炸。
2. 技能必须严格单一职责
模糊、重叠、多职责的 Skill 是路由误判的根源。每个技能只做一件事,技能描述必须清晰、差异化、无重叠,从根源降低混淆概率。
3. 路由决策必须可解释、可溯源
生产路由不能黑盒,每一次分发必须记录:用户意图、候选技能、决策理由、执行结果。用于离线复盘、规则迭代、问题定位。
4. 区分简单规则路由与复杂语义路由
简单固定意图(查天气、查时间)走关键词/正则规则 ,零成本极速响应;复杂模糊意图走LLM 语义路由,兼顾灵活性与稳定性。
5. 技能执行必须带结果校验闭环
不能只捕获异常,必须校验业务结果。大量线上问题都是"无报错但结果无效",校验层是生产稳定性的核心兜底。6. 支持技能流水线与组合调度
6. 支持技能流水线与组合调度
复杂任务不能只单技能执行,Router 需要支持顺序编排、依赖调度、并行执行,实现多技能流水线联动,适配复杂业务流程。工业级实现需基于 DAG/责任链模式,实现技能串行组合执行、上下文逐级透传,解决单一技能无法承载的长链路复杂任务。
7. 严控技能语义重叠(前置精准度保障)
路由误判的核心前置原因是技能描述语义重叠、边界模糊。技能注册阶段必须增加人工+自动化审核机制,保证每个Skill的能力描述差异化、职责边界清晰,从源头规避LLM路由混淆问题,是高命中率路由的基础前提。
8. 路由优雅降级兜底(系统高可用核心)
双阶段路由存在依赖风险:LLM精筛超时、报错、算力耗尽时,系统不能直接报错。生产级架构必须配置降级策略:LLM路由失效时,自动降级采用检索粗筛Top1结果,或直接路由至通用兜底问答技能,保证系统永远有输出、永不雪崩。
Router-Skill 与 ReAct / Plan-and-Execute 架构关系
三者不是替代关系,而是逐层递进、互补组合的企业级 Agent 完整架构体系:
简单单步任务:ReAct 轻量化执行,高效试错
复杂多步骤任务:Plan-and-Execute 全局规划、分步落地、动态修偏
多技能规模化平台:Router-Skill 统一调度、能力治理、分工解耦
最终企业级组合范式 :Router 做全局调度 → 路由分发 ReAct/Plan 范式 → 专项 Skill 落地执行,构成完整可规模化的智能体系统。
全文总结
Router-Skill 架构的本质,是将 Agent 能力从"大一统黑盒模型"拆分为"可治理、可调度、可迭代、可观测、高可用、低成本"的标准化工程系统。
它解决了 ReAct、Plan-and-Execute 无法解决的技能泛滥、意图混淆、规模化迭代 问题,是所有企业级 AI 平台、垂直智能应用、多技能 Agent 系统的最终架构形态。
如果说 ReAct 让 Agent 会做事、Plan-and-Execute 让 Agent 会做复杂事,那么 Router-Skill 就是让 Agent能规模化、可工程化、稳定持续做事。