Agent 工具选择:打分排序机制
多工具场景下基于语义、成本、成功率的打分排序机制设计
原题:在AI Agent系统中,当多个可用工具均可完成同一子任务时,应如何实现工具选择机制?是否需要引入打分、排序或决策模块?请说明设计思路及其实现方式(如基于语义匹配、成本、成功率预测等)。
Agent · 高德真题
回答与解析
核心设计思路
工具选择本质是多目标决策问题,需在功能正确性、成本、时效性间权衡。建议采用**"语义路由 → 候选集生成 → 多维度打分 → 动态决策"**的分层架构。
关键决策维度
| 维度 | 说明 | 数据来源 |
|---|---|---|
| 功能匹配度 | 工具描述与任务需求的语义相似度 | Embedding相似度、LLM判断 |
| 历史成功率 | 该工具对此类任务的完成率 | 执行日志统计 |
| 成本/延迟 | Token消耗、API费用、响应时间 | 实时监控 |
| 当前负载 | 服务可用性、限流状态 | 健康检查接口 |
实现方案
方案一:规则+启发式(冷启动阶段)
候选工具集 → LLM语义匹配Top-K → 按固定优先级排序(成功率>成本>延迟)
方案二:学习式打分模型(有数据后)
- 训练轻量级排序模型(如GBDT或小型NN),输入特征:
- 任务embedding + 工具embedding的交互特征
- 历史成功率、平均耗时、最近错误类型
- 当前上下文(如用户 urgency 标识)
- 输出综合得分,取Top-1或Top-N供重决策
方案三:在线Bandit(探索利用)
- 对不确定的工具组合,保留少量流量做ε-greedy探索
- 实时更新成功率先验,避免固化到次优工具
与Agent架构的协作
- 规划层:ReAct生成子任务时,标注每个任务的必需能力标签
- 选择层:根据标签召回候选工具,执行上述打分流程
- 执行层:工具调用失败时,触发降级策略(换工具或换方案),并回流数据更新打分模型
关键工程点:工具描述的质量决定语义匹配上限,需维护标准化Schema(如OpenAPI规范+自然语言说明)。
学习建议
建议系统学习该知识点
口语版讲法(约4分钟)
- 工具选择的本质是多目标决策
- 分层架构:语义路由到候选集,再到打分排序
- 具体实现:规则冷启动、学习模型、Bandit探索
- 落地风险和前提条件
- 给出可延伸点:工具描述质量决定上限
这道题其实问的是,当多个工具都能干同一件事的时候,怎么选才是最优的。本质上是个多目标决策问题,要在功能正确、成本、时效性之间取一个平衡。我不会只用一个单一策略,而是倾向于分层架构:先做语义路由,快速过滤出候选集,再对候选集做多维度打分,最后动态决策。
具体来说,第一步是语义路由。我会给每个工具写一段标准化的自然语言描述,比如一个工具是'查询订单状态',另一个是'查询物流轨迹',用 Embedding 把任务和工具描述都转成向量,算相似度,选出最相关的 Top-K。这一步的目的是快速缩小范围,别让后面的打分模型处理太多无关选项。
第二步是多维度打分。这里我会看几个维度:功能匹配度是基础,历史成功率也很关键,比如某个工具对类似任务的成功率是 95%,另一个只有 70%,那肯定优先选前者。还有成本,包括 Token 消耗、API 费用、响应时间,以及当前负载,比如某个工具正在限流,就得降权。这些维度怎么组合呢?
初期冷启动时,我会用规则加启发式,比如固定优先级排序,成功率优先,成本次之,延迟最后。等积累了一些执行日志,就可以上学习式打分模型了,比如用 GBDT 或者小型神经网络,输入任务和工具的交互特征、历史指标、当前上下文,输出一个综合得分,取 Top-1。另外,为了应对不确定性,我还会保留一小部分流量做在线 Bandit 探索,用 ε-greedy 策略,避免长期固化到次优工具。
举个例子,在客服退款场景里,用户说'我买的东西降价了,能不能退差价'。这个任务可能同时匹配两个工具:一个叫'申请价格保护',另一个叫'发起售后工单'。语义路由会把两者都拉进候选集,然后打分模型一看:价格保护工具的历史成功率是 92%,平均耗时 2 秒,成本低;售后工单成功率 85%,但需要人工审核,耗时 10 分钟。系统就会优先选价格保护。如果价格保护调用失败,再降级到售后工单,并记录失败原因,回流数据更新模型。
这里有个坑:工具描述的质量直接决定语义路由的上限。如果描述写得模糊或者有歧义,比如把'查询订单'和'查询物流'写成一个意思,那第一步就歪了。所以我上线前会花精力维护标准化的工具 Schema,参照 OpenAPI 规范,配上自然语言说明,并且定期用测试用例验证召回率。另一个风险是数据稀疏,新工具上线时没有历史数据,打分模型会失效。我的做法是给新工具一个初始权重,比如假定成功率为 50%,然后靠 Bandit 快速收集数据。
说到这,还有一个延伸点值得注意:当工具数量特别多,比如几百个时,语义路由的召回效率会下降,这时候可能需要引入分层索引或者用 ReAct 让 LLM 自己做工具选择,而不仅仅是打分。这个边界怎么划,我其实还在思考。
所以,我更倾向于把工具选择看作一个持续优化的过程,不是一次定死的规则。核心是保证功能正确的前提下,用数据驱动的方式不断调优,同时做好降级兜底。
关键一句:当工具数量极大时,语义路由效率下降,可能需要引入分层索引或让LLM自主选择工具,而非纯打分机制。
面试官还可能这样问
- 问法 1 · 场景切入
我看你做过智能客服。假设用户问“查一下订单”,系统里同时有“查询订单API”和“查询物流API”都能用,你怎么决定调哪个?是不是得加个决策模块?
- 问法 2 · 层层追问
Agent系统里多个工具都能完成同一个子任务时,你一般怎么选工具?……靠语义匹配够么?……那如果成本差很多或者有些工具老失败呢,要不要引入打分排序?……具体怎么设计?
- 问法 3 · 直球架构
现在要你设计一个动态工具选择模块,当多个工具都能完成同一子任务时,基于功能匹配、成本、历史成功率等多维度打分排序。说说你的整体架构和关键实现。