agent面试必备31- AI Agent 核心进阶:工具路由(Tool Routing)
🚦 AI Agent 核心进阶:工具路由(Tool Routing)全解析与面试通关指南
在开发 AI Agent 时,当你给大模型配备了 3 个工具,它能玩得很溜。但是,当你给它配备了 50 个、100 个工具(比如:查天气、查本地数据库、查实时股票、控制智能家居等)时,大模型就会陷入混乱,不仅经常选错工具,还会消耗极其庞大的 Token 费用。
这就引出了企业级 Agent 架构中极其重要的一环:工具路由(Tool Routing)。
在高级 AI 算法/后端面试中,面试官经常会问:“当工具数量暴增时,系统性能下降怎么解决?” 这篇文章将带你用大白话彻底搞懂工具路由的底层原理、主流方案,并手写一段大厂最爱的“语义路由”实战代码!
💡 一、 什么是工具路由(Tool Routing)?(大白话秒懂)
通俗概念:
想象一下你去一家大型三甲医院看病。如果你直接拉住一个全科老专家(大模型),把你头疼脑热、脚指头发麻的所有症状跟他说一通,让他给你开几十种检查单,不仅老专家会被累死,挂号费(Token 成本)也会极其昂贵。
工具路由(Tool Routing) 就是医院大厅里的**“分诊台护士”**。
当用户提出一个问题时,系统不直接把问题扔给全科大模型,而是先经过“路由器”进行极速分类,判断这个问题应该去哪个“科室”(哪个具体的工具或子 Agent),然后再精准下发任务。
核心收益:
- 大幅降低延迟:避免把所有工具说明书都塞给 LLM。
- 极度节省成本:使用便宜的机制分发请求,按需调用昂贵的 LLM。
- 提升准确率:减少了干扰项,LLM 使用工具的成功率直线上升。
🛤️ 二、 主流的三大路由策略(面试选型必考)
在工业落地时,我们通常有三种实现分诊台(路由器)的方案:
1. 逻辑路由 (LLM Router)
- 机制:写一段 Prompt,把几个大类的工具描述发给一个便宜快速的小模型(比如 GPT-4o-mini 或本地小模型),让小模型来做选择题:“请根据用户问题,返回应该调用的工具名称”。
- 优点:极其聪明,能处理复杂的、带有长上下文逻辑的意图。
- 缺点:依然需要调用模型,有一定延迟和成本。
2. 语义路由 (Semantic Router)
- 机制:不调用生成式大模型!提前把每个工具的“常见提问示例”变成数学向量(Embedding)。当用户提问时,也变成向量,直接计算余弦相似度。谁的距离最近,就路由给谁。
- 优点:极速(毫秒级响应)、零 Token 消耗(如果本地化 Embedding 的话),大厂极其爱用!
- 缺点:只能处理字面和浅层语义,对需要深层推理的问题容易分发错误。
3. 规则/正则路由 (Rule-based Router)
- 机制:用传统的正则表达式或关键词匹配。比如只要识别到“天气”两个字,直接路由到天气 API。
- 优点:绝对可控,100% 准确,速度天下第一。
- 缺点:太死板,维护成百上千个正则规则会让人崩溃。
🌟 面试架构金句:
“在真实的生产环境中,我们通常采用分层路由架构。第一层用正则匹配极高频的特定问题;第二层用 Semantic Router 处理常规业务;如果前两层置信度都很低,最后再让 LLM Router 作为兜底进行复杂意图判断。”
🎯 三、 高频面试 Q&A 实战演练
Q1:如何解决 LLM 在面临过多工具(比如 100 个)时上下文超限或注意力分散的问题?
标准答案:
绝不能把 100 个工具的 Schema 一次性塞进 Prompt。
标准做法是:建立动态工具检索(Dynamic Tool Retrieval)。把 100 个工具的描述进行 Embedding 存入向量数据库。当用户提问时,先通过向量检索找出 Top-5 最相关的工具,然后再将这 5 个工具作为当前对话的可用工具列表塞给 LLM。
Q2:如果用户的提问包含了多个意图,需要用到多个工具怎么办?(比如:“北京天气怎样?顺便帮我查下明天的日程”)
标准答案:
单一的路由机制此时会失效。我们需要在路由之前加入一个**“查询重写与拆分(Query Decomposition)”**节点。利用大模型将原始的复杂 Query 拆分成两个独立的子 Query:“查北京天气”和“查明天日程”。然后再分别将子 Query 送入路由器进行并行工具分发。
💻 四、 面试加分代码:手写一个毫秒级“语义路由器”

