agent面试必备31- AI Agent 核心进阶:工具路由(Tool Routing)

📅 2026/7/5 15:00:19
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 作为兜底进行复杂意图判断。” 三、 高频面试 QA 实战演练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 numpyimportnumpyasnpfromsentence_transformersimportSentenceTransformer# # 1. 定义路由器核心逻辑 (Semantic Router)# classSemanticRouter: 语义路由器不调用大模型生成接口纯靠向量相似度进行毫秒级意图分发。 在工业界常用于节约 Token 成本和降低首字延迟。 def__init__(self,model_nameBAAI/bge-small-zh-v1.5):# 1. 加载轻量级的中文字符串转向量模型 (本地运行极快)print(正在加载 Embedding 模型...)self.encoderSentenceTransformer(model_name)# 2. 初始化路由表self.routes{}self.route_embeddings{}defadd_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_embeddingsTrue)print(f✅ 路由 [{route_name}] 注册完成包含{len(utterances)}条触发样本。)defroute_query(self,user_query:str,threshold:float0.6)-str: 对用户的真实提问进行分发 # 将用户提问变成向量query_vecself.encoder.encode([user_query],normalize_embeddingsTrue)[0]best_routeNonebest_score-1.0# 遍历所有注册的路由寻找最高相似度forroute_name,embeddingsinself.route_embeddings.items():# 计算查询向量与该路由下所有样本向量的相似度分数scoresnp.dot(embeddings,query_vec)max_scorenp.max(scores)# 取最相似的那句话的分数ifmax_scorebest_score:best_scoremax_score best_routeroute_name# 如果最高分数连我们设定的及格线(threshold)都没达到说明超出了已知工具范围ifbest_scorethreshold:returnchitchat_or_fallback# 兜底路由闲聊或人工客服print(f 路由命中: [{best_route}] (置信度:{best_score:.4f}))returnbest_route# # 2. 模拟生产环境测试# if__name____main__:routerSemanticRouter()# -----------------------------------# 步骤A注册不同的工具科室与典型问法# -----------------------------------router.add_route(route_nameweather_tool,utterances[今天天气怎么样,北京多少度,明天会下雨吗,需要带伞吗])router.add_route(route_namedatabase_sql_tool,utterances[查一下上个月的销量,张三的工资是多少,统计所有VIP用户的留存率])router.add_route(route_namesmart_home_tool,utterances[帮我把灯关了,空调调低两度,扫地机器人去打扫客厅])print(\n--- 路由器初始化完成开始接待用户 ---)# -----------------------------------# 步骤B对真实查询进行路由极速分发# -----------------------------------queries[帮我看看深圳今天热不热,# 期望路由到 weather_tool提取一季度财务报表数据,# 期望路由到 database_sql_tool客厅太亮了帮我搞暗一点,# 期望路由到 smart_home_tool量子力学的基本原理是什么# 期望触发兜底 (不在任何工具管辖范围内)]forqinqueries:print(f\n 提问:{q})hit_routerouter.route_query(q)print(f 系统执行: 正在将请求转发至 -{hit_route}处理集群...)# 面试讲解要点# 向面试官解释“在使用 Semantic Router 时我们根本不需要调用 OpenAI 的接口# 一次意图分发的耗时通常在 10 毫秒以内。只有确定了要把任务分给 database_sql_tool 后# 我们才把具体的系统表结构和该用户的 Query 一起发给大模型。# 这样不仅解决了大模型面对几百个工具时的选择困难症还将整体系统的 Token 消耗压到了最低”