在面试中如果能现场写出基于 sentence-transformers 的 Semantic Router,面试官会直接认为你具备资深的落地经验!
# 运行前需安装依赖: pip install sentence-transformers numpy
import numpy as np
from sentence_transformers import SentenceTransformer
# ==========================================
# 1. 定义路由器核心逻辑 (Semantic Router)
# ==========================================
class SemanticRouter:
"""
语义路由器:不调用大模型生成接口,纯靠向量相似度进行毫秒级意图分发。
在工业界常用于节约 Token 成本和降低首字延迟。
"""
def __init__(self, model_name="BAAI/bge-small-zh-v1.5"):
# 1. 加载轻量级的中文字符串转向量模型 (本地运行,极快)
print("正在加载 Embedding 模型...")
self.encoder = SentenceTransformer(model_name)
# 2. 初始化路由表
self.routes = {}
self.route_embeddings = {}
def add_route(self, route_name: str, utterances: list[str]):
"""
向路由器注册科室(工具)。
:param route_name: 路由的名称 (比如 "weather_tool")
:param utterances: 触发该路由的典型用户话术示例
"""
self.routes[route_name] = utterances
# 提前把这些话术示例全部变成向量存起来
# 开启 normalize_embeddings 方便后面用内积直接代替余弦相似度加速计算
self.route_embeddings[route_name] = self.encoder.encode(
utterances, normalize_embeddings=True
)
print(f"✅ 路由 [{route_name}] 注册完成,包含 {len(utterances)} 条触发样本。")
def route_query(self, user_query: str, threshold: float = 0.6) -> str:
"""
对用户的真实提问进行分发
"""
# 将用户提问变成向量
query_vec = self.encoder.encode([user_query], normalize_embeddings=True)[0]
best_route = None
best_score = -1.0
# 遍历所有注册的路由,寻找最高相似度
for route_name, embeddings in self.route_embeddings.items():
# 计算查询向量与该路由下所有样本向量的相似度分数
scores = np.dot(embeddings, query_vec)
max_score = np.max(scores) # 取最相似的那句话的分数
if max_score > best_score:
best_score = max_score
best_route = route_name
# 如果最高分数连我们设定的及格线(threshold)都没达到,说明超出了已知工具范围
if best_score < threshold:
return "chitchat_or_fallback" # 兜底路由:闲聊或人工客服
print(f"🧭 路由命中: [{best_route}] (置信度: {best_score:.4f})")
return best_route
# ==========================================
# 2. 模拟生产环境测试
# ==========================================
if __name__ == "__main__":
router = SemanticRouter()
# -----------------------------------
# 步骤A:注册不同的工具科室与典型问法
# -----------------------------------
router.add_route(
route_name="weather_tool",
utterances=["今天天气怎么样", "北京多少度", "明天会下雨吗", "需要带伞吗"]
)
router.add_route(
route_name="database_sql_tool",
utterances=["查一下上个月的销量", "张三的工资是多少", "统计所有VIP用户的留存率"]
)
router.add_route(
route_name="smart_home_tool",
utterances=["帮我把灯关了", "空调调低两度", "扫地机器人去打扫客厅"]
)
print("\n--- 路由器初始化完成,开始接待用户 ---")
# -----------------------------------
# 步骤B:对真实查询进行路由极速分发
# -----------------------------------
queries = [
"帮我看看深圳今天热不热", # 期望路由到 weather_tool
"提取一季度财务报表数据", # 期望路由到 database_sql_tool
"客厅太亮了,帮我搞暗一点", # 期望路由到 smart_home_tool
"量子力学的基本原理是什么" # 期望触发兜底 (不在任何工具管辖范围内)
]
for q in queries:
print(f"\n👤 提问: {q}")
hit_route = router.route_query(q)
print(f"🚀 系统执行: 正在将请求转发至 -> {hit_route} 处理集群...")
# 💡 面试讲解要点:
# 向面试官解释:“在使用 Semantic Router 时,我们根本不需要调用 OpenAI 的接口,
# 一次意图分发的耗时通常在 10 毫秒以内。只有确定了要把任务分给 `database_sql_tool` 后,
# 我们才把具体的系统表结构和该用户的 Query 一起发给大模型。
# 这样不仅解决了大模型面对几百个工具时的选择困难症,还将整体系统的 Token 消耗压到了最低!”
更多推荐


所有评论(0)